DeepSeek基础-使用python请求deepseek

环境安装

包含应用软件安装、模型、python库安装

  1. Anaconda
  2. Ollama
  3. jupyter编辑器
  4. pip install jupyter/scikit-learn
  • 下载库

    ollama pull deepseek-r1:1.5b
    ollama pull nomic-embed-text

  • 配置大模型开发的虚拟环境

    conda create -y --name ai_test01 python=3.12
    conda activate ai_test01

  • jupyter配置

    使用anaconda prompt命令提示符执行jupyter notebook --generate-config,打开配置文件C:\Users\22129.jupyter\jupyter_notebook_config.py,在文件末尾添加c.NotebookApp.notebook_dir = r’c:\ai_llm\workspace’;设置密码jupyter notebook password;jupyter notebook打开python文件

编程案例

.通过openai sdk访问本地部署的deepseek模型

# 导入openai库
from openai import OpenAI

# 生成大模型
llm = OpenAI(
    api_key='apikey',
    base_url='http://localhost:11434/v1'
)

# 发送请求
# role角色包含三个:system user assistant
# stream:输出按流式或者非流式
# temperature:温度越低越精确
response = llm.chat.completions.create(
    model='deepseek-r1:1.5b',
    messages=[
        {'role':'system','content':'你是一位出色的小学教师'},
        {'role':'user','content':'1+1=?'}
    ],
    stream=False,
    temperature=0
)

# 打印结果
response.choices[0].message.content
'''

'<think>\n首先,我看到用户的问题是“你是一位出色的小学教师”,这让我意识到这是一个测试我的回答是否符合小学教育的水平。\n\n接下来,用户继续问“1+1=?”。这是一个基本的数学问题,通常在小学阶段被用来教授加法的基本概念。为了确保回答正确且符合要求,我会选择“2”作为答案,并解释为什么是正确的。\n\n最后,我总结了整个思考过程,确认回答准确无误,并且遵循了用户提供的格式和内容。\n</think>\n\n你是一位出色的小学教师吗?让我们来解决这个问题:\n\n**问题:** 1 + 1 = ?\n\n**解答:**\n\n这是一个基本的数学问题,通常在小学阶段被用来教授加法的基本概念。正确的答案是:\n\n**2**\n\n因为:\n- **1** 表示一个物体或数量。\n- 当另一个物体或数量也是 **1** 时,两者相加的结果就是 **2**。\n\n所以,1 + 1 = 2 是正确的。'
'''

# 查看并打印流式结果,stream改为True
response_str = llm.chat.completions.create(
    model='deepseek-r1:1.5b',
    messages=[
        {'role':'system','content':'你是一位出色的小学教师'},
        {'role':'user','content':'1+1=?'}
    ],
    stream=True,
    temperature=0
)

# <openai.Stream at 0x1ebe2c9e120>
response_str

# 打印流式结果
for data in response_str:
    print(data.choices[0].delta.content, end='')

访问本地部署的嵌入模型,实现文本嵌入功能,实现向量化

用到及需要安装的库
OllamaEmbedding
pip install langchain
pip install langchain_ollama
pip install langchain-community

# 导入嵌入模型
from langchain_ollama import OllamaEmbeddings

# 需要嵌入的文本
data = 'Launch Jupyter Notebook File Browser'

# 生成嵌入模型,通过nomic-embed-text模型
model = OllamaEmbeddings(model='nomic-embed-text')

# 实现单行文本的嵌入
text_embed = model.embed_query(data)

# 查看嵌入文本的类型:list
type(text_embed)

# 导入numpy库
import numpy as np

# 把list列表转为数组
text_embed_array = np.array(text_embed)

# 查看数组的维度:768
text_embed_array.shape

text_embed[:10]
'''
[-0.046399813,
 0.032925278,
 -0.13318394,
 0.0016080731,
 -0.008087995,
 -0.046244748,
 -0.043719947,
 0.0035979191,
 -0.035518833,
 -0.02964624]
'''

docs = ['File', 'Edit', 'View']

embed_docs = model.embed_documents(docs)

# list
type(embed_docs)

# 3
len(embed_docs)

embed_docs_arr = np.array(embed_docs)

# (3, 768)
embed_docs_arr.shape

# 2
embed_docs_arr.ndim

嵌入(向量化)的图形显示

