0 LangChain简要介绍
LangChain 是一个基于大型语言模型(LLM)的编程框架,旨在简化开发由语言模型驱动的应用程序。它通过模块化设计和链式结构,将语言模型与其他数据源、计算工具及外部系统连接,从而扩展 LLM 的能力,使其能够处理更复杂的任务。
以下是其核心特点:
模块化设计
LangChain 提供了一系列标准化组件,包括模型调用(Models)、提示管理(Prompts)、上下文存储(Memory)、链式逻辑(Chains)、智能代理(Agents)等。这些模块可灵活组合,支持开发者快速构建端到端应用,例如问答系统、聊天机器人或数据分析工具。
数据感知与外部交互
LangChain 强调与外部数据的整合,例如通过文档加载器(Document Loaders)和向量数据库(Vector Stores)实现检索增强生成(RAG),从而突破 LLM 训练数据的时效性和领域局限性。此外,它支持与 Python 编译器、数学计算器等工具交互,扩展功能边界。
支持多模型与异步调用
兼容多种主流 LLM(如 OpenAI、Hugging Face 等),并提供异步接口优化资源利用率,适用于高并发场景。
而博主也是在做智能机器人上部署deepseek时开始接触了解LangChain的。
下面是调用API将deepseek应用到LangChain框架中(生成聊天机器人)的一个示例。
1 安装所必需的库
import os
from typing import List, Dict, Any
from dotenv import load_dotenv
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
from langchain_core.messages import AIMessage, HumanMessage, BaseMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.language_models import BaseChatModel
from langchain_core.outputs import ChatResult, ChatGeneration
import requests
2 定义deepseek聊天模型类
BaseChatModel是langchain中的一个通用模型基类,定义的DeekSeekChat类即是继承自该通用类。api_key在后面会赋值;model直接选去你要调用的deepseek模型即可;temperature参数越小生成的模型回答越准确(创造性越差)。
# 自定义DeepSeek聊天模型类
class DeepSeekChat(BaseChatModel):
api_key: str # API密钥
model: str = "deepseek-reasoner" # 默认模型
temperature: float = 0.1 # 温度参数
2.1 定义实现实际的消息生成逻辑函数
同时也是LangChain模型调用的核心入口
def _generate(self, messages: List[BaseMessage], **kwargs) -> ChatResult:
# 转换消息格式,将LangChain的标准消息格式转换为DeepSeek API要求的格式
formatted_messages = []
for msg in messages:
if isinstance(msg, HumanMessage):
role = "user"
elif isinstance(msg, AIMessage):
role = "assistant"
else:
role = "system"
formatted_messages.append({"role": role, "content": msg.content})
定义的函数方法,返回的是一个ChatResult类型的对象
首先定义formatted_messages,为之前的消息列表。
检测消息是用户还是系统生成的,并加上“role”角色名以字典形式添加到消息列表中。
# 构建请求,headers:包含认证令牌,使用Bearer Token形式
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
data = {
"model": self.model, # 指定使用的模型版本
"messages": formatted_messages,
"temperature": self.temperature # 继承类属性中的设定值
}
# 发送API请求
try:
response = requests.post(
"https://api.deepseek.com/v1/chat/completions",
headers=headers,
json=data
)
# 自动检查HTTP状态码(非2xx会抛异常)
response.raise_for_status()
result = response.json()
解析网站构建的请求以及请求操作;
并最后由网页端返回deepseek生成的内容,以json代码形式返回
except Exception as e:
raise RuntimeError(f"API请求失败: {str(e)}")
# 解析响应
if "choices" not in result or len(result["choices"]) == 0:
raise RuntimeError("无效的API响应格式")
# 结果提取:取第一个choice的content内容(默认单回复场景)
content = result["choices"][0]["message"]["content"]
在这里我们取返回的json代码的对应的“content”内容(仅有回复文本)
# 返回值:包装为LangChain标准的ChatResult格式,包含AIMessage对象
return ChatResult(generations=[ChatGeneration(message=AIMessage(content=content))])
并且以langchain标准形式返回(我们之前也以此标准形式构建了历史消息的字典列表)
2.2 定义模型标识变量
@property
def _llm_type(self) -> str:
return "deepseek-chat"
这个_llm_type属性用于标识或描述这个实例所使用的语言模型(LLM)的类型;可以通过以下代码直接获取。
print(model_instance._llm_type) # 输出: deepseek-chat
3 完成主函数
def main():
# 加载环境变量
load_dotenv()
api_key = "YOUR_API"
# 初始化聊天模型
model = DeepSeekChat(api_key=api_key)
以自己申请到的api_key创建一个DeepSeekChat类的模型
prompt = ChatPromptTemplate.from_messages([
MessagesPlaceholder(variable_name="chat_history"),
("user", "{input}")
])
设计定制化输出模板
# 配置记忆存储
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
# 创建对话链
chain = LLMChain(
llm=model,
prompt=prompt,
memory=memory,
verbose=True # 显示详细运行信息(调试时可开启)
)
配置记忆存储并创建对话链
print("欢迎使用DeepSeek聊天助手!输入'exit'退出")
while True:
try:
user_input = input("你:")
if user_input.lower() in ["exit", "quit"]:
break
# 运行对话链
response = chain.invoke({"input": user_input})
print(f"AI:{response['text']}")
except KeyboardInterrupt:
break
except Exception as e:
print(f"发生错误:{str(e)}")
break
进行循环对话
4 运行主程序
if __name__ == "__main__":
main()
5 输出结果
......
6 完整代码
import os
from typing import List, Dict, Any
from dotenv import load_dotenv
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
from langchain_core.messages import AIMessage, HumanMessage, BaseMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.language_models import BaseChatModel
from langchain_core.outputs import ChatResult, ChatGeneration
import requests
# 自定义DeepSeek聊天模型类
class DeepSeekChat(BaseChatModel):
api_key: str # API密钥
model: str = "deepseek-reasoner" # 默认模型
temperature: float = 0.1 # 温度参数
# 实现实际的消息生成逻辑,是LangChain模型调用的核心入口
def _generate(self, messages: List[BaseMessage], **kwargs) -> ChatResult:
# 转换消息格式,将LangChain的标准消息格式转换为DeepSeek API要求的格式
formatted_messages = []
for msg in messages:
if isinstance(msg, HumanMessage):
role = "user"
elif isinstance(msg, AIMessage):
role = "assistant"
else:
role = "system"
formatted_messages.append({"role": role, "content": msg.content})
# 构建请求,headers:包含认证令牌,使用Bearer Token形式
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
data = {
"model": self.model, # 指定使用的模型版本
"messages": formatted_messages,
"temperature": self.temperature # 继承类属性中的设定值
}
# 发送API请求
try:
response = requests.post(
"https://api.deepseek.com/v1/chat/completions",
headers=headers,
json=data
)
# 自动检查HTTP状态码(非2xx会抛异常)
response.raise_for_status()
result = response.json()
except Exception as e:
raise RuntimeError(f"API请求失败: {str(e)}")
# 解析响应
if "choices" not in result or len(result["choices"]) == 0:
raise RuntimeError("无效的API响应格式")
# 结果提取:取第一个choice的content内容(默认单回复场景)
content = result["choices"][0]["message"]["content"]
# 返回值:包装为LangChain标准的ChatResult格式,包含AIMessage对象
return ChatResult(generations=[ChatGeneration(message=AIMessage(content=content))])
@property
def _llm_type(self) -> str:
return "deepseek-chat"
# 主程序
def main():
# 加载环境变量
load_dotenv()
api_key = "YOUR_API"
# api_key = os.getenv("sk-7f60db8ef22f4ca2a16af1e528186c3f")
# if not api_key:
# raise ValueError("请设置DEEPSEEK_API_KEY环境变量")
# 初始化聊天模型
model = DeepSeekChat(api_key=api_key)
# 创建提示模板
prompt = ChatPromptTemplate.from_messages([
MessagesPlaceholder(variable_name="chat_history"),
("user", "{input}")
])
# 配置记忆存储
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
# 创建对话链
chain = LLMChain(
llm=model,
prompt=prompt,
memory=memory,
verbose=True # 显示详细运行信息(调试时可开启)
)
# 开始对话循环
print("欢迎使用DeepSeek聊天助手!输入'exit'退出")
while True:
try:
user_input = input("你:")
if user_input.lower() in ["exit", "quit"]:
break
# 运行对话链
response = chain.invoke({"input": user_input})
print(f"AI:{response['text']}")
except KeyboardInterrupt:
break
except Exception as e:
print(f"发生错误:{str(e)}")
break
if __name__ == "__main__":
main()