DeepSeek基础-使用python请求deepseek
DeepSeek基础
- 环境安装
- 编程案例
- .通过openai sdk访问本地部署的deepseek模型
- 访问本地部署的嵌入模型,实现文本嵌入功能,实现向量化
- 嵌入(向量化)的图形显示
- 文本嵌入模型
- 使用openai访问远程deepseek服务
- 通过远程deepseek服务生成一个html游戏
- 使用requests访问远程deepseek服务
- .使用langchain_openai中间件访问远程deepseek服务
- 使用faiss生成索引
环境安装
包含应用软件安装、模型、python库安装
- Anaconda
- Ollama
- jupyter编辑器
- 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.shapetext_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 TSNEtsne = 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.shapedata = 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 osos.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 OpenAIllm_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
# 实现的功能:加载文档到向量数据库chromaimport 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 ChatOpenAIload_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 listmodel_name = 'tazarov/all-minilm-l6-v2-f32'from langchain_ollama import OllamaEmbeddings
import faiss
import numpy as npmodel_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.ntotalquery = '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是好朋友
'''