1.LangChain简介

对于 LangChain,它是⼀个⽤于开发 由⼤语⾔模型 (LLM) 驱动的应⽤程序的框架。
通过前⼏个章节,我们已经说明尽管⼤模型的在某些⽅⾯表现振奋⼈⼼,但使⽤原⽣ LLM 可能会存在⼀些问题,例如将其当作搜索引擎去使⽤,LLM ⽣成的答案可能要⽐其他搜索引擎查到的答案更符合你的预期,但要是在复杂的场景下使⽤,如将 LLM 嵌⼊应⽤程序时却遭遇了全新难题:
- 简单提⽰词(Prompt)得到的答案经常出现幻觉?
- 提⽰词结构是否可以统⼀规范?
- 如何实现开发过程中⼤模型的轻松、灵活切换?
- ⼤模型输出是⾮结构化的,怎样与要求结构化数据的程序接⼝交互?
- 如何克服预训练模型知识陈旧的问题,引⼊实时更新?
- 如何连接模型与外部⼯具或系统,执⾏具体任务?
LangChain 框架的核⼼⽬标就是应对这些挑战。它通过将⾃然语⾔处理流程拆解为标准化组件,让开发者能够⾃由组合并⾼效定制⼯作流。
2. LangChain代码快速上手
我们以下的例子都使用DeepSeek为例来进行代码编写
2.1. 申请API
去DeekSeek官网点击API开放平台,再点击左侧的API Key申请API

2.2. 安装相关的包
在pycharm中创建一个req.txt的文件,在终端输入pip install req.txt命令
req.txt的文件内容:
langchain-openai==0.3.33
langchain==0.3.27
langchain-deepseek==0.1.4
langchain-ollama==0.3.6
langchain-tavily==0.2.12
langchain-chroma==0.2.5
langchain-community==0.3.22
nltk==3.9.2
langchain-redis==0.2.4
unstructured==0.18.15
markdown==3.9
redisvl==0.10.0
2.3. 编写相关的代码
代码:
python
from langchain_core.runnables import RunnableSequence
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.output_parsers import StrOutputParser
model = ChatOpenAI(api_key="...", model="deepseek-reasoner",openai_api_base="https://api.deepseek.com/v1", request_timeout=30 )
message = [
SystemMessage("Translate the follwing setence from English to Chinese"),
HumanMessage("Hello, Wrold!") # 用户消息
]
message1 = [
SystemMessage("介绍一下以下学校:"),
HumanMessage("湖南农业大学,湖南师范大学") # 用户消息
]
message2 = [
HumanMessage("说出你认为周杰伦最好听的一首歌") # 用户消息
]
message3 = [
# SystemMessage("介绍一下以下学校:"),
HumanMessage("说出你觉得湖南农业大学的优点") # 用户消息
]
result1 = model.invoke(message) # model.invoke()的返回值是AIMessage
print(result1)
parser = StrOutputParser()
chain1 = model | parser
chain2 = RunnableSequence(first=model, last=parser)
chain3 = model.pipe(parser)
result2 = chain1.invoke(message1)
result3 = chain2.invoke(message2)
result4 = chain3.invoke(message3)
print(result2)
print(result3)
print(result4)
运行结果:

2.3.1. 定义大模型
python
from langchain_openai import ChatOpenAI
model = ChatOpenAI(api_key=".....", model="deepseek-reasoner",openai_api_base="https://api.deepseek.com/v1", request_timeout=30 )
2.3.2. 定义消息列表
python
from langchain_core.messages import HumanMessage, SystemMessag
message1 = [
SystemMessage("介绍一下以下学校:"),
HumanMessage("湖南农业大学,湖南师范大学")
]
message2 = [
HumanMessage("说出你认为周杰伦最好听的一首歌")
]
message3 = [
# SystemMessage("介绍一下以下学校:"),
HumanMessage("说出你觉得湖南农业大学的优点")
]
参数说明:
SystemMessage :表⽰ 系统⻆⾊ 消息,系统消息通常作为输⼊消息序列中的第⼀条传⼊,是
⽤来启动 AI ⾏为的消息。
HumanMessage :表⽰ ⽤⼾⻆⾊ 消息,是来⾃⽤⼾的、从⽤⼾传递到模型的消息。
2.3.4. 步骤4:调⽤⼤模型
model 是 LangChain Runnable (可运⾏)接⼝的实例,这意味着 model 提供了⼀个标准接⼝供 我们与之交互。要简单地调⽤模型,我们可以将 消息列表 传递给 .invoke ⽅法。 使⽤ .invoke ⽅法进⾏⼤模型调⽤,核⼼代码:
python
result1 = model.invoke(message)
print(result)
输出结果(调试可以看⻅ result 类型为 AIMessage):

输出说明:
AIMessage :来⾃ AI 的消息。从聊天模型返回,作为对提⽰(输⼊)的响应。
content :消息的内容。
additional_kwargs :与消息关联的其他有效负载数据。对于来⾃ AI 的消息,可能包括模
型提供程序编码的⼯具调⽤。
response_metadata :响应元数据。例如:响应标头、logprobs、令牌计数、模型名称。
侧重于 "响应"本⾝的信息,⽐如这次请求的 ID、使⽤的模型版本、以及服务提供商返回
的所有原始元数据。它主要⽤于调试、⽇志记录和获取请求的上下⽂信息。
usage_metadata :消息的使⽤元数据,例如令牌计数。
侧重于 "资源消耗"的量化信息,即这次请求消耗了多少 Token。它主要⽤于成本计算、
监控和预算控制。
2.3.5. 解析输出
若只想输出聊天模型返回的结果字符串,可以使⽤ StrOutputParser 输出解析器组件,将⼤模型
输出结果解析为最可能的字符串。核⼼代码:
python
parser = StrOutputParser()
2.3.6. 链式执行
通过上述步骤,⽆论是调⽤⼤模型,还是输出解析,我们发现,每次都调⽤了⼀个 invoke() ⽅法,最 终才会得到我们想要的结果。
对于 LangChain,它给我们提供了链式执⾏的能⼒,即我们只需要定义各个"组件",将它们"链起
来",⼀次性执⾏即可得到最终效果。
python
# 链式输出,上一个组件的输出座位下一个组件的输入,注意组件之间的顺序
chain1 = model | parser
chain2 = RunnableSequence(first=model, last=parser)
chain3 = model.pipe(parser)
result2 = chain1.invoke(message1)
result3 = chain2.invoke(message2)
result4 = chain3.invoke(message3)