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