这里就正式进入LangChain的详细解析了,感兴趣可以持续关注。
1. 内容与目标
LangChain,它是一个用于开发由大语言模型 (LLM) 驱动的应用程序的框架。
通过前几篇,我们已经说明尽管大模型在某些方面表现振奋人心,但使用原生 LLM 可能会存在一些问题。例如将其当作搜索引擎去使用,LLM 生成的答案可能要比其他搜索引擎查到的答案更符合你的预期,但要是在复杂的场景下使用,如将 LLM 嵌入应用程序时却遭遇了全新难题:
- 简单提示词(Prompt)得到的答案经常出现幻觉?
- 提示词结构是否可以统一规范?
- 如何实现开发过程中大模型的轻松、灵活切换?
- 大模型输出是非结构化的,怎样与要求结构化数据的程序接口交互?
- 如何克服预训练模型知识陈旧的问题,引入实时更新?
- 如何连接模型与外部工具或系统,执行具体任务?
- ...
LangChain 框架的核心目标就是应对这些挑战。它通过将自然语言处理流程拆解为标准化组件,让开发者能够自由组合并高效定制工作流。
2. LangChain软件安装包
LangChain 生态系统包含不同的包,用来准确选择要安装的功能。如下图所示:
- 主 langchain 包
这个包是使用 LangChain 的起点,安装方式如下:
pip install langchain- langchain-core 包
除了 langsmith SDK 之外,LangChain 生态系统中的所有包都依赖于 langchain-core,包含其它包使用的基类和抽象,以及 LangChain LCEL(表达式语言)。
它由 langchain 包自动安装,不需要显式安装该包。但是,如果使用的功能仅在该依赖项的特定版本中可用,则可以选择手动安装。如果手动安装,则应确保已安装或固定的版本与所使用的任何其他集成包兼容。
pip install langchain-core- Integrations 集成包
LangChain 的大部分价值来自于将各种能力进行集成,如各类模型集成(如 OpenAI 和 Anthropic)、各类组件集成(如数据存储、工具等)等。LangChain 中集成好的包见这里。
对于所需依赖项,我们需要单独安装。例如要使用 OpenAI,可以运行:
pip install langchain-openai- langchain-community 包
简单来说,任何尚未拆分到独立包中的集成,都存在于 langchain-community 包中。安装方式:
pip install langchain-community- langgraph 包
langgraph 是一个库,用于使用 LLM 构建有状态的应用程序。它与 LangChain 顺利集成。安装方式:
pip install langgraph- LangSmith SDK
LangSmith SDK 由 LangChain 自动安装。但它不依赖于 langchain-core,如果需要,可以独立安装和使用,安装方式:
pip install langsmith3. 详细过程
3.1 步骤 1:申请 API key 并配置环境变量
1. 申请 API key
以 DeepSeek 为例,官网地址:DeepSeek
如果没有账号先注册账号,登录成功后,找到个人中心,选择 API keys 配置页面;
点击 “Create new secret key” 按钮,新增 API key;
将 API Key 在自己本地保存好,后续接入 DeepSeek 大模型时需要使用。
2. 配置环境变量
将 API Key 配置在环境变量中主要是为了保证其隐私性。由于 api key 比较隐私,为避免在程序中暴露,可提前将 api key 配置在环境变量中,这样在程序中就可以通过获取对应环境变量拿到 api key,保证了 api key 的隐私。
3.2 步骤 2:定义大模型
1.安装 DeepSeek 集成包
pip install -U langchain-deepseek2.定义大模型
核心代码:
# 定义大模型 from langchain_deepseek import ChatDeepSeek model = ChatDeepSeek(model="deepseek-chat")3.3 步骤 3:定义消息列表
核心代码:
# 定义消息列表 from langchain_core.messages import HumanMessage, SystemMessage messages = [ SystemMessage(content="Translate the following from English into Chinese"), HumanMessage(content="hi!"), ]参数说明:
- SystemMessage:表示系统角色消息,系统消息通常作为输入消息序列中的第一条传入,是用来启动 AI 行为的消息。
- HumanMessage:表示用户角色消息,是来自用户的、从用户传递到模型的消息。
3.4 步骤 4:调用大模型
model 是 LangChainRunnable(可运行)接口的实例,这意味着 model 提供了一个标准接口供我们与之交互。要简单地调用模型,我们可以将消息列表传递给 .invoke 方法。
使用 .invoke 方法进行大模型调用,核心代码:
result = model.invoke(messages) print(result)输出结果(调试可以看见 result 类型为 AIMessage):
content='你好!' additional_kwargs={'refusal': None} response_metadata= {'token_usage': {'completion_tokens': 2, 'prompt_tokens': 20, 'total_tokens': 22, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'deepseek-chat', 'system_fingerprint': None, 'id': 'chatcmpl-C5l29mi6KkQSFO3qaElDJD5Lj9nBn', 'service_tier': 'default', 'finish_reason': 'stop', 'logprobs': None} id='run--777ef0be-55c2-411a-a4ab-104a45c22f20-0' usage_metadata={'input_tokens': 20, 'output_tokens': 2, 'total_tokens': 22, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}输出说明:
AIMessage:来自 AI 的消息。从聊天模型返回,作为对提示(输入)的响应。
content:消息的内容。
additional_kwargs:与消息关联的其他有效负载数据。对于来自 AI 的消息,可能包括模型提供程序编码的工具调用。
response_metadata:响应元数据。例如:响应标头、logprobs、令牌计数、模型名称。
侧重于 “响应” 本身的信息,比如这次请求的 ID、使用的模型版本、以及服务提供商返回的所有原始元数据。它主要用于调试、日志记录和获取请求的上下文信息。
usage_metadata:消息的使用元数据,例如令牌计数。
侧重于 “资源消耗” 的量化信息,即这次请求消耗了多少 Token。它主要用于成本计算、监控和预算控制。
3.5 步骤 5:输出解析
若只想输出聊天模型返回的结果字符串,可以使用 StrOutputParser 输出解析器组件,将大模型输出结果解析为最可能的字符串。核心代码:
# 定义str字符串输出解析器 from langchain_core.output_parsers import StrOutputParser parser = StrOutputParser() print(parser.invoke(result))输出结果:
你好!3.6 步骤 6:链式执行
通过上述步骤,无论是调用大模型,还是输出解析,我们发现,每次都调用了一个 invoke() 方法,最终才会得到我们想要的结果。
对于 LangChain,它给我们提供了链式执行的能力,即我们只需要定义各个 “组件”,将它们 “链起来”,一次性执行即可得到最终效果。
核心代码如下:
# 定义大模型 model = ChatDeepSeek(model="deepseek-chat") # 定义消息列表 messages = [ SystemMessage(content="Translate the following from English into Chinese"), HumanMessage(content="hi!"), ] # 定义输出解析器 parser = StrOutputParser() # 定义链 chain = model | parser # 执行链 result = chain.invoke(messages) print(result)输出结果:
你好!快速上手完整代码参考:
from langchain_deepseek import ChatDeepSeek from langchain_core.messages import HumanMessage, SystemMessage from langchain_core.output_parsers import StrOutputParser # 定义大模型 model = ChatDeepSeek(model="deepseek-chat") # 定义消息列表 messages = [ SystemMessage(content="Translate the following from English into Chinese"), HumanMessage(content="hi!"), ] # 定义输出解析器 parser = StrOutputParser() # 定义链 chain = model | parser # 执行链 result = chain.invoke(messages) print(result)3. 引出 LangChain 相关概念
3.1 Runnable 接口
Runnable 接口是使用 LangChain Components(组件)的基础。
概念说明:
Components(组件):用来帮助当我们在构建应用程序时,提供了一系列的核心构建块,例如语言模型、输出解析器、检索器、编译的 LangGraph 图等。
Runnable 定义了一个标准接口,允许 Runnable 组件:
- Invoked(调用): 单个输入转换为输出。
- Batched(批处理): 多个输入被有效地转换为输出。
- Streamed(流式传输): 输出在生成时进行流式传输。
- Inspected(检查): 可以访问有关 Runnable 的输入、输出和配置的原理图信息。
- Composed(组合): 可以组合多个 Runnable,使用 LCEL 协同工作以创建复杂的管道。
因此,在快速上手中,我们定义的语言模型(model)、输出解析器(StrOutputParser)都是Runnable接口的实例!他们都使用了 Invoked(调用)的能力,回顾一下:
# 语言模型(model) model = ChatOpenAI(model="gpt-5-mini") result = model.invoke(messages) # 语言模型是 Runnable 接口实例,允许invoke调用 # 输出解析器(StrOutputParser) parser = StrOutputParser() parser.invoke(result) # 输出解析器是 Runnable 接口实例,允许invoke调用3.2 LangChain Expression Language
LangChain Expression Language(LCEL):采用声明性方法,从现有 Runnable 对象构建新的 Runnable 对象。
通过 LCEL 构建出的新的 Runnable 对象,被称为 RunnableSequence,表示可运行序列。 RunnableSequence 就是一种链(参考步骤 6)。通过调试步骤 6 就能发现,chain 的类型就是 RunnableSequence。
重要的是,RunnableSequence 也是 Runnable 接口的实例,它实现了完整的 Runnable 接口,因此它可以用与任何其他 Runnable 相同的姿势使用。
回顾一下:
chain = model | parser chain.invoke(messages) # 链是 Runnable 接口实例,允许invoke调用可以看到,LCEL 其实是一种编排解决方案,它使 LangChain 能够以优化的方式处理链的运行时执行。任何两个 Runnable 实例都可以 “链” 在一起成序列。上一个可运行对象的.invoke()调用的输出作为输入传递给下一个可运行对象。方法就是使用|(管道 / 运算符):
chain = model | parser它通过两个 Runnable 对象去创建一个 RunnableSequence。实际上 LangChain 重载了|运算符,使用|运算符就相当于:
from langchain_core.runnables import RunnableSequence chain = RunnableSequence(first=model, last=parser)除此之外,可以使用.pipe方法代替。这也相当于|运算符:
在 Unix/Linux 系统中,pipe () 系统调用和 | 管道操作符都用于实现进程间通信,这里同样也是迁移过来的用法。
chain = model.pipe(parser)以上内容就是为了大家能够快速上手LangChain而准备的内容,下一篇我们将要介绍关于聊天模型的相关内容。