本地部署deepseek之后,python接口进行调用知识库
本地部署deepseek之后,python接口进行调用知识库
一:实现机理
使用langChain框架,便于白盒调试。
这是一个基于本地大语言模型(LLM)构建的简单问答系统,使用LangChain框架与本地运行的Ollama模型交互。我来逐步解释代码的各个部分:
### 1. 基本配置
```python
LOCAL_MODEL_URL = "http://localhost:11434/v1/chat/completions"
LOCAL_MODEL_KEY = "ollama"
MODEL_NAME = "deepseek-r1"
```
- 配置了本地Ollama服务的API地址和模型名称
- `deepseek-r1`是指定的模型名称(需提前在Ollama中下载)
### 2. 知识库定义
```python
KNOWLEDGE_BASE = "我们家里有个苹果,还是红色的"
```
- 硬编码了一个简单的知识库内容
- 实际应用中通常会连接数据库或文档库
### 3. 提示模板
```python
prompt_template = PromptTemplate(
input_variables=["question", "knowledge"],
template="""
你是一个智能助手,根据以下知识库内容直接回答问题:
知识库:{knowledge}
问题:{question}
回答:
"""
)
```
- 定义了如何将用户问题和知识库内容组合成模型输入
- 使用占位符`{knowledge}`和`{question}`动态插入内容
### 4. 自定义本地LLM类
核心部分`LocalLLM`继承自`BaseLLM`,主要功能:
#### 请求处理
```python
data = {
"model": MODEL_NAME,
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 100,
"temperature": 0.7
}
```
- 构造符合OpenAI API格式的请求数据
- 设置了生成长度(max_tokens)和随机性(temperature)
#### 响应处理
```python
text = response.json()["choices"][0]["message"]["content"].strip()
text = text.replace("<think>", "").replace("</think>", "").strip()
```
- 提取模型生成的回答内容
- 过滤掉可能存在的`<think>`标签(某些模型的中间思考过程)
### 5. 主程序流程
```python
llm = LocalLLM()
chain = LLMChain(llm=llm, prompt=prompt_template)
```
- 初始化自定义LLM和问答链
```python
while True:
question = input("请输入你的问题...")
response = chain.run(question=question, knowledge=KNOWLEDGE_BASE)
```
- 交互式问答循环
- 将用户问题和知识库内容通过chain传递给模型
### 关键特点
1. **本地化运行**:完全离线,使用本地部署的Ollama服务
2. **知识库集成**:将静态知识库内容注入到提示中
3. **调试信息**:打印请求/响应数据方便调试
4. **错误处理**:捕获并显示API调用异常
### 典型工作流程
1. 用户输入问题(如"苹果是什么颜色的?")
2. 系统组合提示:"知识库:我们家里有个苹果,还是红色的\n问题:苹果是什么颜色的?"
3. 发送到本地模型
4. 接收并解析模型回答(应为"红色的")
5. 输出给用户
### 可能的改进方向
1. 动态知识库(从文件/数据库加载)
2. 对话历史记忆
3. 更复杂的提示工程
4. 支持流式输出
5. 添加验证和审核机制
这个实现展示了如何用LangChain快速构建基于本地大模型的问答应用原型。
二:源代码
import requests
from typing import List, Optional, Dict, Any
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.llms.base import BaseLLM
from langchain.schema import LLMResult, Generation
# 配置本地模型的 API 地址和密钥
LOCAL_MODEL_URL = "http://localhost:11434/v1/chat/completions"
LOCAL_MODEL_KEY = "ollama"
MODEL_NAME = "deepseek-r1" # 指定模型名称
# 知识库内容
KNOWLEDGE_BASE = "我们家里有个苹果,还是红色的"
# 定义提示模板
prompt_template = PromptTemplate(
input_variables=["question", "knowledge"],
template="""
你是一个智能助手,根据以下知识库内容直接回答问题:
知识库:{knowledge}
问题:{question}
回答:
"""
)
# 自定义本地 LLM 类
class LocalLLM(BaseLLM):
def _generate(
self,
prompts: List[str],
stop: Optional[List[str]] = None,
**kwargs: Any,
) -> LLMResult:
generations = []
for prompt in prompts:
headers = {
"Authorization": f"Bearer {LOCAL_MODEL_KEY}",
"Content-Type": "application/json"
}
data = {
"model": MODEL_NAME, # 添加 model 字段
"messages": [
{"role": "user", "content": prompt}
],
"max_tokens": 100,
"temperature": 0.7
}
print("发送请求数据:", data) # 打印请求数据
response = requests.post(LOCAL_MODEL_URL, json=data, headers=headers)
print("响应状态码:", response.status_code) # 打印响应状态码
print("响应内容:", response.text) # 打印响应内容
if response.status_code == 200:
text = response.json()["choices"][0]["message"]["content"].strip()
# 过滤掉 <think> 标签及其内容
text = text.replace("<think>", "").replace("</think>", "").strip()
generations.append([Generation(text=text)])
else:
raise Exception(f"模型调用失败,状态码:{response.status_code}, 响应内容:{response.text}")
return LLMResult(generations=generations)
def _llm_type(self) -> str:
return "local_llm"
# 初始化 LLMChain
llm = LocalLLM()
chain = LLMChain(llm=llm, prompt=prompt_template)
# 主函数
def main():
print("欢迎使用本地知识库问答系统!")
while True:
question = input("请输入你的问题(输入 '退出' 结束):")
if question.lower() == "退出":
print("再见!")
break
# 调用链式模型生成回答
try:
response = chain.run(question=question, knowledge=KNOWLEDGE_BASE)
print(f"回答:{response}")
except Exception as e:
print(f"发生错误:{e}")
if __name__ == "__main__":
main()
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)