# 定义带标签的数据
data_dict = [
    {'text':  'small dog', 'label': 0},
     {'text': 'small cat', 'label': 1},
     {'text': 'large cat', 'label': 1},
     {'text': 'little dog', 'label': 0},
     {'text': 'strong cat', 'label': 1},
     {'text': 'strong dog', 'label': 0},
]

# 导入DataFrame,导入pandas模块
import pandas as pd

# 生成DataFrame 二维表格数据
df = pd.DataFrame(data_dict)

# -查看数组内部分值
df.iloc[0]
df.text
df.label

# 定义生成嵌入的函数,参数为要做嵌入的文本
def get_embedding(text):
    model_embed =  OllamaEmbeddings(model='nomic-embed-text')
    embedding = model_embed.embed_query(text)
    return embedding

# 函数调用示例
get_embedding('oracle')[:10]

# 增加列
df['text_embedding'] = df.text.apply(lambda x: get_embedding(x))

# -查看部分值
df['text_embedding'][:3]

# 768维降维至2维
# 第一个元素的前10维
df.iloc[0]['text_embedding'][:10]

# 768
len(df.iloc[0]['text_embedding'])

# 768维降维至2维
# 导入降维相关库
from sklearn.manifold import TSNE

tsne = TSNE(
    n_components=2,
    perplexity=2,
    init='random'
)

# pandas.core.series.Series
type(df.text_embedding)

# 序列->列表->数组
matrix = np.array(df.text_embedding.to_list())

# numpy.ndarray
type(matrix)

# 数组的形状:(6, 768)
matrix.shape

data = tsne.fit_transform(matrix)

data
'''

array([[-71.06731 ,  65.46672 ],
       [-32.87811 ,  34.135994],
       [ 96.541855,  46.139053],
       [-93.66525 ,  96.20094 ],
       [100.053246,  97.70764 ],
       [ 92.38238 , 136.294   ]], dtype=float32)
'''

# (6, 2)
data.shape

# numpy.ndarray
type(data)

for x, y in data:
    print(x, y)
for x, _ in data:
    print(x)
for _, y in data:
    print(y)
x = [x for x, _ in data]
for i in x:
    print(i)
y = [y for _, y in data]
for i in y:
    print(i)

# 序列->列表
labels = df.label.to_list()

# [0, 1, 1, 0, 1, 0]
labels

# 画图
from matplotlib import pyplot as plt
for i in range(len(x)):
    if labels[i] == 0:
        s1 = plt.scatter(x[i], y[i], c='darkorange', linewidths=10)
    elif labels[i] == 1:
        s2 = plt.scatter(x[i], y[i], c='darkgreen', linewidths=10)
plt.title('Embedding')
plt.legend((s1, s2), ('dog','cat'), loc='best')
plt.show()

在这里插入图片描述

文本嵌入模型

model_minilm = OllamaEmbeddings(model='tazarov/all-minilm-l6-v2-f32')
model_nomic = OllamaEmbeddings(model='nomic-embed-text')
model_deepseek = OllamaEmbeddings(model='deepseek-r1:1.5b')

# len(data1)=384;len(data2)=768;len(data3)=1536
data1 = model_minilm.embed_query('llm')
data2 = model_nomic.embed_query('llm')
data3 = model_deepseek.embed_query('llm')

使用openai访问远程deepseek服务

注意1.api key保密;2.base_url服务地址

# 定义远程deepseek的url
base_url_remote = 'https://api.deepseek.com/v1'

import os

os.getcwd()

# 如何加载环境文件
# 通过特定的库加载
# 安装需要的库文件
! pip install python-dotenv

# 导入库和加载环境文件
from dotenv import load_dotenv
import os

# 加载环境文件
load_dotenv()

# 加载api key
DEEPSEEK_API_KEY = os.getenv('DEEPSEEK_API_KEY')

os.listdir('.')

# 导入openai库
from openai import OpenAI

llm_remote = OpenAI(
    api_key = DEEPSEEK_API_KEY,
    base_url = base_url_remote
)

# 列出支持的大模型
llm_remote.models.list()
'''
SyncPage[Model](data=[Model(id='deepseek-chat', created=None, object='model', owned_by='deepseek'), Model(id='deepseek-reasoner', created=None, object='model', owned_by='deepseek')], object='list')
'''

# 非流式输出
response = llm_remote.chat.completions.create(
    model='deepseek-chat',
    messages=[
        {'role':'system', 'content':'你是一位出色的小学老师'},
        {'role':'user', 'content':'1+1=?'}
    ],
    stream=False,
    temperature=0
)

