当前位置: 首页 > news >正文

DeepSeek基础-使用python请求deepseek

DeepSeek基础

  • 环境安装
  • 编程案例
    • .通过openai sdk访问本地部署的deepseek模型
    • 访问本地部署的嵌入模型,实现文本嵌入功能,实现向量化
    • 嵌入(向量化)的图形显示
    • 文本嵌入模型
    • 使用openai访问远程deepseek服务
    • 通过远程deepseek服务生成一个html游戏
    • 使用requests访问远程deepseek服务
    • .使用langchain_openai中间件访问远程deepseek服务
    • 使用faiss生成索引

环境安装

包含应用软件安装、模型、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.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是好朋友
'''

相关文章:

  • 2025华东杯A/B/C题解题思路+可运行代码参考
  • 从 “可办“ 到 “好办“:云蝠大模型如何重塑政务服务体验
  • ubuntu下一些环境配置
  • 插入到word里面的用origin画的图,怎么获取图片细节?
  • 【Spring AI】Java结合ollama实现大模型调用
  • 大数据治理自动化与智能化实践指南:架构、工具与实战方案(含代码)
  • 一种动态分配内存错误的解决办法
  • 蓝桥杯 序列计数
  • nginx 代理时怎么更改 Remote Address 请求头
  • 单片机-89C51部分:11、IIC 、传感器温湿度
  • 机器手电机驱动器小体积解决方案
  • mybatis-plus 枚举实现模版,导入,导出
  • Spring AI应用系列——基于ARK实现多模态模型应用
  • OpenHarmony - 小型系统内核(LiteOS-A)(十七)标准库
  • 游戏性能测试
  • 【Linux庖丁解牛】—环境变量!
  • C#规避内存泄漏的编码方法
  • 嵌入式软件--stm32 DAY 5 USART串口通讯(上)
  • linux中sigint和sigterm的区别
  • CSS:选择器-基本选择器
  • 刘国中:毫不松懈巩固拓展脱贫攻坚成果,全力以赴抓好农业防灾减灾工作
  • 秦洪看盘|资金切换主线,重构市场风格
  • 铁路迎来节前出行高峰,今日全国铁路预计发送旅客1870万人次
  • “80后”蒋美华任辽宁阜新市副市长
  • 中央宣传部、全国总工会联合发布2025年“最美职工”先进事迹
  • 启程回家!神十九轨道舱与返回舱成功分离