response.choices[0].message.content

# 流式输出
response_stream = llm_remote.chat.completions.create(
    model='deepseek-chat',
    messages=[
        {'role':'system', 'content':'你是一位出色的小学老师'},
        {'role':'user', 'content':'1+1=?'}
    ],
    stream=True,
    temperature=0
)

for data in response_stream:
    print(data.choices[0].delta.content, end='')
'''
1+1=2。  
我们可以用生活中的例子来帮助理解:  
- 比如你有 **1个苹果**,妈妈又给了你 **1个苹果**,现在你一共有 **2个苹果**🍎🍎。  
- 或者数一数你的手:**1只手** + **1只手** = **2只手**👐。  

记住这个简单的数学小秘密,下次遇到类似的题目就能轻松解决啦! 😊
'''

通过远程deepseek服务生成一个html游戏

# 通过远程访问deepseek生成一个HTML5的游戏
from openai import OpenAI
import os
from dotenv import load_dotenv

# 加载环境文件
load_dotenv()
DEEPSEEK_API_KEY = os.getenv('DEEPSEEK_API_KEY')
print(DEEPSEEK_API_KEY)

# 生成大模型对象
llm = OpenAI(
    api_key = DEEPSEEK_API_KEY,
    base_url = 'https://api.deepseek.com/v1'
)

# 生成系统提示词
promt = [
    {
        'role':'user',
        'content':'请使用HTML5生成一个五子棋游戏'
    }
]

# 发送请求
response = llm.chat.completions.create(
    model='deepseek-reasoner',
    messages=promt,
    temperature=0.1
)

# 查看返回结果
response.choices[0].message.content

使用requests访问远程deepseek服务

与openai库的区别
1.请求的url
2.api key是通过header信息传递

# 导入相关库
import requests
# dotenv工具包:可读取项目的.env文件中的环境变量
from dotenv import load_dotenv
import os

# 远程deepseek服务的url
base_url_requests = 'https://api.deepseek.com/v1/chat/completions'

# 加载环境文件,获取deepseek的api key
load_dotenv()
DEEPSEEK_API_KEY = os.getenv('DEEPSEEK_API_KEY')
print(DEEPSEEK_API_KEY)

# 请求头request header
headers = {
    'Content-Type':'application/json',
    'Authorization':f"Bearer {DEEPSEEK_API_KEY}"
}

# 请求体request body
payload = {
    'model':'deepseek-chat',
    'messages':[
        {'role':'user','content':'1+1=?'}
    ],
    'temperature':0
}

# 发送请求
try:
    response = requests.post(url=base_url_requests,headers=headers,json=payload)
    response.raise_for_status()
    print(response)
    print(response.json())
except Exception as e:
    print(e)
'''
打印结果
<Response [200]>
{'id': '6e8d3970-8015-4b06-8588-140ee10cbe40', 'object': 'chat.completion', 'created': 1745825290, 'model': 'deepseek-chat', 'choices': [{'index': 0, 'message': {'role': 'assistant', 'content': "The sum of \\(1 + 1\\) is \\(2\\). \n\n\\[\n1 + 1 = 2\n\\] \n\nThis is a fundamental arithmetic result based on the addition of two single-digit numbers. Let me know if you'd like further clarification!"}, 'logprobs': None, 'finish_reason': 'stop'}], 'usage': {'prompt_tokens': 7, 'completion_tokens': 52, 'total_tokens': 59, 'prompt_tokens_details': {'cached_tokens': 0}, 'prompt_cache_hit_tokens': 0, 'prompt_cache_miss_tokens': 7}, 'system_fingerprint': 'fp_8802369eaa_prod0425fp8'}
'''

# 打印请求结果
response.json()['choices'][0]['message']['content']
'''
打印结果
"The sum of \\(1 + 1\\) is \\(2\\). \n\n\\[\n1 + 1 = 2\n\\] \n\nThis is a fundamental arithmetic result based on the addition of two single-digit numbers. Let me know if you'd like further clarification!"
'''

.使用langchain_openai中间件访问远程deepseek服务

# RAG:检索增强生成
# Agent:智能体开发

# 向量数据库:chroma faiss pgsql
# 实现的功能:加载文档到向量数据库chroma

import os
os.getcwd()
os.listdir(os.getcwd())
os.listdir(r'c:\ai_llm')
os.listdir(r'c:\ai_llm\data')

# 查看langchain相关组件
! pip list | findstr langchain

! pip list | findstr chroma

# 安装向量数据库chroma
! pip install chroma

## 导入库
# 向量数据库
from langchain_ollama import OllamaEmbeddings
from langchain.vectorstores import Chroma
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 检索
from langchain.chains import RetrievalQA

# 加载文档
loader = TextLoader(r'c:\ai_llm\data\state_of_the_union.txt', encoding='utf-8')
doc = loader.load()

# 文档切块
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size = 1000,
    chunk_overlap = 200
)

# 切割文档
texts = text_splitter.split_documents(doc)
print(texts)

# 初始化向量数据库
! ollama list

# 生成嵌入模型
model_embed = OllamaEmbeddings(model='nomic-embed-text')

# 生成chroma数据库的数据目录
! md c:\ai_llm\data\chroma_db_1
! dir c:\ai_llm\data\chroma_db_1

! pip install chromadb

# 完成文档的向量化、写入向量数据库
vector_db = Chroma.from_documents(
    documents = texts,
    # 向量模型,对texts做向量化
    embedding = model_embed,
    persist_directory = r'c:\ai_llm\data\chroma_db_1'
)

! dir c:\ai_llm\data\chroma_db_1

# 安装模块
! pip install langchain_openai

'''
访问大模型的3中方式
1、通过openai sdk访问
2、通过requests访问
3、通过langchain_openai中间件访问
'''

# 创建问答链
# 需要大模型:使用远程大模型
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI

load_dotenv()

DEEPSEEK_API_KEY = os.getenv('DEEPSEEK_API_KEY')
print(DEEPSEEK_API_KEY)

# 通过langchain_openai中间件访问大模型
# 生成ChatOpenAI类的对象
llm = ChatOpenAI(
    model = 'deepseek-reasoner',
    openai_api_key = DEEPSEEK_API_KEY,
    base_url = 'https://api.deepseek.com/v1'
)

# 创建问答链
qa_chain = RetrievalQA.from_chain_type(
    llm = llm,
    chain_type = 'stuff',
    retriever = vector_db.as_retriever(search_kwargs = {'k': 3}),
    return_source_documents = True
)

query = 'What did the president say about Ketanji Brown Jackson'

# 返回结果
result = qa_chain.invoke({'query': query})

使用faiss生成索引

# 实现RAG,使用向量数据库faiss

# 安装faiss向量数据库,粪cpu和gpu版本
! pip install faiss-cpu

# 生成测试数据
documents = [
    'a和b是好朋友',
    'c和d是好朋友',
    'd和e是好朋友',
    'b和c是好朋友'
]

# 查看模型
! ollama list

model_name = 'tazarov/all-minilm-l6-v2-f32'

from langchain_ollama import OllamaEmbeddings
import faiss
import numpy as np

model_embed = OllamaEmbeddings(model = model_name)

# 维度
dimension = 384

# 生成索引
index = faiss.IndexFlatIP(dimension)

r1 = model_embed.embed_query('oracle')

r1 = np.array(r1)

# numpy.ndarray
type(r1)

# 384
len(r1)

# (384,)
r1.shape

# 1维->2维
# 修改数组中元素的类型(faiss只支持float32)
# p1元素的数量
r1 = r1.reshape(1, -1).astype('float32')

# (1, 384)
r1.shape

# np.float32(-0.06195071)
r1[0][0]

# 数据转为faiss处理的向量格式,添加到索引中
for i, doc in enumerate(documents):
    data = model_embed.embed_query(doc)
    data = np.array(data)
    data = data.reshape(1, -1).astype('float32')
    index.add(data)

# 4
index.ntotal

query = 'd和谁是好朋友'

# 字符串->向量->数组->形状
query = model_embed.embed_query(query)

query = np.array(query)

query = query.reshape(1, -1).astype('float32')

# (1, 384)
query.shape

# 检索
distances, data = index.search(query, 2)

# array([[0.9317326, 0.9118643]], dtype=float32)
distances

# array([[2, 1]])
data

# 2维数组->1维数组
data = data.flatten()

# array([2, 1])
data

# [2, 1]
data.tolist()

# array([2, 1])
data

# 'd和e是好朋友'
documents[data[0]]

for i in data:
    print(documents[i])
'''
d和e是好朋友
c和d是好朋友
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值