当前位置: 首页 > news >正文

【大模型应用开发 6.LangChain多任务应用开发】

目录

一、LangChain的核心组件

1.模型I/O封装

Ⅰ、模型API:ChatModel

① OpenAI模型封装

② 多轮对话Session封装

③ 使用国产模型

④ 流式输出

2.模型的输入与输出

Ⅰ、Prompt模板封装

① PromptTemplate 可以在模板中自定义变量

② ChatPromptTemplate 用模板表示的对话上下文

③ 把多轮对话变成模板

Ⅱ、从文件加载Prompt模板

3.结构化输出

Ⅰ、直接输出Pydantic对象

Ⅱ、输出指定格式的JSON

Ⅲ、使用OutputParser

Ⅳ、使用PydanticOutputParser

Ⅴ、OutputFixingParser格式自动纠错

4.Function Calling

Ⅰ、Function Calling 成立的模型能力基础

Ⅱ、常见 Function Calling 的应用场景包括

Ⅲ、Calling是结果,理解和选择才是第一步

Ⅳ、代码演示

① 定义工具

② 调用工具

③ 回传Function Calling的结果

④ 结合Function Calling结果进行查询

二、数据连接封装

1.文档加载器:Document Loaders

2.文档处理器:TextSplitter

3.向量数据库与向量检索

4.代码示例

三、Chain和LangChain Expression Language

1.Pipeline 式调用 PromptTemplate, LLM 和 OutputParser

Ⅰ、LCEL 的一些亮点包括:

2.用 LCEL 实现 RAG

示例(加载并拆分)

3.用 LCEL 实现模型切换(工厂模式)

4.ICEL的其他功能

四、LangChain与LlamaIndex的错位竞争

总结


等下次 等不忙 等有钱 等有时间 等我们都不在彼此身边

                                                                                —— 25.9.7

一、LangChain的核心组件

1.模型 I/O 封装

        Chat Models:对语言模型接口的封装

        PromptTemple:提示词模板

        OutputParser:解析输出

2.数据连接封装(弱于 LlamaIndex)

        Document Loaders:各种格式文件的加载器

        Document Transformers:对文档的常用操作,如:split, filter, translate, extract metadata, etc

        Text Embedding Models:文本向量化表示,用于检索等操作

        Verctorstores & Retrievers:向量数据库与向量检索

3.架构封装

        Chain/LCEL:实现一个功能或者一系列顺序功能组合

        Agent:根据用户输入,自动规划执行步骤,自动选择每步需要的工具,最终完成用户指定的功能

        Tools:调用外部功能的函数,例如:调 google 搜索、文件 I/O、Linux Shell 等等

        LangGraph:工作流开发框架

4.LangSmith过程监控与调试框架

1.模型I/O封装

把不同的模型,统一封装成一个接口,方便更换模型而不用重构代码。

Ⅰ、模型API:ChatModel

① OpenAI模型封装

清华源下载:pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -U langchain-openai

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -U langchain

langchain:一个开源的大语言模型(LLM)应用开发框架,旨在简化基于大语言模型的复杂应用构建(如智能问答、RAG、AI 智能体、工具调用等)。

langchain.chat_models:langchain 框架下的子模块,专门用于处理 “聊天型大语言模型” 的交互逻辑。

model:LangChain 聊天模型实例,封装了与 OpenAI 服务交互的逻辑(如 API 调用、参数配置等),是后续调用 gpt-4o-mini 模型的 “入口对象”。

response:LangChain 的 AIMessage 实例(大语言模型的响应消息对象)。存储模型对输入查询(此处为 "你是谁")的完整响应信息,不仅包含文本内容,还可能包含元数据(如生成时间、token 数量等)。

response.content:字符串(str),AIMessage 对象的核心属性,存储模型生成的具体文本回复内容(即模型对查询的 “回答文字”)。

init_chat_model():通用型自定义函数,用于封装各类大语言模型(如 OpenAI GPT、Anthropic Claude、阿里云通义千问等)的初始化逻辑,统一处理模型配置、认证信息、生成规则等,最终返回一个可直接调用的聊天模型实例,减少重复代码并提升配置灵活性。

参数名类型默认值是否必填详细描述
model_providerstr"openai"模型提供商,决定初始化的模型类型,常见值:"openai"(OpenAI)、"anthropic"(Anthropic)、"dashscope"(阿里云)、"baidu"(百度文心一言)等。
model_namestr"gpt-3.5-turbo"具体模型名称,需与model_provider匹配:- OpenAI:"gpt-3.5-turbo"/"gpt-4";- 阿里云:"qwen-max"/"qwen-plus";- Anthropic:"claude-3-sonnet-20240229"
api_keystrNone模型服务的 API 密钥,用于身份认证;若为None,默认从环境变量读取(需与model_provider对应,如 OpenAI 读OPENAI_API_KEY,阿里云读DASHSCOPE_API_KEY)。
base_urlstrNone模型服务的自定义基础 URL(用于私有部署、代理服务或非官方接口):- OpenAI 默认:"https://api.openai.com/v1";- 阿里云通义千问兼容 URL:"https://dashscope.aliyuncs.com/compatible-mode/v1";- 若为None,使用对应提供商的默认 URL。
temperaturefloat0.7生成文本的随机性控制:取值范围0.0~2.0;- 低值(如0.1~0.3):回复更严谨、确定;- 高值(如1.0~1.5):回复更多样、有创造性。
max_tokensint2048模型生成回复的最大 token 数(含输入 token + 输出 token),超过则截断;需根据模型上下文窗口设置(如 GPT-4 默认8192,qwen-max 支持128000)。
stopList[str] 或 strNone生成终止符:当模型生成内容中出现指定字符串时,立即停止生成;- 示例:stop=["\n用户:", "### 结束"],避免模型模拟后续对话。
top_pfloat1.0采样阈值(核采样):取值范围0.0~1.0;- 仅保留概率和达到top_p的 token 参与采样(如0.9:仅用前 90% 概率的 token),与temperature配合控制生成多样性,通常不建议同时调整两者。
frequency_penaltyfloat0.0重复内容惩罚:取值范围-2.0~2.0;- 正值(如0.5):降低模型生成重复内容的概率;- 负值(如-0.5):鼓励模型生成重复内容。
presence_penaltyfloat0.0主题新颖性惩罚:取值范围-2.0~2.0;- 正值(如0.5):鼓励模型引入新主题、新词汇;- 负值(如-0.5):鼓励模型聚焦现有主题。
timeoutint30模型请求的超时时间(单位:秒),超过时间未收到响应则抛出网络错误,避免长期阻塞。
max_retriesint2请求失败后的重试次数(如网络波动、服务临时不可用),减少偶发错误影响。
toolsList[Tool]None需绑定到模型的工具列表(如检索工具、函数调用工具),仅支持支持工具调用的模型(如 GPT-3.5-turbo-0613、qwen-max)。
tool_choicestr 或 dict"auto"工具调用策略:- "auto":模型自主决定是否调用工具;- "none":强制不调用工具,仅生成文本回复;- 工具名(如"retriever_tool"):强制调用指定工具。
**kwargs任意-其他模型专属参数,如 Anthropic 的top_k、百度文心一言的penalty_score等,根据model_provider灵活传递。

.invoke():LangChain 框架中 Runnable 接口的通用调用方法(适用于聊天模型、检索器、向量库、状态图等),用于触发目标对象的核心逻辑,接收输入数据并返回处理结果;在聊天模型场景中,主要用于传入消息列表,生成 AI 回复。

参数名类型默认值是否必填详细描述
inputSequence[BaseMessage]聊天模型的核心输入,必须是 BaseMessage 子类实例的列表(如 SystemMessageHumanMessageAIMessageToolMessage),包含对话上下文(系统提示、用户输入、历史回复、工具结果等)。
temperaturefloatNone临时覆盖模型初始化时的 temperature 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
max_tokensintNone临时覆盖模型初始化时的 max_tokens 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
stopList[str] 或 strNone临时覆盖模型初始化时的 stop 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
top_pfloatNone临时覆盖模型初始化时的 top_p 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
frequency_penaltyfloatNone临时覆盖模型初始化时的 frequency_penalty 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
presence_penaltyfloatNone临时覆盖模型初始化时的 presence_penalty 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
metadatadictNone附加的请求元数据,用于日志记录、追踪或模型服务的自定义标识(如请求 ID、用户 ID),部分模型服务支持通过元数据筛选日志。
timeoutintNone临时覆盖模型初始化时的 timeout 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
toolsList[Tool]None临时绑定到模型的工具列表,仅在本次调用中生效,优先级高于初始化时绑定的工具;若为None,沿用模型初始化的工具配置。
tool_choicestr 或 dictNone临时覆盖模型初始化时的 tool_choice 配置,仅在本次调用中生效,优先级高于初始化值;若为None,沿用模型初始化的工具调用策略。
callbacksList[BaseCallbackHandler]None回调函数列表,用于监听调用过程中的事件(如请求发送、响应接收、错误发生),可实现日志打印、进度跟踪、结果存储等自定义逻辑。
tagsList[str]None用于分类或筛选的标签列表(如 "chat""rag""debug"),可配合回调函数或日志系统,对不同类型的调用进行区分处理。
**kwargs任意-其他模型专属的临时参数(如 Anthropic 的stream、OpenAI 的user),根据模型支持的参数灵活传递,仅在本次调用中生效。
from langchain.chat_models import init_chat_model
model = init_chat_model("gpt-4o-mini", model_provider="openai")
response = model.invoke("你是谁")
print(response.content)
② 多轮对话Session封装

langchain:一个开源的大语言模型(LLM)应用开发框架,旨在简化基于大语言模型的复杂应用构建(如智能问答、RAG、AI 智能体、工具调用等)。

langchain.schema:langchain 框架的核心数据结构模块,定义了 LLM 应用中最基础的数据类型(如消息、文档、工具调用格式等),是框架内各组件(模型、记忆、工具)之间 “数据传递的通用语言”。

messages:List[BaseMessage](LangChain 消息对象列表,包含 SystemMessageHumanMessageAIMessage),存储完整的多轮对话上下文,为模型提供 “角色定义、历史互动、当前问题” 的全部信息,确保模型生成符合语境的回复。

SystemMessage():创建 “系统提示消息”,用于向大语言模型传递角色定义、行为规则或背景信息,约束 AI 的回复逻辑(如 “你是专业的技术顾问,回答需基于文档内容”)。系统消息的优先级通常高于用户消息,会从全局影响 AI 的行为模式。

参数名类型默认值是否必填描述
contentstr系统提示的核心文本内容,用于定义 AI 的角色、任务或规则。示例:"你是医疗知识助手,仅回答与医学相关的问题,避免猜测。"
additional_kwargsdict{}附加元数据(键值对),用于存储与系统提示相关的额外信息(如提示的版本、适用场景等),不影响模型生成逻辑,仅用于日志或下游处理。示例:{"version": "1.0", "scene": "medical"}
typestr"system"消息类型标识,固定为 "system"(无需手动设置,类内部自动定义),用于区分消息来源。

HumanMessage():创建 “用户消息”,用于封装人类用户的输入内容(如查询、指令、补充信息等),是 AI 需要直接响应或处理的核心输入。在多轮对话中,所有用户输入均需包装为 HumanMessage 传递给模型。

参数名类型默认值是否必填描述
contentstr用户输入的具体文本内容,即需要 AI 处理的查询或指令。示例:"什么是大语言模型的涌现能力?"
additional_kwargsdict{}附加元数据,用于存储用户相关信息(如用户 ID、输入时间戳、会话 ID 等),便于多用户场景或会话跟踪。示例:{"user_id": "123", "timestamp": "2024-10-24 15:30"}
typestr"human"消息类型标识,固定为 "human"(无需手动设置,类内部自动定义),用于区分消息来源。

AIMessage():创建 “AI 回复消息”,用于封装大语言模型生成的输出内容(如对用户查询的回答、工具调用指令等)。在多轮对话中,AI 的回复会被包装为 AIMessage 存入对话历史,作为后续交互的上下文。

参数名类型默认值是否必填描述
contentstrAI 生成的具体文本回复内容,即对用户查询的直接回应。示例:"涌现能力是指大语言模型在规模达到一定阈值后,突然表现出的未被显式训练的能力..."
additional_kwargsdict{}附加元数据,用于存储 AI 回复的相关信息(如生成时间、使用的模型版本等)。示例:{"model_used": "gpt-4o-mini", "generate_time": "2024-10-24 15:31"}
tool_callsOptional[List[ToolCall]]None若 AI 调用了工具(如检索、函数调用),则存储工具调用指令列表(每个指令含工具名、参数、ID),仅支持工具调用的模型会有此内容。示例:[{"name": "retriever_tool", "args": {"query": "涌现能力定义"}, "id": "call_123"}]
response_metadatadict{}模型返回的原始响应元数据(如 token 消耗、finish_reason 等),通常由模型调用接口自动填充。示例:{"token_usage": {"prompt_tokens": 50, "completion_tokens": 100}, "finish_reason": "stop"}
typestr"ai"消息类型标识,固定为 "ai"(无需手动设置,类内部自动定义),用于区分消息来源。

.invoke():LangChain 框架中 Runnable 接口的通用调用方法(适用于聊天模型、检索器、向量库、状态图等),用于触发目标对象的核心逻辑,接收输入数据并返回处理结果;在聊天模型场景中,主要用于传入消息列表,生成 AI 回复。

参数名类型默认值是否必填详细描述
inputSequence[BaseMessage]聊天模型的核心输入,必须是 BaseMessage 子类实例的列表(如 SystemMessageHumanMessageAIMessageToolMessage),包含对话上下文(系统提示、用户输入、历史回复、工具结果等)。
temperaturefloatNone临时覆盖模型初始化时的 temperature 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
max_tokensintNone临时覆盖模型初始化时的 max_tokens 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
stopList[str] 或 strNone临时覆盖模型初始化时的 stop 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
top_pfloatNone临时覆盖模型初始化时的 top_p 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
frequency_penaltyfloatNone临时覆盖模型初始化时的 frequency_penalty 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
presence_penaltyfloatNone临时覆盖模型初始化时的 presence_penalty 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
metadatadictNone附加的请求元数据,用于日志记录、追踪或模型服务的自定义标识(如请求 ID、用户 ID),部分模型服务支持通过元数据筛选日志。
timeoutintNone临时覆盖模型初始化时的 timeout 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
toolsList[Tool]None临时绑定到模型的工具列表,仅在本次调用中生效,优先级高于初始化时绑定的工具;若为None,沿用模型初始化的工具配置。
tool_choicestr 或 dictNone临时覆盖模型初始化时的 tool_choice 配置,仅在本次调用中生效,优先级高于初始化值;若为None,沿用模型初始化的工具调用策略。
callbacksList[BaseCallbackHandler]None回调函数列表,用于监听调用过程中的事件(如请求发送、响应接收、错误发生),可实现日志打印、进度跟踪、结果存储等自定义逻辑。
tagsList[str]None用于分类或筛选的标签列表(如 "chat""rag""debug"),可配合回调函数或日志系统,对不同类型的调用进行区分处理。
**kwargs任意-其他模型专属的临时参数(如 Anthropic 的stream、OpenAI 的user),根据模型支持的参数灵活传递,仅在本次调用中生效。

ret:AIMessage 实例,承载模型对 messages 上下文的完整响应结果,不仅包含文本回复,还隐含模型生成过程中的元数据(如回复生成时间、token 消耗等,未显式调用时不外露)。

ret.content:str(字符串),AIMessage 对象的核心属性,存储模型生成的具体文本回复内容,即用户最终能看到的 AI 回答。

from langchain.schema import (AIMessage,  # 等价于OpenAI接口中的assistant roleHumanMessage,  # 等价于OpenAI接口中的user roleSystemMessage  # 等价于OpenAI接口中的system role
)messages = [SystemMessage(content="你是聚客AI大模型课的课程助理。"),HumanMessage(content="我是学员,我叫小聚。"),AIMessage(content="欢迎!"),HumanMessage(content="我是谁?")
]ret = model.invoke(messages)print(ret.content)
③ 使用国产模型

清华源下载:pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -U langchain-deepseek

langchain:一个开源的大语言模型(LLM)应用开发框架,旨在简化基于大语言模型的复杂应用构建(如智能问答、RAG、AI 智能体、工具调用等)。

langchain.chat_models:langchain 框架下的子模块,专门用于处理 “聊天型大语言模型” 的交互逻辑。

model:封装了与 DeepSeek 模型服务交互的逻辑(如 API 调用、身份验证、参数配置等),是后续调用 deepseek-chat 模型的 “操作入口”。

init_chat_model():通用型自定义函数,用于封装各类大语言模型(如 OpenAI GPT、Anthropic Claude、阿里云通义千问等)的初始化逻辑,统一处理模型配置、认证信息、生成规则等,最终返回一个可直接调用的聊天模型实例,减少重复代码并提升配置灵活性。

参数名类型默认值是否必填详细描述
model_providerstr"openai"模型提供商,决定初始化的模型类型,常见值:"openai"(OpenAI)、"anthropic"(Anthropic)、"dashscope"(阿里云)、"baidu"(百度文心一言)等。
model_namestr"gpt-3.5-turbo"具体模型名称,需与model_provider匹配:- OpenAI:"gpt-3.5-turbo"/"gpt-4";- 阿里云:"qwen-max"/"qwen-plus";- Anthropic:"claude-3-sonnet-20240229"
api_keystrNone模型服务的 API 密钥,用于身份认证;若为None,默认从环境变量读取(需与model_provider对应,如 OpenAI 读OPENAI_API_KEY,阿里云读DASHSCOPE_API_KEY)。
base_urlstrNone模型服务的自定义基础 URL(用于私有部署、代理服务或非官方接口):- OpenAI 默认:"https://api.openai.com/v1";- 阿里云通义千问兼容 URL:"https://dashscope.aliyuncs.com/compatible-mode/v1";- 若为None,使用对应提供商的默认 URL。
temperaturefloat0.7生成文本的随机性控制:取值范围0.0~2.0;- 低值(如0.1~0.3):回复更严谨、确定;- 高值(如1.0~1.5):回复更多样、有创造性。
max_tokensint2048模型生成回复的最大 token 数(含输入 token + 输出 token),超过则截断;需根据模型上下文窗口设置(如 GPT-4 默认8192,qwen-max 支持128000)。
stopList[str] 或 strNone生成终止符:当模型生成内容中出现指定字符串时,立即停止生成;- 示例:stop=["\n用户:", "### 结束"],避免模型模拟后续对话。
top_pfloat1.0采样阈值(核采样):取值范围0.0~1.0;- 仅保留概率和达到top_p的 token 参与采样(如0.9:仅用前 90% 概率的 token),与temperature配合控制生成多样性,通常不建议同时调整两者。
frequency_penaltyfloat0.0重复内容惩罚:取值范围-2.0~2.0;- 正值(如0.5):降低模型生成重复内容的概率;- 负值(如-0.5):鼓励模型生成重复内容。
presence_penaltyfloat0.0主题新颖性惩罚:取值范围-2.0~2.0;- 正值(如0.5):鼓励模型引入新主题、新词汇;- 负值(如-0.5):鼓励模型聚焦现有主题。
timeoutint30模型请求的超时时间(单位:秒),超过时间未收到响应则抛出网络错误,避免长期阻塞。
max_retriesint2请求失败后的重试次数(如网络波动、服务临时不可用),减少偶发错误影响。
toolsList[Tool]None需绑定到模型的工具列表(如检索工具、函数调用工具),仅支持支持工具调用的模型(如 GPT-3.5-turbo-0613、qwen-max)。
tool_choicestr 或 dict"auto"工具调用策略:- "auto":模型自主决定是否调用工具;- "none":强制不调用工具,仅生成文本回复;- 工具名(如"retriever_tool"):强制调用指定工具。
**kwargs任意-其他模型专属参数,如 Anthropic 的top_k、百度文心一言的penalty_score等,根据model_provider灵活传递。

.invoke():LangChain 框架中 Runnable 接口的通用调用方法(适用于聊天模型、检索器、向量库、状态图等),用于触发目标对象的核心逻辑,接收输入数据并返回处理结果;在聊天模型场景中,主要用于传入消息列表,生成 AI 回复。

参数名类型默认值是否必填详细描述
inputSequence[BaseMessage]聊天模型的核心输入,必须是 BaseMessage 子类实例的列表(如 SystemMessageHumanMessageAIMessageToolMessage),包含对话上下文(系统提示、用户输入、历史回复、工具结果等)。
temperaturefloatNone临时覆盖模型初始化时的 temperature 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
max_tokensintNone临时覆盖模型初始化时的 max_tokens 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
stopList[str] 或 strNone临时覆盖模型初始化时的 stop 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
top_pfloatNone临时覆盖模型初始化时的 top_p 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
frequency_penaltyfloatNone临时覆盖模型初始化时的 frequency_penalty 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
presence_penaltyfloatNone临时覆盖模型初始化时的 presence_penalty 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
metadatadictNone附加的请求元数据,用于日志记录、追踪或模型服务的自定义标识(如请求 ID、用户 ID),部分模型服务支持通过元数据筛选日志。
timeoutintNone临时覆盖模型初始化时的 timeout 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
toolsList[Tool]None临时绑定到模型的工具列表,仅在本次调用中生效,优先级高于初始化时绑定的工具;若为None,沿用模型初始化的工具配置。
tool_choicestr 或 dictNone临时覆盖模型初始化时的 tool_choice 配置,仅在本次调用中生效,优先级高于初始化值;若为None,沿用模型初始化的工具调用策略。
callbacksList[BaseCallbackHandler]None回调函数列表,用于监听调用过程中的事件(如请求发送、响应接收、错误发生),可实现日志打印、进度跟踪、结果存储等自定义逻辑。
tagsList[str]None用于分类或筛选的标签列表(如 "chat""rag""debug"),可配合回调函数或日志系统,对不同类型的调用进行区分处理。
**kwargs任意-其他模型专属的临时参数(如 Anthropic 的stream、OpenAI 的user),根据模型支持的参数灵活传递,仅在本次调用中生效。

response:LangChain 的 AIMessage 实例,存储 deepseek-chat 模型对输入查询的完整响应信息,不仅包含文本回复,还可能包含元数据(如生成时间、token 消耗等)。

response.content:字符串(str),AIMessage 对象的核心属性,存储 deepseek-chat 模型生成的具体文本回复内容(即模型对查询的自然语言回答)。

from langchain.chat_models import init_chat_modelmodel = init_chat_model(model="deepseek-chat", model_provider="deepseek")response = model.invoke("你是谁")
print(response.content)

④ 流式输出

model:封装了与 DeepSeek 模型服务交互的逻辑(如 API 调用、身份验证、参数配置等),是后续调用 deepseek-chat 模型的 “操作入口”。

token:LangChain 中的 AIMessageChunk 实例,示模型流式输出的单个文本片段对象。当调用 model.stream(...) 时,模型不会一次性返回完整回复,而是将回复拆分成多个连续的小片段(类似 “打字效果”),每个片段就是一个 token

model.stream():LangChain 聊天模型实例(如通过 init_chat_model 初始化的模型)的流式响应方法,用于实现 “模型生成回复时逐段返回结果” 的效果。与 model.invoke() 一次性返回完整回复不同,stream() 会将回复拆分为多个连续的文本片段(AIMessageChunk),通过迭代器逐段输出,模拟 “实时打字” 的交互体验,提升用户对长回复的等待体验(常见于聊天界面、实时问答场景)。

参数名类型默认值是否必填详细描述
inputstr 或 Sequence[BaseMessage]模型的输入内容:- 若为 str:直接作为用户查询文本(等效于 HumanMessage(content=input));- 若为 Sequence[BaseMessage]:消息列表(含 SystemMessageHumanMessage 等),支持多轮对话上下文。示例:"你是谁" 或 [HumanMessage(content="你是谁")]
temperaturefloatNone临时覆盖模型初始化时的随机性参数(0.0~2.0),优先级高于模型默认值;None 则沿用模型初始化配置。
max_tokensintNone临时覆盖模型生成的最大 token 数限制,优先级高于模型默认值;None 则沿用模型初始化配置。
stopList[str] 或 strNone临时覆盖模型的生成终止符,当片段中出现指定字符串时停止生成;None 则沿用模型初始化配置。
stream_optionsdict{"include_usage": False}流式输出的额外配置:- include_usagebool):是否在最后一个片段中包含 token 消耗统计(如 {"usage": {"prompt_tokens": 10, "completion_tokens": 20}});- chunk_sizeint):部分模型支持指定每个片段的最大字符数(默认由模型自动决定)。
callbacksList[BaseCallbackHandler]None回调函数列表,用于监听流式输出过程中的事件(如片段生成、结束、错误),可实现日志记录、进度更新等。
tagsList[str]None用于分类的标签列表(如 "stream_chat""user_123"),便于后续追踪或筛选该次流式调用。
**kwargs任意-其他模型专属的流式参数(如部分模型支持 stream_timeout 控制超时时间),根据模型提供商的 API 扩展。

token.content:str(字符串),AIMessageChunk 对象的核心属性,存储当前流式片段的具体文本内容(即模型实时生成的部分回复文字)。

for token in model.stream("你是谁"):print(token.content, end="")

2.模型的输入与输出

Ⅰ、Prompt模板封装

① PromptTemplate 可以在模板中自定义变量

langchain:开源的大语言模型(LLM)应用开发框架,核心目标是简化 “模型 + 工具 + 数据” 协同应用的构建(如智能问答、RAG、AI 智能体等)。

langchain.prompts:langchain 框架下的提示词管理子模块,专门用于处理 “提示词的创建、格式化、复用”,解决提示词硬编码、动态参数拼接、模板化管理等问题。

langchain.prompts.PromptTemplate:langchain.prompts 子模块中的核心类,用于创建 “带变量占位符的提示词模板”,支持通过动态参数替换生成具体提示词,是构建结构化提示词的基础工具。

langchain.chat_models:LangChain 框架中专门用于处理聊天模型(Chat Models) 的核心模块,提供了统一的接口来调用各类主流大语言模型(如 GPT、DeepSeek、通义通千问等),支持对话交互、流式输出、工具调用等功能。

template:存储 “结构化的提示词模板”,通过预留的 {subject} 变量占位符,实现 “固定提示词框架 + 动态参数替换”,避免手动拼接提示词的繁琐,确保提示词格式统一。

PromptTemplate.from_template():PromptTemplate 类的类方法,用于从模板字符串快速创建 PromptTemplate 实例。与直接初始化 PromptTemplate 相比,它会自动解析模板中的变量占位符(如 {variable}),无需手动声明 input_variables,简化了模板创建流程。

参数名类型默认值是否必填描述
templatestr提示词模板字符串,包含 {变量名} 形式的占位符(如 "请解释{concept}的定义:")。方法会自动提取这些变量作为 input_variables
template_formatstr"f-string"模板格式:"f-string"(默认,Python 风格的 {变量})或 "jinja2"(支持条件、循环等复杂语法)。
validate_templateboolTrue是否校验模板合法性:True 时会检查模板中的占位符是否符合格式(如是否有未闭合的 { 或 }),不合法则抛错;False 则跳过校验。

template.format():PromptTemplate 实例的方法,用于将模板中的变量占位符替换为具体值,生成最终可直接传给模型的提示词字符串。会自动校验传入的参数是否与 input_variables 匹配(缺失或多余变量会抛错),确保提示词完整性。

参数名类型默认值是否必填描述
**kwargs(动态参数)任意需替换到模板中的变量值,键名必须与 input_variables 中的变量名一致。示例:若 input_variables=["user", "question"],则需传入 user="小聚"question="什么是LLM"

llm:LangChain 聊天模型实例,封装与 DeepSeek 模型服务交互的全部逻辑(如 API 身份验证、请求发送、响应接收),是调用 deepseek-chat 模型生成结果的 “操作入口”。

init_chat_model():通用型自定义函数,用于封装各类大语言模型(如 OpenAI GPT、Anthropic Claude、阿里云通义千问等)的初始化逻辑,统一处理模型配置、认证信息、生成规则等,最终返回一个可直接调用的聊天模型实例,减少重复代码并提升配置灵活性。

参数名类型默认值是否必填详细描述
model_providerstr"openai"模型提供商,决定初始化的模型类型,常见值:"openai"(OpenAI)、"anthropic"(Anthropic)、"dashscope"(阿里云)、"baidu"(百度文心一言)等。
model_namestr"gpt-3.5-turbo"具体模型名称,需与model_provider匹配:- OpenAI:"gpt-3.5-turbo"/"gpt-4";- 阿里云:"qwen-max"/"qwen-plus";- Anthropic:"claude-3-sonnet-20240229"
api_keystrNone模型服务的 API 密钥,用于身份认证;若为None,默认从环境变量读取(需与model_provider对应,如 OpenAI 读OPENAI_API_KEY,阿里云读DASHSCOPE_API_KEY)。
base_urlstrNone模型服务的自定义基础 URL(用于私有部署、代理服务或非官方接口):- OpenAI 默认:"https://api.openai.com/v1";- 阿里云通义千问兼容 URL:"https://dashscope.aliyuncs.com/compatible-mode/v1";- 若为None,使用对应提供商的默认 URL。
temperaturefloat0.7生成文本的随机性控制:取值范围0.0~2.0;- 低值(如0.1~0.3):回复更严谨、确定;- 高值(如1.0~1.5):回复更多样、有创造性。
max_tokensint2048模型生成回复的最大 token 数(含输入 token + 输出 token),超过则截断;需根据模型上下文窗口设置(如 GPT-4 默认8192,qwen-max 支持128000)。
stopList[str] 或 strNone生成终止符:当模型生成内容中出现指定字符串时,立即停止生成;- 示例:stop=["\n用户:", "### 结束"],避免模型模拟后续对话。
top_pfloat1.0采样阈值(核采样):取值范围0.0~1.0;- 仅保留概率和达到top_p的 token 参与采样(如0.9:仅用前 90% 概率的 token),与temperature配合控制生成多样性,通常不建议同时调整两者。
frequency_penaltyfloat0.0重复内容惩罚:取值范围-2.0~2.0;- 正值(如0.5):降低模型生成重复内容的概率;- 负值(如-0.5):鼓励模型生成重复内容。
presence_penaltyfloat0.0主题新颖性惩罚:取值范围-2.0~2.0;- 正值(如0.5):鼓励模型引入新主题、新词汇;- 负值(如-0.5):鼓励模型聚焦现有主题。
timeoutint30模型请求的超时时间(单位:秒),超过时间未收到响应则抛出网络错误,避免长期阻塞。
max_retriesint2请求失败后的重试次数(如网络波动、服务临时不可用),减少偶发错误影响。
toolsList[Tool]None需绑定到模型的工具列表(如检索工具、函数调用工具),仅支持支持工具调用的模型(如 GPT-3.5-turbo-0613、qwen-max)。
tool_choicestr 或 dict"auto"工具调用策略:- "auto":模型自主决定是否调用工具;- "none":强制不调用工具,仅生成文本回复;- 工具名(如"retriever_tool"):强制调用指定工具。
**kwargs任意-其他模型专属参数,如 Anthropic 的top_k、百度文心一言的penalty_score等,根据model_provider灵活传递。

ret:LangChain 的 AIMessage 实例,存储 deepseek-chat 模型对输入查询("你是谁")的完整响应信息,不仅包含文本回复,还可能包含元数据(如生成时间、token 消耗等)。

.invoke():LangChain 框架中 Runnable 接口的通用调用方法(适用于聊天模型、检索器、向量库、状态图等),用于触发目标对象的核心逻辑,接收输入数据并返回处理结果;在聊天模型场景中,主要用于传入消息列表,生成 AI 回复。

参数名类型默认值是否必填详细描述
inputSequence[BaseMessage]聊天模型的核心输入,必须是 BaseMessage 子类实例的列表(如 SystemMessageHumanMessageAIMessageToolMessage),包含对话上下文(系统提示、用户输入、历史回复、工具结果等)。
temperaturefloatNone临时覆盖模型初始化时的 temperature 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
max_tokensintNone临时覆盖模型初始化时的 max_tokens 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
stopList[str] 或 strNone临时覆盖模型初始化时的 stop 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
top_pfloatNone临时覆盖模型初始化时的 top_p 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
frequency_penaltyfloatNone临时覆盖模型初始化时的 frequency_penalty 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
presence_penaltyfloatNone临时覆盖模型初始化时的 presence_penalty 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
metadatadictNone附加的请求元数据,用于日志记录、追踪或模型服务的自定义标识(如请求 ID、用户 ID),部分模型服务支持通过元数据筛选日志。
timeoutintNone临时覆盖模型初始化时的 timeout 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
toolsList[Tool]None临时绑定到模型的工具列表,仅在本次调用中生效,优先级高于初始化时绑定的工具;若为None,沿用模型初始化的工具配置。
tool_choicestr 或 dictNone临时覆盖模型初始化时的 tool_choice 配置,仅在本次调用中生效,优先级高于初始化值;若为None,沿用模型初始化的工具调用策略。
callbacksList[BaseCallbackHandler]None回调函数列表,用于监听调用过程中的事件(如请求发送、响应接收、错误发生),可实现日志打印、进度跟踪、结果存储等自定义逻辑。
tagsList[str]None用于分类或筛选的标签列表(如 "chat""rag""debug"),可配合回调函数或日志系统,对不同类型的调用进行区分处理。
**kwargs任意-其他模型专属的临时参数(如 Anthropic 的stream、OpenAI 的user),根据模型支持的参数灵活传递,仅在本次调用中生效。

ret.content:str(字符串),AIMessageChunk 对象的核心属性,存储当前流式片段的具体文本内容(即模型实时生成的部分回复文字)。

from langchain.prompts import PromptTemplatetemplate = PromptTemplate.from_template("给我讲个关于{subject}的笑话")
print("===Template===")
print(template)
print("===Prompt===")
print(template.format(subject='小明'))from langchain.chat_models import init_chat_model# 定义 LLM
llm = init_chat_model("deepseek-chat", model_provider="deepseek")
# 通过 Prompt 调用 LLM
ret = llm.invoke(template.format(subject='小明'))
# 打印输出
print(ret.content)
② ChatPromptTemplate 用模板表示的对话上下文

langchain:开源的大语言模型(LLM)应用开发框架,核心目标是简化 “模型 + 工具 + 数据” 协同应用的构建(如智能问答、RAG、AI 智能体等)。

langchain.prompts:langchain 框架下的提示词管理子模块,专门用于处理 “提示词的创建、格式化、复用”,解决提示词硬编码、动态参数拼接、模板化管理等问题。

langchain.prompts.PromptTemplate:langchain.prompts 子模块中的核心类,用于创建 “带变量占位符的提示词模板”,支持通过动态参数替换生成具体提示词,是构建结构化提示词的基础工具。

langchain.prompts.HumanMessagePromptTemplate:生成 “用户消息(HumanMessage)的模板”,用于将动态内容(如用户输入的变量)与固定文本结合,生成结构化的 HumanMessage 实例。相比直接手动创建 HumanMessage,它支持通过变量动态替换内容,更适合需要根据上下文生成用户消息的场景(如多轮对话中动态插入用户的新输入)。

参数名类型默认值是否必填描述
promptPromptTemplate基础提示词模板(PromptTemplate 实例),包含用户消息的固定结构和变量占位符(如 PromptTemplate.from_template("用户问:{question}"))。
additional_kwargsdict{}附加元数据,会被传递到生成的 HumanMessage 实例中(如用户 ID、时间戳等),格式为键值对。

langchain.prompts.SystemMessagePromptTemplate:生成 “系统消息(SystemMessage)的模板”,用于将动态配置(如角色参数、场景变量)与固定系统指令结合,生成结构化的 SystemMessage 实例。适合需要根据不同场景动态调整系统提示的场景(如切换 AI 角色、修改回答规则)。

参数名类型默认值是否必填描述
promptPromptTemplate基础提示词模板(PromptTemplate 实例),包含系统指令的固定结构和变量占位符(如 PromptTemplate.from_template("你是{role},需{rule}"))。
additional_kwargsdict{}附加元数据,会被传递到生成的 SystemMessage 实例中(如提示版本、场景标识等),格式为键值对。

langchain:一个开源的大语言模型(LLM)应用开发框架,旨在简化基于大语言模型的复杂应用构建(如智能问答、RAG、AI 智能体、工具调用等)。

langchain.chat_models:langchain 框架下的子模块,专门用于处理 “聊天型大语言模型” 的交互逻辑。

model:封装了与 DeepSeek 模型服务交互的逻辑。

llm:LangChain 聊天模型实例,封装与 DeepSeek 模型服务交互的全部逻辑(如 API 身份验证、请求发送、响应接收),是调用 deepseek-chat 模型生成结果的 “操作入口”。

init_chat_model():通用型自定义函数,用于封装各类大语言模型(如 OpenAI GPT、Anthropic Claude、阿里云通义千问等)的初始化逻辑,统一处理模型配置、认证信息、生成规则等,最终返回一个可直接调用的聊天模型实例,减少重复代码并提升配置灵活性。

参数名类型默认值是否必填详细描述
model_providerstr"openai"模型提供商,决定初始化的模型类型,常见值:"openai"(OpenAI)、"anthropic"(Anthropic)、"dashscope"(阿里云)、"baidu"(百度文心一言)等。
model_namestr"gpt-3.5-turbo"具体模型名称,需与model_provider匹配:- OpenAI:"gpt-3.5-turbo"/"gpt-4";- 阿里云:"qwen-max"/"qwen-plus";- Anthropic:"claude-3-sonnet-20240229"
api_keystrNone模型服务的 API 密钥,用于身份认证;若为None,默认从环境变量读取(需与model_provider对应,如 OpenAI 读OPENAI_API_KEY,阿里云读DASHSCOPE_API_KEY)。
base_urlstrNone模型服务的自定义基础 URL(用于私有部署、代理服务或非官方接口):- OpenAI 默认:"https://api.openai.com/v1";- 阿里云通义千问兼容 URL:"https://dashscope.aliyuncs.com/compatible-mode/v1";- 若为None,使用对应提供商的默认 URL。
temperaturefloat0.7生成文本的随机性控制:取值范围0.0~2.0;- 低值(如0.1~0.3):回复更严谨、确定;- 高值(如1.0~1.5):回复更多样、有创造性。
max_tokensint2048模型生成回复的最大 token 数(含输入 token + 输出 token),超过则截断;需根据模型上下文窗口设置(如 GPT-4 默认8192,qwen-max 支持128000)。
stopList[str] 或 strNone生成终止符:当模型生成内容中出现指定字符串时,立即停止生成;- 示例:stop=["\n用户:", "### 结束"],避免模型模拟后续对话。
top_pfloat1.0采样阈值(核采样):取值范围0.0~1.0;- 仅保留概率和达到top_p的 token 参与采样(如0.9:仅用前 90% 概率的 token),与temperature配合控制生成多样性,通常不建议同时调整两者。
frequency_penaltyfloat0.0重复内容惩罚:取值范围-2.0~2.0;- 正值(如0.5):降低模型生成重复内容的概率;- 负值(如-0.5):鼓励模型生成重复内容。
presence_penaltyfloat0.0主题新颖性惩罚:取值范围-2.0~2.0;- 正值(如0.5):鼓励模型引入新主题、新词汇;- 负值(如-0.5):鼓励模型聚焦现有主题。
timeoutint30模型请求的超时时间(单位:秒),超过时间未收到响应则抛出网络错误,避免长期阻塞。
max_retriesint2请求失败后的重试次数(如网络波动、服务临时不可用),减少偶发错误影响。
toolsList[Tool]None需绑定到模型的工具列表(如检索工具、函数调用工具),仅支持支持工具调用的模型(如 GPT-3.5-turbo-0613、qwen-max)。
tool_choicestr 或 dict"auto"工具调用策略:- "auto":模型自主决定是否调用工具;- "none":强制不调用工具,仅生成文本回复;- 工具名(如"retriever_tool"):强制调用指定工具。
**kwargs任意-其他模型专属参数,如 Anthropic 的top_k、百度文心一言的penalty_score等,根据model_provider灵活传递。

template:存储 “结构化的提示词模板”,通过预留的 {subject} 变量占位符,实现 “固定提示词框架 + 动态参数替换”,避免手动拼接提示词的繁琐,确保提示词格式统一。

prompt:List[BaseMessage]SystemMessage 和 HumanMessage 组成的列表,即结构化的消息对象列表)。作为模型的完整输入上下文,包含系统提示(定义 AI 角色)和用户查询(需要 AI 响应的问题),确保模型明确自身角色和用户需求。

ChatPromptTemplate.from_messages():ChatPromptTemplate 类的类方法,用于整合多个消息模板(或消息字符串),创建一个包含多角色的聊天提示词模板。支持将 SystemMessagePromptTemplateHumanMessagePromptTemplate 等不同角色的模板组合成一个整体,生成可动态替换变量的结构化提示词模板,最终用于生成完整的对话上下文消息列表。

参数名类型默认值是否必填描述
messagesList[Union[BaseMessagePromptTemplate, str, Tuple[str, str]]]消息模板列表,支持三种元素类型:- BaseMessagePromptTemplate:如 SystemMessagePromptTemplateHumanMessagePromptTemplate(带变量的消息模板);- str:纯文本消息(默认视为 HumanMessage);- Tuple[str, str]:元组 (角色标识, 文本),角色标识支持 "system"/"human"/"ai"(如 ("system", "你是助手") 等价于 SystemMessage)。

.from_template():ChatPromptTemplate 类的简化类方法,用于从单一字符串模板快速创建聊天提示词模板,默认将模板视为 “人类消息(HumanMessage)”,适合仅需单一角色(用户)提示词的场景,避免手动创建 HumanMessagePromptTemplate 的繁琐。

参数名类型默认值是否必填描述
templatestr字符串模板,含变量占位符(如 "请分析{text}的情感倾向"),默认作为人类消息的内容。
template_formatstr"f-string"模板格式:"f-string"(默认)或 "jinja2",与 PromptTemplate 一致。
validate_templateboolTrue是否校验模板合法性(如占位符格式),不合法则抛错。

.format_messages():ChatPromptTemplate 实例的方法,用于将模板中的所有变量替换为具体值,生成结构化的消息对象列表SystemMessage/HumanMessage 等实例),可直接作为模型 invoke 或 stream 方法的 messages 参数,无需手动转换格式。

参数名类型默认值是否必填描述
**kwargs(动态参数)任意需替换到模板中的变量值,键名必须与 input_variables 中的变量名一致。示例:若 input_variables=["topic", "question"],则需传入 topic="AI"question="什么是RAG"

ret:AIMessage 实例,存储模型(gpt-4o-mini)对输入 prompt 的完整响应结果,不仅包含文本回复,还隐含生成过程的元数据(如 token 消耗、生成时间等,未显式展示)。

.invoke():LangChain 框架中 Runnable 接口的通用调用方法(适用于聊天模型、检索器、向量库、状态图等),用于触发目标对象的核心逻辑,接收输入数据并返回处理结果;在聊天模型场景中,主要用于传入消息列表,生成 AI 回复。

参数名类型默认值是否必填详细描述
inputSequence[BaseMessage]聊天模型的核心输入,必须是 BaseMessage 子类实例的列表(如 SystemMessageHumanMessageAIMessageToolMessage),包含对话上下文(系统提示、用户输入、历史回复、工具结果等)。
temperaturefloatNone临时覆盖模型初始化时的 temperature 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
max_tokensintNone临时覆盖模型初始化时的 max_tokens 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
stopList[str] 或 strNone临时覆盖模型初始化时的 stop 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
top_pfloatNone临时覆盖模型初始化时的 top_p 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
frequency_penaltyfloatNone临时覆盖模型初始化时的 frequency_penalty 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
presence_penaltyfloatNone临时覆盖模型初始化时的 presence_penalty 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
metadatadictNone附加的请求元数据,用于日志记录、追踪或模型服务的自定义标识(如请求 ID、用户 ID),部分模型服务支持通过元数据筛选日志。
timeoutintNone临时覆盖模型初始化时的 timeout 配置,优先级高于初始化值;若为None,沿用模型初始化的默认值。
toolsList[Tool]None临时绑定到模型的工具列表,仅在本次调用中生效,优先级高于初始化时绑定的工具;若为None,沿用模型初始化的工具配置。
tool_choicestr 或 dictNone临时覆盖模型初始化时的 tool_choice 配置,仅在本次调用中生效,优先级高于初始化值;若为None,沿用模型初始化的工具调用策略。
callbacksList[BaseCallbackHandler]None回调函数列表,用于监听调用过程中的事件(如请求发送、响应接收、错误发生),可实现日志打印、进度跟踪、结果存储等自定义逻辑。
tagsList[str]None用于分类或筛选的标签列表(如 "chat""rag""debug"),可配合回调函数或日志系统,对不同类型的调用进行区分处理。
**kwargs任意-其他模型专属的临时参数(如 Anthropic 的stream、OpenAI 的user),根据模型支持的参数灵活传递,仅在本次调用中生效。

ret.content:str(字符串),AIMessage 对象的核心属性,存储模型生成的具体文本回复内容(即用户最终看到的 AI 回答)。

from langchain.prompts import (ChatPromptTemplate,HumanMessagePromptTemplate,SystemMessagePromptTemplate,
)
from langchain.chat_models import init_chat_model
llm = init_chat_model("gpt-4o-mini", model_provider="openai")template = ChatPromptTemplate.from_messages([SystemMessagePromptTemplate.from_template("你是{product}的客服助手。你的名字叫{name}"),HumanMessagePromptTemplate.from_template("{query}")]
)prompt = template.format_messages(product="聚客AI大模型课程",name="小聚",query="你是谁"
)print(prompt)ret = llm.invoke(prompt)print(ret.content)
③ 把多轮对话变成模板

langchain:开源的大语言模型(LLM)应用开发框架,核心目标是简化 “模型 + 工具 + 数据” 协同应用的构建(如智能问答、RAG、AI 智能体等)。

langchain.prompts:langchain 框架下的提示词管理子模块,专门用于处理 “提示词的创建、格式化、复用”,解决提示词硬编码、动态参数拼接、模板化管理等问题。

langchain.prompts.PromptTemplate:langchain.prompts 子模块中的核心类,用于创建 “带变量占位符的提示词模板”,支持通过动态参数替换生成具体提示词,是构建结构化提示词的基础工具。

langchain:一个开源的大语言模型(LLM)应用开发框架,旨在简化基于大语言模型的复杂应用构建(如智能问答、RAG、AI 智能体、工具调用等)。

langchain.chat_models:langchain 框架下的子模块,专门用于处理 “聊天型大语言模型” 的交互逻辑。

langchain_core:LangChain 生态的 底层核心模块,是整个框架的 “骨架” 和 “基础设施”。它定义了所有组件的基础数据结构、抽象接口和核心交互逻辑,为上层模块(如 langchainlangchain_communitylangchain_openai 等)提供统一的 “语言” 和 “规则”,确保不同组件(模型、工具、链等)能无缝协作。

langchain_core.messages:langchain_core 中专注于 对话消息处理 的子模块,定义了一系列消息类,用于规范 LLM 对话中 “不同角色的输入输出” 格式(如系统提示、用户提问、AI 回复、工具调用结果等),是构建多轮对话、工具调用等场景的基础。

init_chat_model():LangChain 提供的聊天模型统一初始化函数,支持通过简单参数快速创建不同厂商的聊天模型实例(如 DeepSeek、OpenAI、通义千问),屏蔽不同模型的底层差异,降低切换模型的成本。

参数名类型默认值是否必填核心描述
modelstr模型名称,需与 model_provider 匹配,如:- provider="deepseek" 时:"deepseek-chat"- provider="openai" 时:"gpt-3.5-turbo"
model_providerstr模型厂商 / 提供方,可选值:"deepseek"(深度求索)、"openai"(OpenAI)、"tongyi"(阿里云通义千问)等。
model_kwargsDict[str, Any]{}模型专属参数,如:- api_key(API 密钥,本地模型可填任意字符串)- base_url(模型接口地址,本地模型填 http://localhost:8000/v1/chat/completions)- temperature(随机性,0-1)- max_tokens(最大生成长度)。
streamingboolFalse是否默认启用流式输出。设为 True 后,调用 model.invoke() 也会返回流式生成器(需配合循环处理)。
callbacksList[BaseCallbackHandler]None回调函数列表,用于监听模型调用过程(如记录日志、统计耗时),需传入 BaseCallbackHandler 子类实例。

llm:

human_prompt:

human_message_template:

HumanMessagePromptTemplate.from_template():创建仅包含 “人类用户角色” 的提示词模板,用于快速生成标准化的用户输入格式(封装为 HumanMessage 类型)。区别于普通文本模板,该函数生成的模板会明确标记消息角色为 “human”,直接适配聊天模型的输入要求(无需手动创建 HumanMessage 对象)。

参数名类型默认值是否必填核心描述
templatestr人类用户的提示词模板字符串,支持变量占位符(用 {变量名} 表示,如 "请分析{文本}的情感")。
template_formatstr"f-string"模板解析格式,可选值:- "f-string"(默认,Python 格式化字符串)- "jinja2"(支持 Jinja2 语法,如条件判断、循环)。
input_variablesList[str]None模板中需要填充的变量名列表(如 ["文本"])。若为 None,会自动从 template 中提取占位符作为变量。
validate_templateboolTrue是否验证模板格式合法性(如检查占位符是否匹配变量)。设为 False 可跳过验证(用于复杂模板场景)。

chat_prompt:

human_message:

ai_message:

ChatPromptTemplate.from_messages():创建多角色对话的提示词模板,支持组合 “系统提示(System)”“人类输入(Human)”“AI 历史回答(AI)” 等多种角色的消息,构建完整的对话上下文模板,是构建复杂聊天场景的核心工具(如带系统角色的对话、含历史记录的多轮交互)。

参数名类型默认值是否必填核心描述
messagesList[Union[BaseMessagePromptTemplate, Tuple[str, str]]]多角色消息列表,支持两种格式:1. 元组格式:(角色名, 模板字符串),角色名可选 "system"/"human"/"ai"(如 ("system", "你是数学老师"));2. 模板对象格式:直接传入 SystemMessagePromptTemplate/HumanMessagePromptTemplate 实例(如前文创建的 human_template)。
template_formatstr"f-string"统一的模板解析格式,优先级低于单个消息模板的 template_format(即单个消息模板可单独指定格式),可选 "f-string" 或 "jinja2"
input_variablesList[str]None整个对话模板中需要填充的所有变量名列表。若为 None,会自动合并所有子模板的变量。
validate_templateboolTrue是否验证所有子模板的格式合法性(如变量占位符是否完整)。设为 False 可跳过验证。
from langchain.prompts import (ChatPromptTemplate,HumanMessagePromptTemplate,MessagesPlaceholder,
)from langchain.chat_models import init_chat_model# 定义 LLM
llm = init_chat_model("deepseek-chat", model_provider="deepseek")human_prompt = "Translate your answer to {language}."
human_message_template = HumanMessagePromptTemplate.from_template(human_prompt)chat_prompt = ChatPromptTemplate.from_messages(# variable_name 是 message placeholder 在模板中的变量名# 用于在赋值时使用[MessagesPlaceholder("history"), human_message_template]
)from langchain_core.messages import AIMessage, HumanMessagehuman_message = HumanMessage(content="Who is Elon Musk?")
ai_message = AIMessage(content="Elon Musk is a billionaire entrepreneur, inventor, and industrial designer"
)messages = chat_prompt.format_prompt(# 对 "history" 和 "language" 赋值history=[human_message, ai_message], language="中文"
)print(messages.to_messages())result = llm.invoke(messages)
print(result.content)

Ⅱ、从文件加载Prompt模板

langchain:开源的大语言模型(LLM)应用开发框架,核心目标是简化 “模型 + 工具 + 数据” 协同应用的构建(如智能问答、RAG、AI 智能体等)。

langchain.prompts:langchain 框架下的提示词管理子模块,专门用于处理 “提示词的创建、格式化、复用”,解决提示词硬编码、动态参数拼接、模板化管理等问题。

template:提示词模板对象。它本质上是一个包含占位符(如 {topic})的文本模板,用于动态生成特定场景的提示词。

.from_file():通常是类的类方法(如提示词模板类、配置类),用于从本地文件加载内容并创建类实例,避免将模板文本、配置信息硬编码在代码中,方便单独管理文件(如提示词模板文件、JSON 配置文件)。

参数名类型默认值是否必填描述
file_pathstr本地文件路径(如 "./prompts/qa_template.txt"),文件内容为提示词模板字符串(含 {变量} 占位符)。
input_variablesList[str]模板中变量的名称列表(需与文件中 {变量名} 一一对应,如 ["question", "context"])。
encodingstr"utf-8"文件编码格式(如读取 GBK 编码文件需指定 encoding="gbk")。

.format():实例方法,用于将对象中的 “变量占位符” 替换为具体值,生成最终内容。在 LangChain 中,最常用的是 PromptTemplate 实例的 .format() 方法,用于将提示词模板中的 {变量} 替换为实际值,返回纯字符串;此外,Python 字符串本身也有 .format() 方法(功能类似)。

参数名类型默认值是否必填描述
**kwargs键值对模板中变量的具体值,键为变量名(如 text="..."),值为替换后的内容(字符串、数字等)。
from langchain.prompts import PromptTemplatetemplate = PromptTemplate.from_file("example_prompt_template.txt")
print("===Template===")
print(template)
print("===Prompt===")
print(template.format(topic='黑色幽默'))

3.结构化输出

Ⅰ、直接输出Pydantic对象

pydantic:pydantic 是一个 数据验证与序列化库,核心作用是通过 “定义模型” 确保输入 / 输出数据的类型、结构、约束符合预期,自动捕获数据错误(如类型不匹配、值超出范围),同时支持数据格式转换(如字典转模型、模型转 JSON)。

pydantic.BaseModel:pydantic.BaseModel 是 pydantic 库的 数据模型基类,所有自定义的数据模型都需继承它,通过 “类属性定义字段” 即可自动生成数据验证逻辑和便捷方法(如 dict()json())。

langchain:开源的大语言模型(LLM)应用开发框架,核心目标是简化 “模型 + 工具 + 数据” 协同应用的构建(如智能问答、RAG、AI 智能体等)。

langchain.prompts:langchain 框架下的提示词管理子模块,专门用于处理 “提示词的创建、格式化、复用”,解决提示词硬编码、动态参数拼接、模板化管理等问题。

langchain_core:LangChain 生态的 底层核心模块,是整个框架的 “骨架”,定义了所有组件的基础数据结构、抽象接口和核心交互逻辑,是 langchainlangchain_community 等上层模块的依赖基础。

langchain_core.output_parsers:langchain_core 中专注于 模型输出解析 的子模块,提供一系列工具将 LLM 生成的原始响应(通常是 AIMessage 对象或字符串)转换为结构化数据(如纯字符串、JSON、列表、自定义对象),解决 “模型输出格式不统一、手动解析繁琐” 的问题。

Data(BaseModel):定义自定义数据模型(继承pydantic.BaseModel)

llm:基础的大语言模型实例,用于处理自然语言输入并生成文本输出。

init_chat_model():通用型自定义函数,用于封装各类大语言模型(如 OpenAI GPT、Anthropic Claude、阿里云通义千问等)的初始化逻辑,统一处理模型配置、认证信息、生成规则等,最终返回一个可直接调用的聊天模型实例,减少重复代码并提升配置灵活性。

参数名类型默认值是否必填详细描述
model_providerstr"openai"模型提供商,决定初始化的模型类型,常见值:"openai"(OpenAI)、"anthropic"(Anthropic)、"dashscope"(阿里云)、"baidu"(百度文心一言)等。
model_namestr"gpt-3.5-turbo"具体模型名称,需与model_provider匹配:- OpenAI:"gpt-3.5-turbo"/"gpt-4";- 阿里云:"qwen-max"/"qwen-plus";- Anthropic:"claude-3-sonnet-20240229"
api_keystrNone模型服务的 API 密钥,用于身份认证;若为None,默认从环境变量读取(需与model_provider对应,如 OpenAI 读OPENAI_API_KEY,阿里云读DASHSCOPE_API_KEY)。
base_urlstrNone模型服务的自定义基础 URL(用于私有部署、代理服务或非官方接口):- OpenAI 默认:"https://api.openai.com/v1";- 阿里云通义千问兼容 URL:"https://dashscope.aliyuncs.com/compatible-mode/v1";- 若为None,使用对应提供商的默认 URL。
temperaturefloat0.7生成文本的随机性控制:取值范围0.0~2.0;- 低值(如0.1~0.3):回复更严谨、确定;- 高值(如1.0~1.5):回复更多样、有创造性。
max_tokensint2048模型生成回复的最大 token 数(含输入 token + 输出 token),超过则截断;需根据模型上下文窗口设置(如 GPT-4 默认8192,qwen-max 支持128000)。
stopList[str] 或 strNone生成终止符:当模型生成内容中出现指定字符串时,立即停止生成;- 示例:stop=["\n用户:", "### 结束"],避免模型模拟后续对话。
top_pfloat1.0采样阈值(核采样):取值范围0.0~1.0;- 仅保留概率和达到top_p的 token 参与采样(如0.9:仅用前 90% 概率的 token),与temperature配合控制生成多样性,通常不建议同时调整两者。
frequency_penaltyfloat0.0重复内容惩罚:取值范围-2.0~2.0;- 正值(如0.5):降低模型生成重复内容的概率;- 负值(如-0.5):鼓励模型生成重复内容。
presence_penaltyfloat0.0主题新颖性惩罚:取值范围-2.0~2.0;- 正值(如0.5):鼓励模型引入新主题、新词汇;- 负值(如-0.5):鼓励模型聚焦现有主题。
timeoutint30模型请求的超时时间(单位:秒),超过时间未收到响应则抛出网络错误,避免长期阻塞。
max_retriesint2请求失败后的重试次数(如网络波动、服务临时不可用),减少偶发错误影响。
toolsList[Tool]None需绑定到模型的工具列表(如检索工具、函数调用工具),仅支持支持工具调用的模型(如 GPT-3.5-turbo-0613、qwen-max)。
tool_choicestr 或 dict"auto"工具调用策略:- "auto":模型自主决定是否调用工具;- "none":强制不调用工具,仅生成文本回复;- 工具名(如"retriever_tool"):强制调用指定工具。
**kwargs任意-其他模型专属参数,如 Anthropic 的top_k、百度文心一言的penalty_score等,根据model_provider灵活传递。

Field():pydantic.Field 用于为 Pydantic 模型的字段添加精细化约束(如默认值、值范围、描述等),是定义结构化数据(如工具输入、模型输出格式)的核心工具,确保数据类型和规则符合预期。

参数作用
default设置默认值(... 表示必填,None 表示可选)
ge/le数值类型的 “大于等于”/“小于等于” 约束(如 ge=1 表示值≥1)
min_length/max_length字符串的最小 / 最大长度约束
description字段描述(用于提示模型生成符合要求的输出)

structured_llm:在基础 llm 上增强结构化输出能力的模型实例,能直接返回符合指定数据结构(如 Pydantic 模型)的结果。

.with_structured_output():LangChain 中 为语言模型(LLM)配置结构化输出 的方法,通过指定输出 schema(如 Pydantic 模型、JSON 结构),让模型直接返回符合结构的结果,无需手动解析原始文本,简化 “模型输出→结构化数据” 的流程。

参数作用
schema输出结构定义(可以是 Pydantic 模型类、dict 或 list,指定输出格式)
parser自定义输出解析器(可选,默认自动匹配 schema 类型)

template:字符串 """提取用户输入中的日期。用户输入:{query}""",固定逻辑为 “提取用户输入中的日期”,{query} 为待填充的用户输入变量。

prompt:基于 template 创建的提示词模板对象,自动识别变量 {query} 作为输入参数。

PromptTemplate():LangChain 中用于 创建带变量的提示词模板 的类,将固定文本与动态变量分离(如 {query}{context}),通过变量替换生成具体提示词,避免手动拼接字符串,确保提示词结构统一。

参数作用
input_variables模板中变量名称的列表(如 ["query", "context"]
template提示词模板字符串(含 {变量名} 占位符,如 "基于{context}回答:{query}"

query:用户的原始输入文本,即需要模型处理的内容。

input_prompt:填充变量后的最终提示词对象,是模型实际接收的输入。

.format_prompt():PromptTemplate 实例的方法,用于 将模板中的变量替换为具体值,生成 PromptValue 对象(而非纯字符串)。PromptValue 是适配不同模型输入格式的 “中间载体”:

  • 对文本模型(如 GPT-3):通过 .to_string() 转为字符串;
  • 对聊天模型(如 gpt-3.5-turbo):通过 .to_messages() 转为 BaseMessage 列表(如 HumanMessage)。

.invoke():是 LangChain 中 Runnable 接口(所有可参与流程编排的组件,如模型、链、检索器、提示词模板等均实现此接口)的核心同步调用方法,用于触发组件执行并返回结果。其核心作用是接收输入数据,经过组件处理后返回输出结果,是连接 “组件定义” 与 “实际执行” 的桥梁。

参数名类型默认值是否必填描述
input任意类型(因组件而异)组件的输入数据,类型随组件不同而变化:- 模型(如 ChatOpenAI):可接收字符串、BaseMessage 列表或 PromptValue;- 检索器(Retriever):接收查询字符串(str);- 链(Chain):接收字典(dict,键为链的输入变量);- 提示词模板(PromptTemplate):接收字典(dict,键为模板变量)。
configRunnableConfig 或 NoneNone组件执行的配置信息,包含:- callbacks:回调函数列表(用于日志、进度跟踪);- tags:标签列表(用于分类执行记录);- metadata:元数据字典(附加执行信息);- 动态参数(如通过 configurable_alternatives 定义的可替换组件参数)。
**kwargs任意组件特定的额外参数(不同组件可能有专属参数,如模型调用时的 temperature 临时覆盖,但不推荐,优先通过 config 或组件初始化时配置)。
from pydantic import BaseModel, Field
from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
from langchain_core.output_parsers import PydanticOutputParserfrom langchain.chat_models import init_chat_model
llm = init_chat_model("gpt-4o-mini", model_provider="openai")# 定义你的输出对象
class Date(BaseModel):year: int = Field(description="Year")month: int = Field(description="Month")day: int = Field(description="Day")era: str = Field(description="BC or AD")# 定义结构化输出的模型
structured_llm = llm.with_structured_output(Date)template = """提取用户输入中的日期。
用户输入:
{query}"""prompt = PromptTemplate(template=template,
)query = "2023年四月6日天气晴..."
input_prompt = prompt.format_prompt(query=query)structured_llm.invoke(input_prompt)

Ⅱ、输出指定格式的JSON

json_schema:定义模型输出的JSON 结构规范,相当于给模型的输出 “画一个模板”,强制模型按照返回符合该结构的 JSON 数据。

structured_llm:在基础 llm(如 OpenAI 的 gpt-4o-mini)上增强了结构化输出能力的模型实例,能够直接返回符合 json_schema 定义的 JSON 格式数据。

.with_structured_output():LangChain 中 为语言模型(LLM)配置结构化输出 的方法,通过指定输出 schema(如 Pydantic 模型、JSON 结构),让模型直接返回符合结构的结果,无需手动解析原始文本,简化 “模型输出→结构化数据” 的流程。

参数作用
schema输出结构定义(可以是 Pydantic 模型类、dict 或 list,指定输出格式)
parser自定义输出解析器(可选,默认自动匹配 schema 类型)

.invoke():是 LangChain 中 Runnable 接口(所有可参与流程编排的组件,如模型、链、检索器、提示词模板等均实现此接口)的核心同步调用方法,用于触发组件执行并返回结果。其核心作用是接收输入数据,经过组件处理后返回输出结果,是连接 “组件定义” 与 “实际执行” 的桥梁。

参数名类型默认值是否必填描述
input任意类型(因组件而异)组件的输入数据,类型随组件不同而变化:- 模型(如 ChatOpenAI):可接收字符串、BaseMessage 列表或 PromptValue;- 检索器(Retriever):接收查询字符串(str);- 链(Chain):接收字典(dict,键为链的输入变量);- 提示词模板(PromptTemplate):接收字典(dict,键为模板变量)。
configRunnableConfig 或 NoneNone组件执行的配置信息,包含:- callbacks:回调函数列表(用于日志、进度跟踪);- tags:标签列表(用于分类执行记录);- metadata:元数据字典(附加执行信息);- 动态参数(如通过 configurable_alternatives 定义的可替换组件参数)。
**kwargs任意组件特定的额外参数(不同组件可能有专属参数,如模型调用时的 temperature 临时覆盖,但不推荐,优先通过 config 或组件初始化时配置)。
# OpenAI 模型的JSON格式
json_schema = {"title": "Date","description": "Formated date expression","type": "object","properties": {"year": {"type": "integer","description": "year, YYYY",},"month": {"type": "integer","description": "month, MM",},"day": {"type": "integer","description": "day, DD",},"era": {"type": "string","description": "BC or AD",},},
}
structured_llm = llm.with_structured_output(json_schema)structured_llm.invoke(input_prompt)

Ⅲ、使用OutputParser

langchain_core:LangChain 生态的 底层核心模块,是整个框架的 “骨架” 和 “基础设施”。它定义了所有组件的基础数据结构、抽象接口和核心交互逻辑,为上层模块(如 langchainlangchain_communitylangchain_openai 等)提供统一的 “语言” 和 “规则”,确保不同组件(模型、工具、链等)能无缝协作。

langchain_core.messages:langchain_core 中专注于 对话消息处理 的子模块,定义了一系列消息类,用于规范 LLM 对话中 “不同角色的输入输出” 格式(如系统提示、用户提问、AI 回复、工具调用结果等),是构建多轮对话、工具调用等场景的基础。

parser:将模型生成的原始文本输出(通常是 JSON 格式的字符串)解析为结构化数据(如 Pydantic 模型对象或字典),避免手动处理字符串解析的繁琐。

JsonOutputParser():LangChain 中用于 解析模型输出为 JSON 结构 的工具,能将模型生成的 JSON 格式文本转换为 Python 字典或 Pydantic 模型对象,并自动校验 JSON 格式的合法性。若模型输出不符合 JSON 规范(如语法错误),会抛出明确错误,避免下游逻辑因格式混乱崩溃。

参数名类型默认值说明
pydantic_objectType[BaseModel]None可选参数,指定 Pydantic 模型类(如自定义的 UserInfo)。若传入,解析结果会自动转换为该模型实例,并校验字段类型和约束(如数值范围、字符串长度);若不传入,默认解析为 Python 字典。

prompt:定义包含 “格式约束” 的提示词模板,确保模型生成的文本符合 parser 可解析的格式(如标准 JSON)。

PromptTemplate():LangChain 中用于 创建带动态变量的提示词模板 的类,通过分离 “固定文本结构” 和 “动态变量”(如 {query}{context}),实现提示词的复用和标准化。核心价值是避免手动拼接字符串,确保不同输入场景下提示词格式一致。

参数名类型默认值说明
input_variablesList[str]必传模板中所有变量的名称列表(如 ["question", "limit"]),需与模板中的 {变量名} 一一对应。
templatestr必传提示词模板字符串,包含 {变量名} 占位符(如 "请用{limit}字回答:{question}")。
template_formatstr"f-string"模板格式,支持:- "f-string"(默认):简单变量替换(如 {name});- "jinja2":支持复杂逻辑(如条件判断 {% if age > 18 %})。
validate_templateboolTrue是否校验模板合法性(如变量名是否存在于 input_variables 中),不合法则抛错。

input_prompt:填充变量后的完整提示词,是模型实际接收的输入。

prompt.format_prompt():PromptTemplate 实例的方法,用于 将模板中的变量替换为具体值,生成 PromptValue 对象(而非纯字符串)。PromptValue 是适配不同模型输入格式的 “中间载体”:

  • 对文本模型(如 GPT-3):通过 .to_string() 转为字符串;
  • 对聊天模型(如 gpt-3.5-turbo):通过 .to_messages() 转为 BaseMessage 列表(如 HumanMessage)。

output:存储模型生成的原始文本输出(包含符合格式约束的内容,但仍是未解析的字符串)。

.invoke():是 LangChain 中 Runnable 接口(所有可参与流程编排的组件,如模型、链、检索器、提示词模板等均实现此接口)的核心同步调用方法,用于触发组件执行并返回结果。其核心作用是接收输入数据,经过组件处理后返回输出结果,是连接 “组件定义” 与 “实际执行” 的桥梁。

参数名类型默认值是否必填描述
input任意类型(因组件而异)组件的输入数据,类型随组件不同而变化:- 模型(如 ChatOpenAI):可接收字符串、BaseMessage 列表或 PromptValue;- 检索器(Retriever):接收查询字符串(str);- 链(Chain):接收字典(dict,键为链的输入变量);- 提示词模板(PromptTemplate):接收字典(dict,键为模板变量)。
configRunnableConfig 或 NoneNone组件执行的配置信息,包含:- callbacks:回调函数列表(用于日志、进度跟踪);- tags:标签列表(用于分类执行记录);- metadata:元数据字典(附加执行信息);- 动态参数(如通过 configurable_alternatives 定义的可替换组件参数)。
**kwargs任意组件特定的额外参数(不同组件可能有专属参数,如模型调用时的 temperature 临时覆盖,但不推荐,优先通过 config 或组件初始化时配置)。

output.content:存储模型生成的纯文本内容,即需要被 parser 解析的原始数据。

from langchain_core.output_parsers import JsonOutputParserparser = JsonOutputParser(pydantic_object=Date)prompt = PromptTemplate(template="提取用户输入中的日期。\n用户输入:{query}\n{format_instructions}",input_variables=["query"],partial_variables={"format_instructions": parser.get_format_instructions()},
)input_prompt = prompt.format_prompt(query=query)
output = llm.invoke(input_prompt)
print("原始输出:\n"+output.content)print("\n解析后:")
parser.invoke(output)

Ⅳ、使用PydanticOutputParser

langchain_core:LangChain 生态的 底层核心模块,是整个框架的 “骨架” 和 “基础设施”。它定义了所有组件的基础数据结构、抽象接口和核心交互逻辑,为上层模块(如 langchainlangchain_communitylangchain_openai 等)提供统一的 “语言” 和 “规则”,确保不同组件(模型、工具、链等)能无缝协作。

langchain_core.output_parsers:LangChain 核心模块中专注于 模型输出解析 的子模块,提供了一系列工具将大语言模型(LLM)生成的原始文本(通常是无结构或半结构化的字符串)转换为结构化数据(如纯字符串、JSON、列表、自定义对象等),同时解决 “格式校验”“错误处理” 等问题。它是连接 “模型生成” 与 “应用逻辑” 的关键桥梁,让模型输出能直接被下游系统(如数据库、业务逻辑)使用。

parser:用于将模型生成的原始文本输出转换为结构化数据(如字典、Pydantic 模型、列表等)的工具类实例(如 JsonOutputParserPydanticOutputParser 等)。自动处理模型输出的文本格式,提取关键信息并转换为程序可直接使用的结构化形式,避免手动编写字符串解析逻辑。

PydanticOutputParser():LangChain 中 专为 Pydantic 模型设计的输出解析器,用于将大语言模型生成的文本(通常是 JSON 格式)直接解析为指定的 pydantic.BaseModel 实例。相比 JsonOutputParser,它更聚焦于 “结构化对象生成”,会自动校验字段的类型、约束(如数值范围、字符串长度),并在解析失败时抛出详细错误,确保输出严格符合预定义的 schema。

参数名类型默认值是否必填描述
pydantic_objectType[BaseModel]目标 Pydantic 模型类(如自定义的 UserInfoToolArgs),解析结果会转换为该类的实例,并自动应用模型中定义的字段约束(如 gemin_length 等)。

input_prompt:填充变量后的完整提示词对象(通常是 PromptValue 类型),是模型实际接收的输入。

prompt.format_prompt():PromptTemplate 实例的方法,用于 将模板中的变量替换为具体值,生成 PromptValue 对象(而非纯字符串)。PromptValue 是适配不同模型输入格式的 “中间载体”:

  • 对文本模型(如 GPT-3):通过 .to_string() 转为字符串;
  • 对聊天模型(如 gpt-3.5-turbo):通过 .to_messages() 转为 BaseMessage 列表(如 HumanMessage)。

output:模型调用(如 llm.invoke(input_prompt))返回的结果对象(通常是 AIMessage 或 BaseMessage 子类)。封装模型生成的所有信息,包括文本内容、元数据(如生成时间、模型名)等。

output.content:output 对象的核心属性,存储模型生成的原始文本内容(字符串类型)。

.invoke():是 LangChain 中 Runnable 接口(所有可参与流程编排的组件,如模型、链、检索器、提示词模板等均实现此接口)的核心同步调用方法,用于触发组件执行并返回结果。其核心作用是接收输入数据,经过组件处理后返回输出结果,是连接 “组件定义” 与 “实际执行” 的桥梁。

参数名类型默认值是否必填描述
input任意类型(因组件而异)组件的输入数据,类型随组件不同而变化:- 模型(如 ChatOpenAI):可接收字符串、BaseMessage 列表或 PromptValue;- 检索器(Retriever):接收查询字符串(str);- 链(Chain):接收字典(dict,键为链的输入变量);- 提示词模板(PromptTemplate):接收字典(dict,键为模板变量)。
configRunnableConfig 或 NoneNone组件执行的配置信息,包含:- callbacks:回调函数列表(用于日志、进度跟踪);- tags:标签列表(用于分类执行记录);- metadata:元数据字典(附加执行信息);- 动态参数(如通过 configurable_alternatives 定义的可替换组件参数)。
**kwargs任意组件特定的额外参数(不同组件可能有专属参数,如模型调用时的 temperature 临时覆盖,但不推荐,优先通过 config 或组件初始化时配置)。
from langchain_core.output_parsers import PydanticOutputParserparser = PydanticOutputParser(pydantic_object=Date)input_prompt = prompt.format_prompt(query=query)
output = llm.invoke(input_prompt)
print("原始输出:\n"+output.content)print("\n解析后:")
parser.invoke(output)

Ⅴ、OutputFixingParser格式自动纠错

llm:对模型原始输出文本(output.content)进行手动篡改后得到的格式错误的字符串,用于模拟模型生成的不符合预期格式的输出。测试解析器的容错能力,验证 OutputFixingParser 是否能修复格式错误。

init_chat_model():通用型自定义函数,用于封装各类大语言模型(如 OpenAI GPT、Anthropic Claude、阿里云通义千问等)的初始化逻辑,统一处理模型配置、认证信息、生成规则等,最终返回一个可直接调用的聊天模型实例,减少重复代码并提升配置灵活性。

参数名类型默认值是否必填详细描述
model_providerstr"openai"模型提供商,决定初始化的模型类型,常见值:"openai"(OpenAI)、"anthropic"(Anthropic)、"dashscope"(阿里云)、"baidu"(百度文心一言)等。
model_namestr"gpt-3.5-turbo"具体模型名称,需与model_provider匹配:- OpenAI:"gpt-3.5-turbo"/"gpt-4";- 阿里云:"qwen-max"/"qwen-plus";- Anthropic:"claude-3-sonnet-20240229"
api_keystrNone模型服务的 API 密钥,用于身份认证;若为None,默认从环境变量读取(需与model_provider对应,如 OpenAI 读OPENAI_API_KEY,阿里云读DASHSCOPE_API_KEY)。
base_urlstrNone模型服务的自定义基础 URL(用于私有部署、代理服务或非官方接口):- OpenAI 默认:"https://api.openai.com/v1";- 阿里云通义千问兼容 URL:"https://dashscope.aliyuncs.com/compatible-mode/v1";- 若为None,使用对应提供商的默认 URL。
temperaturefloat0.7生成文本的随机性控制:取值范围0.0~2.0;- 低值(如0.1~0.3):回复更严谨、确定;- 高值(如1.0~1.5):回复更多样、有创造性。
max_tokensint2048模型生成回复的最大 token 数(含输入 token + 输出 token),超过则截断;需根据模型上下文窗口设置(如 GPT-4 默认8192,qwen-max 支持128000)。
stopList[str] 或 strNone生成终止符:当模型生成内容中出现指定字符串时,立即停止生成;- 示例:stop=["\n用户:", "### 结束"],避免模型模拟后续对话。
top_pfloat1.0采样阈值(核采样):取值范围0.0~1.0;- 仅保留概率和达到top_p的 token 参与采样(如0.9:仅用前 90% 概率的 token),与temperature配合控制生成多样性,通常不建议同时调整两者。
frequency_penaltyfloat0.0重复内容惩罚:取值范围-2.0~2.0;- 正值(如0.5):降低模型生成重复内容的概率;- 负值(如-0.5):鼓励模型生成重复内容。
presence_penaltyfloat0.0主题新颖性惩罚:取值范围-2.0~2.0;- 正值(如0.5):鼓励模型引入新主题、新词汇;- 负值(如-0.5):鼓励模型聚焦现有主题。
timeoutint30模型请求的超时时间(单位:秒),超过时间未收到响应则抛出网络错误,避免长期阻塞。
max_retriesint2请求失败后的重试次数(如网络波动、服务临时不可用),减少偶发错误影响。
toolsList[Tool]None需绑定到模型的工具列表(如检索工具、函数调用工具),仅支持支持工具调用的模型(如 GPT-3.5-turbo-0613、qwen-max)。
tool_choicestr 或 dict"auto"工具调用策略:- "auto":模型自主决定是否调用工具;- "none":强制不调用工具,仅生成文本回复;- 工具名(如"retriever_tool"):强制调用指定工具。
**kwargs任意-其他模型专属参数,如 Anthropic 的top_k、百度文心一言的penalty_score等,根据model_provider灵活传递。

new_parser:当原始解析器(parser)无法解析错误格式的输出(如 bad_output)时,new_parser 会调用大模型(llm)生成修复方案,将错误输出修正为符合格式要求的文本,再用原始解析器解析。

OutputFixingParser.from_llm():LangChain 中 用于自动修复模型输出格式错误的解析器。当模型生成的输出不符合预期格式(如 JSON 语法错误、字段缺失)时,它会调用另一个 LLM(通常是格式修复能力强的模型)自动修正错误,再交给基础解析器(如 PydanticOutputParser)解析,解决 “模型偶尔输出格式混乱导致解析失败” 的问题。

参数名类型默认值是否必填描述
llmBaseLanguageModel用于修复格式错误的 LLM 实例(如 ChatOpenAI,需具备理解格式要求的能力)。
parserBaseOutputParser基础解析器(如 PydanticOutputParserJsonOutputParser),用于修复后的文本解析。

bad_output:对模型原始输出文本(output.content)进行手动篡改后得到的格式错误的字符串,用于模拟模型生成的不符合预期格式的输出。

output.content:模型(如 llm)对输入提示词的原始响应文本(字符串类型),通常是符合预期格式的输出(如正确的 JSON 字符串)。

replace():Python 字符串的内置方法,用于 替换字符串中的指定子串,返回替换后的新字符串(原字符串不变)。在 LLM 应用中,常用于预处理模型输出(如去除多余空格、特殊符号)或清理提示词模板中的干扰字符,确保后续解析(如 PydanticOutputParser)顺利进行。

参数名类型默认值是否必填描述
oldstr需要被替换的子串(如 "\n"" ")。
newstr用于替换的新子串(如 """ ")。
countint-1替换次数(-1 表示替换所有匹配的子串,正数表示仅替换前 count 次)。

.invoke():是 LangChain 中 Runnable 接口(所有可参与流程编排的组件,如模型、链、检索器、提示词模板等均实现此接口)的核心同步调用方法,用于触发组件执行并返回结果。其核心作用是接收输入数据,经过组件处理后返回输出结果,是连接 “组件定义” 与 “实际执行” 的桥梁。

参数名类型默认值是否必填描述
input任意类型(因组件而异)组件的输入数据,类型随组件不同而变化:- 模型(如 ChatOpenAI):可接收字符串、BaseMessage 列表或 PromptValue;- 检索器(Retriever):接收查询字符串(str);- 链(Chain):接收字典(dict,键为链的输入变量);- 提示词模板(PromptTemplate):接收字典(dict,键为模板变量)。
configRunnableConfig 或 NoneNone组件执行的配置信息,包含:- callbacks:回调函数列表(用于日志、进度跟踪);- tags:标签列表(用于分类执行记录);- metadata:元数据字典(附加执行信息);- 动态参数(如通过 configurable_alternatives 定义的可替换组件参数)。
**kwargs任意组件特定的额外参数(不同组件可能有专属参数,如模型调用时的 temperature 临时覆盖,但不推荐,优先通过 config 或组件初始化时配置)。
from langchain.output_parsers import OutputFixingParser
from langchain.chat_models import init_chat_modelllm = init_chat_model(model="deepseek-chat", model_provider="deepseek")# 纠错能力与大模型能力相关
new_parser = OutputFixingParser.from_llm(parser=parser, llm=llm)bad_output = output.content.replace("4","四")
print("PydanticOutputParser:")
try:parser.invoke(bad_output)
except Exception as e:print(e)print("OutputFixingParser:")
new_parser.invoke(bad_output)

4.Function Calling

Function Calling 函数调用,顾名思义,为模型提供了一种调用函数的方法 / 能力

Ⅰ、Function Calling 成立的模型能力基础

① 问题理解和行动规划

② 结构化数据输出

③ 上下文学习 in-Context Learning

Function Calling 让模型输出不再局限于自身推理输出,而是可以与外部系统交互,完成更复杂的任务

Ⅱ、常见 Function Calling 的应用场景包括

① 查询检索,补充额外信息(如RAG、搜索)

② 理解用户输入,向外部系统写入信息(如表单填写)

③ 调用外部系统能力,完成实际行为动作(如下订单)

Ⅲ、Calling是结果,理解和选择才是第一步

        除了代表用户诉求的Prompt之外,Function Caling还需要将可用的工具信息(Function Defnitions)也提供给模型在第一次请求时,模型的核心工作如下:

        1.理解Prompt所代表的“诉求”和Definitions所代表的”行动可能性

        2.“选择"完成"诉求"所需要进行的"行动"(从”行动可能性”中获得)

        3.根据所选择的”行动",给出执行“行动"所需的"行动参数”(Parameters)

Ⅳ、代码演示

① 定义工具

langchain_core:LangChain 生态的 底层核心模块,定义了整个框架的基础数据结构、抽象接口和核心交互逻辑,是所有上层模块(包括工具、模型、链等)的 “骨架”。它确保不同组件(如工具、模型、解析器)遵循统一的规范,实现无缝协作。

langchain_core.tools:langchain_core 中专注于 工具定义与管理 的子模块,负责规范 “工具” 的基础结构、调用方式和元数据格式,让大语言模型(LLM)能够理解并调用外部工具(如计算器、数据库查询、API 调用等)。

langchain_core.tools.tool:langchain_core.tools 中的 核心工具类,主要包含 BaseTool 抽象基类和 Tool 实现类,是所有具体工具的 “模板”,定义了工具的基础属性和行为。

@tool:langchain_core.tools 提供的 便捷装饰器,用于将普通 Python 函数快速转换为符合 BaseTool 规范的工具实例,简化工具定义流程(无需手动继承 BaseTool 类)。

from langchain_core.tools import tool@tool
def add(a: int, b: int) -> int:"""Add two integers.Args:a: First integerb: Second integer"""return a + b@tool
def multiply(a: float, b: float) -> float:"""Multiply two integers.Args:a: First integerb: Second integer"""return a * b
② 调用工具

llm:具备自然语言理解和生成能力,是工具调用的 “大脑”,负责判断是否需要调用工具、如何调用工具。

init_chat_model():通用型自定义函数,用于封装各类大语言模型(如 OpenAI GPT、Anthropic Claude、阿里云通义千问等)的初始化逻辑,统一处理模型配置、认证信息、生成规则等,最终返回一个可直接调用的聊天模型实例,减少重复代码并提升配置灵活性。

参数名类型默认值是否必填详细描述
model_providerstr"openai"模型提供商,决定初始化的模型类型,常见值:"openai"(OpenAI)、"anthropic"(Anthropic)、"dashscope"(阿里云)、"baidu"(百度文心一言)等。
model_namestr"gpt-3.5-turbo"具体模型名称,需与model_provider匹配:- OpenAI:"gpt-3.5-turbo"/"gpt-4";- 阿里云:"qwen-max"/"qwen-plus";- Anthropic:"claude-3-sonnet-20240229"
api_keystrNone模型服务的 API 密钥,用于身份认证;若为None,默认从环境变量读取(需与model_provider对应,如 OpenAI 读OPENAI_API_KEY,阿里云读DASHSCOPE_API_KEY)。
base_urlstrNone模型服务的自定义基础 URL(用于私有部署、代理服务或非官方接口):- OpenAI 默认:"https://api.openai.com/v1";- 阿里云通义千问兼容 URL:"https://dashscope.aliyuncs.com/compatible-mode/v1";- 若为None,使用对应提供商的默认 URL。
temperaturefloat0.7生成文本的随机性控制:取值范围0.0~2.0;- 低值(如0.1~0.3):回复更严谨、确定;- 高值(如1.0~1.5):回复更多样、有创造性。
max_tokensint2048模型生成回复的最大 token 数(含输入 token + 输出 token),超过则截断;需根据模型上下文窗口设置(如 GPT-4 默认8192,qwen-max 支持128000)。
stopList[str] 或 strNone生成终止符:当模型生成内容中出现指定字符串时,立即停止生成;- 示例:stop=["\n用户:", "### 结束"],避免模型模拟后续对话。
top_pfloat1.0采样阈值(核采样):取值范围0.0~1.0;- 仅保留概率和达到top_p的 token 参与采样(如0.9:仅用前 90% 概率的 token),与temperature配合控制生成多样性,通常不建议同时调整两者。
frequency_penaltyfloat0.0重复内容惩罚:取值范围-2.0~2.0;- 正值(如0.5):降低模型生成重复内容的概率;- 负值(如-0.5):鼓励模型生成重复内容。
presence_penaltyfloat0.0主题新颖性惩罚:取值范围-2.0~2.0;- 正值(如0.5):鼓励模型引入新主题、新词汇;- 负值(如-0.5):鼓励模型聚焦现有主题。
timeoutint30模型请求的超时时间(单位:秒),超过时间未收到响应则抛出网络错误,避免长期阻塞。
max_retriesint2请求失败后的重试次数(如网络波动、服务临时不可用),减少偶发错误影响。
toolsList[Tool]None需绑定到模型的工具列表(如检索工具、函数调用工具),仅支持支持工具调用的模型(如 GPT-3.5-turbo-0613、qwen-max)。
tool_choicestr 或 dict"auto"工具调用策略:- "auto":模型自主决定是否调用工具;- "none":强制不调用工具,仅生成文本回复;- 工具名(如"retriever_tool"):强制调用指定工具。
**kwargs任意-其他模型专属参数,如 Anthropic 的top_k、百度文心一言的penalty_score等,根据model_provider灵活传递。

llm_with_tools:通过 llm.bind_tools([add, multiply]) 处理后的模型实例,绑定了具体工具(如 add 加法工具、multiply 乘法工具)。在基础 llm 能力上,新增了工具调用格式生成能力,能根据输入生成符合规范的工具调用指令(而非直接回答问题)。

.bind_tools():LangChain 中聊天模型(如ChatTongyiChatOpenAI)的实例方法,用于为模型绑定可调用的工具(Tool对象或工具列表),让模型知道 “可以使用哪些工具”,并在需要时生成符合工具调用格式的输出(如包含nameparameters的 JSON)。是构建 “工具调用型智能体(Agent)” 的核心步骤。

参数名类型默认值是否必填描述
toolsList[Tool] 或 Tool模型可调用的工具列表(单个工具也可),每个Tool需包含name(工具名)、func(调用函数)、description(功能描述,供模型判断是否调用)。
**kwargs任意额外配置(如tool_choice指定强制调用的工具,{"name": "calculator"})。

query:用户输入的自然语言问题(如 "3.5的4倍是多少?"),是模型需要处理的任务。触发模型的工具调用逻辑 —— 模型通过分析 query 的语义,决定是否调用工具及调用哪个工具。

messages:作为模型的输入格式,符合聊天模型对 “多轮对话上下文” 的处理要求(即使是单轮查询,也需用消息对象包装)。

HumanMessage():LangChain(langchain_core.messages)中的消息类,代表 “人类用户的消息”,用于构建对话历史(与AIMessageSystemMessage配合),明确告知模型 “这是用户输入的内容”,是聊天模型的标准输入格式之一。

参数名类型默认值是否必填描述
contentstr 或 List消息内容:- 通常为字符串(如用户问题"什么是LLM?");- 也可为列表(含文本和多媒体内容,如[{"type": "text", "text": "图中内容是什么?"}, {"type": "image_url", "image_url": "..."}],支持多模态模型)。
additional_kwargsDict{}额外参数(如消息 ID、时间戳等元数据)。
typestr"human"消息类型(固定为"human",无需修改)。

.invoke():是 LangChain 中 Runnable 接口(所有可参与流程编排的组件,如模型、链、检索器、提示词模板等均实现此接口)的核心同步调用方法,用于触发组件执行并返回结果。其核心作用是接收输入数据,经过组件处理后返回输出结果,是连接 “组件定义” 与 “实际执行” 的桥梁。

参数名类型默认值是否必填描述
input任意类型(因组件而异)组件的输入数据,类型随组件不同而变化:- 模型(如 ChatOpenAI):可接收字符串、BaseMessage 列表或 PromptValue;- 检索器(Retriever):接收查询字符串(str);- 链(Chain):接收字典(dict,键为链的输入变量);- 提示词模板(PromptTemplate):接收字典(dict,键为模板变量)。
configRunnableConfig 或 NoneNone组件执行的配置信息,包含:- callbacks:回调函数列表(用于日志、进度跟踪);- tags:标签列表(用于分类执行记录);- metadata:元数据字典(附加执行信息);- 动态参数(如通过 configurable_alternatives 定义的可替换组件参数)。
**kwargs任意组件特定的额外参数(不同组件可能有专属参数,如模型调用时的 temperature 临时覆盖,但不推荐,优先通过 config 或组件初始化时配置)。

json.dumps():Python 内置json模块的序列化函数,将 Python 对象(字典、列表、字符串等)转换为 JSON 格式字符串,用于数据存储(如保存模型配置)、网络传输(如 API 请求参数)或格式化模型的工具调用输出。

参数名类型默认值是否必填描述
obj可序列化对象需转换为 JSON 的 Python 对象(如{"name": "calculator", "parameters": {"a": 3}})。
indentint/strNone缩进空格数(如indent=2),使 JSON 更易读(常用于调试)。
ensure_asciiboolTrue若为False,保留非 ASCII 字符(如中文),否则转义(如"\u4e2d\u6587")。
sort_keysboolFalse若为True,按字母序排序字典的键。
import jsonllm = init_chat_model("deepseek-chat", model_provider="deepseek")llm_with_tools = llm.bind_tools([add, multiply])query = "3.5的4倍是多少?"
messages = [HumanMessage(query)]output = llm_with_tools.invoke(messages)print(json.dumps(output.tool_calls, indent=4))
③ 回传Function Calling的结果

messages:在原有 [HumanMessage(query)] 基础上,新增了模型的工具调用指令(output)和工具返回结果(tool_msg)的对话列表。维护完整的对话上下文,包括用户输入、模型的工具调用决策、工具返回的结果,供后续模型生成最终回答时参考。

.append():Python 列表(list)的实例方法,用于在列表末尾添加单个元素,修改原列表(无返回值)。常用于动态收集数据(如批量加载文档时收集Document对象、记录对话历史等)。

参数名类型是否必填描述
object任意类型需添加到列表的元素。

available_tools:一个字典,键为工具名称(字符串,如 "add""multiply"),值为对应的工具函数(如 add 加法函数、multiply 乘法函数)。建立 “工具名称” 与 “实际工具函数” 的映射,方便根据模型生成的 tool_call["name"] 快速找到并调用对应的工具。

selected_tool:从 available_tools 中根据 tool_call["name"] 匹配到的实际工具函数(如 multiply 函数)。执行具体的计算或操作(如乘法运算),是工具调用的 “执行者”。

.lower():Python 字符串(str)的实例方法,用于将字符串中的所有大写字符转换为小写,返回新的小写字符串(不修改原字符串)。常用于统一文本格式(如用户输入的大小写规范化),避免因大小写差异导致的匹配错误。

tool_msg:工具函数执行后返回的结果,封装为 ToolMessage 类型的消息对象(LangChain 中专门用于存储工具输出的消息类型)。将工具的原始返回结果(如 14.0)转换为对话上下文可识别的格式,包含结果内容和对应的工具调用 ID(与 tool_call["id"] 关联)。

.invoke():LangChain 中 **Runnable接口的核心同步调用方法 **,适用于模型、链、检索器、提示词模板等组件,用于接收输入并返回处理结果。是 “组件定义” 到 “实际运行” 的桥梁,支持从输入到输出的端到端处理。

参数名类型默认值是否必填描述
input任意类型(因组件而异)组件的输入数据:- 模型(如ChatTongyi):BaseMessage列表或PromptValue;- 链(Chain):字典(如{"query": "xxx"});- 检索器(Retriever):查询字符串;- 提示词模板:字典(键为模板变量)。
configRunnableConfig 或 NoneNone执行配置,含callbacks(回调)、tags(标签)、configurable(动态参数)等。
**kwargs任意组件专属参数(如临时覆盖模型temperature,优先用config)。
messages.append(output)available_tools = {"add": add, "multiply": multiply}for tool_call in output.tool_calls:selected_tool = available_tools[tool_call["name"].lower()]tool_msg = selected_tool.invoke(tool_call)messages.append(tool_msg)
④ 结合Function Calling结果进行查询

new_output:返回的模型输出对象(通常是 AIMessage 类实例),包含模型基于 “用户原始查询 + 工具调用指令 + 工具返回结果” 生成的最终响应。结合完整的上下文(用户问题、工具调用过程、工具结果),生成自然语言形式的最终回答,而非工具调用指令(区别于第一次输出的 output)。

.model_dump():在 LangChain 和 Pydantic 框架中,.model_dump() 是 Pydantic 模型实例的内置方法,用于将模型对象(如 HumanMessageAIMessageToolMessage 等)转换为 Python 字典(dict),方便后续序列化(如转 JSON)、打印或数据处理。

from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage
from langchain_core.tools import tool
import json@tool
def add(a: int, b: int) -> int:"""Add two integers.Args:a: First integerb: Second integer"""return a + b@tool
def multiply(a: float, b: float) -> float:"""Multiply two integers.Args:a: First integerb: Second integer"""return a * bllm = init_chat_model("deepseek-chat", model_provider="deepseek")llm_with_tools = llm.bind_tools([add, multiply])query = "3.5的4倍是多少?"messages = [HumanMessage(query)]output = llm_with_tools.invoke(messages)print(json.dumps(output.tool_calls, indent=4))# 回传FunctionCalling的结果
messages.append(output)available_tools = {"add": add, "multiply": multiply}for tool_call in output.tool_calls:selected_tool = available_tools[tool_call["name"].lower()]tool_msg = selected_tool.invoke(tool_call)messages.append(tool_msg)new_output = llm_with_tools.invoke(messages)
for message in messages:print(json.dumps(message.model_dump(), indent=4, ensure_ascii=False))
print(new_output.content)

二、数据连接封装

1.文档加载器:Document Loaders

清华源下载:pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -U langchain-community pymupdf

2.文档处理器:TextSplitter

清华源下载:pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade langchain-text-splitters

类似 LlamaIndex,LangChain 也提供了丰富的 Document Loaders 和 Text Splitters

3.向量数据库与向量检索

清华源下载:pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple dashscope

清华源下载:pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple faiss-cpu

4.代码示例

os:Python 标准库中用于与操作系统交互的模块,提供文件 / 目录操作、环境变量读取、进程管理等基础功能,是所有 Python 应用的常用工具。

langchain_text_splitter:LangChain 生态中专注于长文本拆分的模块,用于将超长文档(如 PDF、小说)拆分为符合大模型上下文窗口限制的小片段(Document 对象),是 RAG(检索增强生成)流程的核心预处理工具。

langchain_community:LangChain 生态中的社区扩展库,包含第三方贡献的工具、集成和适配器,补充官方核心模块(langchain_corelangchain)未覆盖的功能,支持更多模型、存储、工具等。

langchain_community.embeddings:langchain_community 下专注于文本嵌入(Embedding)模型的子模块,提供各种开源 / 第三方嵌入模型的统一接口,将文本转换为向量(用于后续向量检索)。

langchain_community.vectorstores:langchain_community 下专注于向量数据库 / 存储的子模块,提供向量存储的统一接口,用于存储文本向量并支持相似性检索(RAG 流程中 “检索” 环节的核心)。

langchain_community.document_loaders:langchain_community 下专注于文档加载的子模块,提供各种格式 / 来源文档的加载工具,将非结构化数据(如 PDF、Word、网页)转换为 LangChain 标准的 Document 对象(便于后续拆分、嵌入)。

loader:读取并解析指定路径的 PDF 文档(此处为 ./data/deepseek-v3-1-4.pdf),将 PDF 内容转换为 LangChain 可处理的 Document 对象。

PyMuPDFLoader():LangChain(langchain_community.document_loaders)中基于 PyMuPDF 库 的 PDF 文档加载器,用于读取 PDF 文件内容并生成结构化 Document 对象,是处理 PDF 最常用的加载器之一(优势:速度快、支持加密 PDF、保留文本格式)。

参数名类型默认值是否必填描述
file_pathstrPDF 文件的本地路径(如 "./docs/guide.pdf")或远程 URL(部分场景支持)。
passwordstrNone加密 PDF 的解密密码(若 PDF 未加密,无需传递)。
extract_imagesboolFalse若为 True,会提取 PDF 中的图片并保存到临时目录(需额外处理图片内容)。

pages:存储从 PDF 中加载的所有页面内容,每个 Document 对象包含:

  • .page_content:该页的文本内容(字符串);
  • .metadata:该页的元数据(如页码 {"page": 0}、文档路径等)。

.load_and_split():PyMuPDFLoader(及其他文档加载器)的 实例方法,用于一站式完成 “PDF 加载→文本拆分”:先调用 load() 加载 PDF 生成每页 Document,再用指定的文本拆分器将长页面文本拆分为语义完整的短片段,直接返回拆分后的小 Document 列表,简化 RAG 预处理流程。

参数名类型默认值是否必填描述
text_splitterTextSplitterRecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0)文本拆分器实例(如 RecursiveCharacterTextSplitterTokenTextSplitter),若不指定则使用默认拆分器。
**kwargs任意传递给拆分器的额外参数(如 chunk_sizechunk_overlap,若 text_splitter 已指定则失效)。

text_splitter:将长文本(如单页 PDF 内容)切分为固定长度的短文本片段(chunk),避免因文本过长导致后续嵌入(Embedding)或模型调用失败。

RecursiveCharacterTextSplitter():LangChain 中最常用的文本拆分工具,用于将长文本(如 PDF、文档)拆分为语义完整的短片段(chunk),解决大语言模型 “上下文窗口限制” 问题,是 RAG 预处理的核心步骤。拆分逻辑:优先按大分隔符(如\n\n段落)拆分,若片段过长,再按小分隔符(\n、空格、标点)递归拆分,最大程度保留语义完整性。

参数名类型默认值是否必填描述
chunk_sizeint4000单个片段的最大长度(按字符数,或按 token 数,取决于length_function)。
chunk_overlapint200相邻片段的重叠长度(保留上下文关联,通常为chunk_size的 10%-20%)。
separatorsList[str]["\n\n", "\n", " ", ""]拆分分隔符列表(优先级从高到低,优先按前面的分隔符拆分)。
length_function函数len计算文本长度的函数(默认按字符数,可改为tiktoken_len按 token 数计算)。

texts:存储经过 text_splitter 切分后的短文本,是后续生成嵌入向量(Embedding)的输入单位。

texts_splitter.create_documents(): LangChain 中文本拆分器(如 RecursiveCharacterTextSplitterCharacterTextSplitter 等)的核心实例方法,用于将原始文本列表转换为结构化的 Document 对象列表。它是 RAG(检索增强生成)流程中 “文本预处理” 环节的关键步骤,为后续 “向量化”“向量存储” 提供标准化的输入格式。

参数名类型默认值是否必填描述
textsList[str]原始文本列表,每个元素为一段待处理的文本(如 ["第1页内容...", "第2页内容..."])。
metadatasList[Dict] 或 NoneNone元数据列表,与 texts 一一对应:- 若为 List[Dict]:每个字典为对应文本的元数据(如 [{"source": "doc1.pdf", "page": 1}, {"source": "doc1.pdf", "page": 2}]);- 若为 None:所有 Document 的 metadata 为空字典 {}

embeddings:将文本片段(texts)转换为数值向量(Embedding),实现 “文本→向量” 的映射,以便后续通过向量相似度进行检索。

DashScopeEmbeddings():langchain_community.embeddings中的类,用于调用阿里云达摩院的文本嵌入模型(如text-embedding-v2),生成文本向量(适合中文场景,兼容 LangChain 的向量存储)。

参数名类型默认值是否必填描述
modelstr"text-embedding-v2"嵌入模型名称(达摩院提供的嵌入模型,如"text-embedding-v2")。
dashscope_api_keystrNone阿里云 DashScope API 密钥(建议通过os.getenv("DASHSCOPE_API_KEY")加载)。

index:存储文本片段的向量数据(embeddings 生成的向量),并提供高效的向量相似度检索能力。

FAISS.from_documenys():langchain_community.vectorstores.FAISS类方法,从Document对象列表创建 FAISS 向量索引(index)。内部逻辑:先用embeddings模型将Document.page_content转为向量,再构建 FAISS 索引存储向量及关联的Document

参数名类型默认值是否必填描述
documentsList[Document]拆分后的Document对象列表(含page_contentmetadata)。
embeddingEmbeddings嵌入模型实例(如DashScopeEmbeddings()),用于生成文本向量。
metadatasList[Dict] 或 NoneNone额外元数据(通常无需传入,documents已包含metadata)。

retriever:提供 “自然语言查询→相似文本片段” 的检索能力,是连接用户查询与向量数据库的 “接口”。

.as_retriever():向量库(如 FAISS)的实例方法,将向量索引(index)转换为检索器(retriever),方便直接调用检索功能(无需手动处理向量生成和相似度计算)。

参数名类型默认值是否必填描述
search_kwargsDict{"k": 4}检索参数:- k:返回最相关的文档数量(默认 4 条);- filter:按元数据过滤(如{"source": "doc1.pdf"})。

docs:存储与用户查询("deepseek v3有多少参数")最相关的文本内容,是后续生成回答的 “知识来源”。

.invoke():LangChain 中 **Runnable接口的核心同步调用方法 **,用于触发组件(如模型、链、检索器、提示词模板等)执行并返回结果。是连接 “组件定义” 与 “实际运行” 的桥梁,支持从输入到输出的端到端处理。

参数名类型默认值是否必填描述
input任意类型(因组件而异)组件的输入数据,类型随组件变化:- 模型(如ChatTongyi):BaseMessage列表或PromptValue;- 链(Chain):字典(键为输入变量);- 检索器(Retriever):查询字符串;- 提示词模板:字典(键为模板变量)。
configRunnableConfig 或 NoneNone执行配置,包含:- callbacks:回调函数(日志、进度跟踪);- tags:标签(分类记录);- metadata:元数据;- configurable:动态参数(如切换模型)。
**kwargs任意组件专属参数(如模型调用时临时覆盖temperature,不推荐,优先用config)。

doc.page_content:存储单个检索结果(doc)的具体文本内容,即从文档中匹配到的与查询相关的片段。

import os
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_community.document_loaders import PyMuPDFLoader# 加载文档
loader = PyMuPDFLoader("./data/deepseek-v3-1-4.pdf")
pages = loader.load_and_split()# 文档切分
text_splitter = RecursiveCharacterTextSplitter(chunk_size=512,chunk_overlap=200,length_function=len,add_start_index=True,
)texts = text_splitter.create_documents([page.page_content for page in pages[:1]]
)# 灌库
embeddings = DashScopeEmbeddings(model="text-embedding-v1", dashscope_api_key=os.getenv("DASHSCOPE_API_KEY")
)
index = FAISS.from_documents(texts, embeddings)# 检索 top-5 结果
retriever = index.as_retriever(search_kwargs={"k": 5})docs = retriever.invoke("deepseek v3有多少参数")for doc in docs:print(doc.page_content)print("----")

更多的三方检索组件链接,参考:https://python.langchain.com/docs/integrations/vectorstores/

文档处理部分,建议在实际应用中详细测试后使用

与向量数据库的链接部分本质是接口封装,向量数据库需要自己选型


三、Chain和LangChain Expression Language

1.Pipeline 式调用 PromptTemplate, LLM 和 OutputParser

LangChain Expression Language(LCEL)是一种声明式语言,可轻松组合不同的调用顺序构成 Chain。LCEL 自创立之初就被设计为能够支持将原型投入生产环境,无需代码更改,从最简单的“提示+LLM”链到最复杂的链(已有用户成功在生产环境中运行包含数百个步骤的 LCEL Chain)。

Ⅰ、LCEL 的一些亮点包括:

① 流支持:使用 LCEL 构建 Chain 时,你可以获得最佳的首个令牌时间(即从输出开始到首批输出生成的时间)。对于某些 Chain,这意味着可以直接从 LLM 流式传输令牌到流输出解析器,从而以与 LLM 提供商输出原始令牌相同的速率获得解析后的、增量的输出。

② 异步支持:任何使用 LCEL 构建的链条都可以通过同步 API(例如,在 Jupyter 笔记本中进行原型设计时)和异步 API(例如,在 LangServe 服务器中)调用。这使得相同的代码可用于原型设计和生产环境,具有出色的性能,并能够在同一服务器中处理多个并发请求。

③ 优化的并行执行:当你的 LCEL 链条有可以并行执行的步骤时(例如,从多个检索器中获取文档),我们会自动执行,无论是在同步还是异步接口中,以实现最小的延迟。

④ 重试和回退:LCEL 链的任何部分配置重试和回退。这是使链在规模上更可靠的绝佳方式。目前我们正在添加重试/回退的流媒体支持,因此你可以在不增加任何延迟成本的情况下获得增加的可靠性。

⑤ 访问中间结果:对于更复杂的链条,访问在最终输出产生之前的中间步骤的结果通常非常有用。这可以用于让最终用户知道正在发生一些事情,甚至仅用于调试链条。你可以流式传输中间结果,并且在每个 LangServe 服务器上都可用。

⑥ 输入和输出模式:输入和输出模式为每个 LCEL 链提供了从链的结构推断出的 PydanticJSONSchema 模式。这可以用于输入和输出的验证,是 LangServe 的一个组成部分。

⑦ 无缝 LangSmith 跟踪集成:随着链条变得越来越复杂,理解每一步发生了什么变得越来越重要。通过 LCEL,所有步骤都自动记录到 LangSmith,以实现最大的可观察性和可调试性。

⑧ 无缝 LangServe 部署集成:任何使用 LCEL 创建的链都可以轻松地使用 LangServe 进行部署。

原文:https://python.langchain.com/docs/expression_language/

os:操作系统交互工具,负责 “环境配置” 与 “文件管理”,是 LLM 应用的基础支撑。

langchain:LangChain 主模块,封装高层 API 和常用功能,是快速构建 LLM 应用的 “一站式工具包”。

langchain.prompts:提示词模板管理工具,负责 “结构化提示词” 的创建与动态变量替换。

langchain_core:LangChain 底层骨架,定义 “基础数据结构” 和 “抽象接口”,确保所有组件兼容。

langchain_core.runnables:流程编排工具,通过 LCEL(LangChain Expression Language)串联组件,构建复杂 LLM 流程。

pydantic:数据验证与结构化建模库,通过 “模型类” 定义数据规则,确保输入 / 输出合法。

typing:类型提示工具,标注变量 / 函数的类型,支持 IDE 类型检查和代码补全。

List:用于标注 列表(List)类型 的泛型(需指定列表内元素的具体类型),明确 “这是一个包含某类元素的列表”。

Dict:用于标注 字典(Dictionary)类型 的泛型(需指定字典的 “键类型” 和 “值类型”),明确 “这是一个键为某类、值为某类的字典”。

Optional:用于标注 可选类型,表示变量 / 参数 “可以是指定类型,也可以是 None”,明确 “这个值不是必须的”。

enum:枚举类型定义工具,用于管理 “固定选项集合”(避免魔法字符串,提升代码可读性)。

json:JSON 数据处理工具,实现 “Python 对象” 与 “JSON 字符串” 的相互转换。

langchain_community:社区贡献的扩展模块,集成第三方工具(非官方模型、存储、文档加载器等)。

langchain_community.chat_models:社区模块中专门集成 “第三方聊天模型” 的子模块,提供与 LangChain 兼容的接口。

data:排序维度选项之一,表示 “按流量(data)排序”

price:排序维度选项之一,表示 “按价格(price)排序”

ascend:排序方向选项之一,表示 “升序”(从小到大)

descend:排序方向选项之一,表示 “降序”(从大到小)

name:解析出的 “流量包名称”,可选(用户未指定时为 None

price_lower:解析出的 “价格下限”(整数,单位默认元),用户未提及时为 None

price_upper:解析出的 “价格上限”(整数,单位默认元),用户未提及时为 None

data_lower:解析出的 “流量下限”(未指定单位,需结合业务定义),用户未提及时为 None

data_upper:解析出的 “流量上限”(未指定单位,需结合业务定义),用户未提及时为 None

sort_by:解析出的 “排序维度”,取值为 SortEnum 枚举(data/price),未指定为 None

odering:解析出的 “排序方向”,取值为 OrderingEnum 枚举(ascend/descend),未指定为 None

Field():Pydantic 中用于定义模型字段元数据和约束的函数,通过Field()可指定字段描述、默认值、数据范围(如数值大小、字符串长度)等,用于校验输入合法性并辅助 LLM 理解字段含义。

参数名类型默认值是否必填描述
default任意...字段默认值(未传参时使用),若未设置则为必填字段。
default_factory可调用对象None动态生成默认值的函数(如lambda: []默认返回空列表),与default互斥。
aliasstrNone字段别名(序列化时可用别名代替原字段名)。
descriptionstrNone字段描述(用于生成 LLM 格式提示,如"用户姓名,非空字符串")。
gt数值None数值类型字段约束:值必须大于gt(如gt=0表示值 > 0)。
ge数值None数值类型字段约束:值必须大于等于ge(如ge=0表示值≥0)。
lt数值None数值类型字段约束:值必须小于lt(如lt=100表示值 < 100)。
le数值None数值类型字段约束:值必须小于等于le(如le=100表示值≤100)。
min_lengthintNone字符串 / 列表类型字段约束:长度≥min_length
max_lengthintNone字符串 / 列表类型字段约束:长度≤max_length
patternstrNone字符串类型字段约束:必须匹配正则表达式(如r"^[a-zA-Z0-9]+$"限制字母数字)。

prompt:定义模型的任务指令,引导模型将用户输入解析为指定结构化格式,而非生成自然语言回答。

ChatPromptTemplate。from_messages():langchain.promptsChatPromptTemplate类方法,用于从消息列表(含角色信息)创建聊天提示词模板,支持多角色对话(系统提示、用户输入、AI 回复),适配聊天模型输入格式。

参数名类型默认值是否必填描述
messagesList[Union[BaseMessagePromptTemplate, Tuple[str, str]]]消息模板列表,支持两种形式:- 元组(角色, 模板):如("system", "你是{field}专家");- 消息模板实例:如SystemMessagePromptTemplate.from_template(...)
template_formatstr"f-string"模板格式("f-string""jinja2"),指定变量替换方式。

llm:提供语义理解与结构化输出能力的基础模型,负责解析用户输入并生成符合要求的内容。

ChatTongyi():langchain_community.chat_models中的类,用于调用阿里云通义千问聊天模型(如qwen-plusqwen-max),封装 API 调用逻辑,兼容 LangChain 的流程编排(如与Runnable串联)。

参数名类型默认值是否必填描述
model_namestr"qwen-plus"通义千问模型名称,如"qwen-turbo"(轻量版)、"qwen-plus"(标准版)、"qwen-max"(增强版)。
temperaturefloat0.7模型随机性(0.0= 确定性高,1.0= 随机性高,范围[0, 1])。
dashscope_api_keystrNone阿里云 DashScope API 密钥(建议通过环境变量os.getenv("DASHSCOPE_API_KEY")加载)。
base_urlstr"https://dashscope.aliyuncs.com/compatible-mode/v1"通义千问 OpenAI 兼容接口地址(固定为阿里云提供的 URL)。
max_tokensintNone模型生成的最大 token 数(超出则截断)。

structured_llm:在基础 llm 能力上,强制模型输出符合 Semantics 类(Pydantic 模型)定义的结构化数据,无需手动解析 JSON 文本。

.with_structured_output():LangChain 中模型类的方法(如ChatTongyiChatOpenAI),用于让模型直接返回结构化输出(如 Pydantic 模型、字典),无需手动解析,简化 “模型输出→结构化数据” 的流程。

参数名类型默认值是否必填描述
schemaType[BaseModel]/dict/str输出结构定义:- BaseModel:Pydantic 模型类(如UserInfo),模型会严格遵循其字段约束;- dict:字典结构(如{"name": str, "age": int});- str:JSON Schema 字符串。
include_rawboolFalse若为True,返回结果中包含原始模型输出(raw字段),否则仅返回结构化数据。
**kwargs任意额外参数(如parser指定自定义解析器,prompt覆盖默认格式提示)。

runnable:封装 “用户输入→提示词填充→模型调用→结构化输出” 的完整流程,实现端到端的语义解析。

  • {"text": RunnablePassthrough()}:将用户输入(如 "不超过100元的流量大的套餐有哪些")直接传递给 prompt 中的 {text} 占位符;
  • | prompt:用传递的 text 填充 prompt,生成完整的提示词;
  • | structured_llm:将完整提示词传入 structured_llm,获取结构化输出。

ret:存储模型解析用户输入后的结构化结果,每个字段对应 Semantics 中定义的含义。

invoke():LangChain 中 **Runnable接口的核心同步调用方法 **,用于触发组件(如模型、链、检索器、提示词模板等)执行并返回结果。是连接 “组件定义” 与 “实际运行” 的桥梁,支持从输入到输出的端到端处理。

参数名类型默认值是否必填描述
input任意类型(因组件而异)组件的输入数据,类型随组件变化:- 模型(如ChatTongyi):BaseMessage列表或PromptValue;- 链(Chain):字典(键为输入变量);- 检索器(Retriever):查询字符串;- 提示词模板:字典(键为模板变量)。
configRunnableConfig 或 NoneNone执行配置,包含:- callbacks:回调函数(日志、进度跟踪);- tags:标签(分类记录);- metadata:元数据;- configurable:动态参数(如切换模型)。
**kwargs任意组件专属参数(如模型调用时临时覆盖temperature,不推荐,优先用config)。

json.dumps():Python 内置json模块的序列化函数,将 Python 对象(字典、列表、字符串等)转换为 JSON 格式字符串,用于数据存储、传输或模型输出的格式化。

参数名类型默认值是否必填描述
obj任意可序列化对象需转换为 JSON 字符串的 Python 对象(如{"name": "qwen"}[1, 2, 3])。
skipkeysboolFalse若为True,跳过非字符串类型的键(如整数键),否则抛出TypeError
ensure_asciiboolTrue若为True,非 ASCII 字符会被转义(如 “中文”→"\u4e2d\u6587");False则保留原字符。
check_circularboolTrue若为True,检查循环引用(如a = {}; a['a'] = a),否则可能导致无限递归。
allow_nanboolTrue若为True,允许NaNInfinity等特殊值;False则抛出ValueError
indentint/strNone缩进空格数(int)或缩进字符串(str),用于格式化输出(如indent=2使 JSON 更易读)。
separatorstuple(', ', ': ')元组(item_sep, key_sep),指定元素分隔符和键值分隔符(如(',', ':')压缩输出)。
default函数None自定义序列化函数,处理非标准类型(如datetime对象,需转为字符串)。
sort_keysboolFalse若为True,按字母顺序排序字典的键。

.model_dump():Pydantic 模型(BaseModel)的实例方法,将模型实例转换为 Python 字典(键为字段名,值为字段值),用于数据序列化、存储或传递给下游系统(如 LLM 工具调用参数)。

参数名类型默认值是否必填描述
modestr"python"序列化模式:- "python":返回 Python 原生类型(如datetime保留为对象);- "json":返回 JSON 兼容类型(如datetime转为 ISO 字符串)。
include任意None指定需包含的字段(如{"name"}仅保留name字段)。
exclude任意None指定需排除的字段(如{"age"}移除age字段)。
by_aliasboolFalse若为True,使用字段别名(alias)作为键,而非原字段名。
exclude_unsetboolFalse若为True,排除未显式设置的字段(仅保留用户赋值的字段)。
exclude_defaultsboolFalse若为True,排除值为默认值的字段。
exclude_noneboolFalse若为True,排除值为None的字段。
import osfrom langchain.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from pydantic import BaseModel, Field
from typing import List, Dict, Optional
from enum import Enum
import json
from langchain_community.chat_models import ChatTongyi# 输出结构
class SortEnum(str, Enum):data = 'data'price = 'price'class OrderingEnum(str, Enum):ascend = 'ascend'descend = 'descend'class Semantics(BaseModel):name: Optional[str] = Field(description="流量包名称", default=None)price_lower: Optional[int] = Field(description="价格下限", default=None)price_upper: Optional[int] = Field(description="价格上限", default=None)data_lower: Optional[int] = Field(description="流量下限", default=None)data_upper: Optional[int] = Field(description="流量上限", default=None)sort_by: Optional[SortEnum] = Field(description="按价格或流量排序", default=None)ordering: Optional[OrderingEnum] = Field(description="升序或降序排列", default=None)# Prompt 模板
prompt = ChatPromptTemplate.from_messages([("system", "你是一个语义解析器。你的任务是将用户的输入解析成JSON表示。不要回答用户的问题。"),("human", "{text}"),]
)# 模型
llm = ChatTongyi(model_name="qwen-max", api_key=os.environ["DASHSCOPE_API_KEY"], temperature=0.01)
structured_llm = llm.with_structured_output(Semantics)# LCEL 表达式
runnable = ({"text": RunnablePassthrough()} | prompt | structured_llm
)# 直接运行
ret = runnable.invoke("不超过100元的流量大的套餐有哪些")
print(json.dumps(ret.model_dump(),indent = 4,ensure_ascii=False)
)


2.用 LCEL 实现 RAG

os:Python 标准库中 与操作系统交互的底层辅助工具,无依赖,是 LLM 应用(如 RAG)中 “环境配置、文件管理” 的基础支撑。

langchain_community:LangChain 生态的 第三方扩展库,基于 langchain_core 构建,集成开源 / 小众厂商的模型、存储、工具,补充官方模块未覆盖的 “长尾需求”,是快速扩展 LLM 应用能力的关键。

langchain_community.chat_models:第三方聊天模型集成工具,封装非官方聊天模型的调用逻辑,提供与 langchain_openai.ChatOpenAI 一致的接口,无缝适配 LangChain 流程。

langchain_community.vectorstores:向量存储集成工具,用于存储文本向量并支持相似性检索,是 RAG 流程中 “检索” 环节的核心,支持本地 / 云端多种存储方案。

langchain_community.document_loaders:多格式文档加载工具,将非结构化数据(PDF、网页、Word)转为 LangChain 标准 Document 对象(含 page_content 文本 +metadata 元数据),是 RAG 预处理的 “第一步”。

langchain_community.embedding:第三方嵌入模型集成工具,将文本转为向量(Embedding),适配 RAG 中 “文本向量化” 需求,支持开源 / 国产嵌入模型。

langchain_core:LangChain 生态的 底层骨架,定义所有组件的 “基础数据结构” 和 “抽象接口”,是 langchainlangchain_community 等上层模块的依赖基础,确保组件间兼容性。

langchain_core.prompts:提示词基础结构定义,提供提示词模板的 “抽象基类”,为上层 langchain.prompts 提供底层支撑(区别:上层是可直接使用的模板类,下层是抽象定义)。

langchain_text_splitters:专门处理 长文本拆分 的独立模块,解决大模型 “上下文窗口限制” 问题,是 RAG 预处理的 “核心环节”,确保长文档能被模型处理。

loader:读取指定路径的 PDF 文档(./data/deepseek-v3-1-4.pdf),解析文档内容并转换为 LangChain 可处理的格式。

PyMuPDFLoader():langchain_community.document_loaders 中的 PDF 文档加载器,基于轻量级 PDF 处理库 PyMuPDF(即 fitz)实现,用于高效加载 PDF 文件并转换为 LangChain 标准的 Document 对象(包含文本内容和元数据,如页码)。相比其他 PDF 加载器(如 PyPDFLoader),它速度更快,支持加密 PDF 解密(需密码)。

参数名类型默认值是否必填描述
file_pathstrPDF 文件的本地路径(如 "./docs/report.pdf")。
passwordstr""若 PDF 加密,需传入解密密码(如 password="123456")。

pages:存储从 PDF 中加载的所有页面,每个 Document 对象对应 PDF 的一页,包含:

  • .page_content:该页的文本内容;
  • .metadata:该页的元数据(如页码 {"page": 0}、文档路径等)。

.load_and_split():文档加载器(如 PyMuPDFLoaderWebBaseLoader)的 便捷方法,将 “加载文档” 和 “拆分文档” 两步合并:先加载原始文档,再用指定的文本拆分器(TextSplitter)拆分,直接返回拆分后的小片段 Document 列表,简化 RAG 预处理流程。

参数名类型默认值是否必填描述
text_splitterTextSplitterRecursiveCharacterTextSplitter()(默认)文本拆分器实例,用于将长文档拆分为小片段(如 RecursiveCharacterTextSplitter(chunk_size=500))。

text_splitter:RecursiveCharacterTextSplitter 实例(递归字符切分工具)。将长文本(如单页 PDF 内容)切分为固定长度的短片段(chunk),避免因文本过长导致嵌入(Embedding)或模型处理失败。

RecursiveCharacterTextSplitter():langchain_text_splitter 中最常用的 文本拆分器,通过 “递归按分隔符拆分” 策略处理长文本:优先按大分隔符(如 \n\n 段落)拆分,若片段仍过长,再按小分隔符(如 \n 换行)拆分,直到符合 chunk_size 限制。适合绝大多数自然语言文本(如文档、网页、小说),能最大程度保留语义完整性。

参数名类型默认值是否必填描述
chunk_sizeint1000每个拆分片段的最大长度(按字符数或 token 数,取决于 length_function)。
chunk_overlapint200相邻片段的重叠长度(用于保留上下文关联性,建议为 chunk_size 的 10%-20%)。
separatorsList[str]["\n\n", "\n", " ", ""]拆分分隔符优先级列表(从大到小),默认优先按段落拆分,再按行、空格拆分。
length_functionCallablelen计算文本长度的函数(默认 len 按字符数,可替换为 tiktoken_len 按 token 数)。

texts:存储经过 text_splitter 处理后的短文本,是后续生成嵌入向量的基本单位。

.create_documents():文本拆分器(如 RecursiveCharacterTextSplitter)的 方法,将原始文本列表(List[str])转换为 LangChain 标准的 Document 对象列表(每个 Document 含 page_content 文本和 metadata 元数据),用于后续嵌入和存储。

参数名类型默认值是否必填描述
textsList[str]原始文本列表(如 ["文本1...", "文本2..."])。
metadatasOptional[List[dict]]None元数据列表,与 texts 一一对应(如 [{"source": "doc1"}, {"source": "doc2"}]),若为 None 则元数据为空。

embeddings:将文本片段(texts)转换为数值向量(Embedding),实现 “文本→向量” 的映射,为后续相似度检索奠定基础。

DashScopeEmbeddings():langchain_community.embeddings 中集成的 阿里达摩院(DashScope)嵌入模型 类,用于将文本转换为向量(Embedding),支持达摩院的 text-embedding-v1 等模型,适配中文场景效果较好。

参数名类型默认值是否必填描述
modelstr"text-embedding-v1"嵌入模型名称(达摩院支持的模型,如 "text-embedding-v2")。
api_keystrNone达摩院 API 密钥(若为 None,从环境变量 DASHSCOPE_API_KEY 读取)。
timeoutint60请求超时时间(秒)。

db:存储文本片段的向量数据(embeddings 生成的向量),并提供高效的向量相似度检索功能。

FAISS.from_documents():langchain_community.vectorstores 中 FAISS 向量存储 的类方法,从 Document 对象列表创建 FAISS 向量库:自动调用嵌入模型将文档文本转为向量,并存入 FAISS 索引,用于后续相似性检索(RAG 核心步骤)。

参数名类型默认值是否必填描述
documentsList[Document]拆分后的 Document 列表(需包含 page_content 文本)。
embeddingEmbeddings嵌入模型实例(如 DashScopeEmbeddingsOpenAIEmbeddings)。
metadatasOptional[List[dict]]None元数据列表(若 documents 已含元数据,可省略)。

retriever:接收用户查询,从 db 中检索与查询最相似的文本片段,是连接用户问题与知识库的桥梁。

.as_retriever():向量存储(如 FAISS、Chroma)的 方法,将向量库转换为 检索器(Retriever),提供统一的相似性检索接口(如 get_relevant_documents()),用于在 RAG 中根据用户查询检索最相关的文档片段。

参数名类型默认值是否必填描述
search_kwargsdict{"k": 4}检索参数:- k:返回最相关的 k 个文档(默认 4);- filter:按元数据筛选(如 {"source": "doc1"})。

docs:存储与用户查询(如 "deepseek v3有多少参数")相关的文本内容,是后续生成回答的 “知识来源”。

.invoke():LangChain 中 **Runnable接口的核心同步调用方法 **,用于触发组件(如模型、链、检索器、提示词模板等)执行并返回结果。是连接 “组件定义” 与 “实际运行” 的桥梁,支持从输入到输出的端到端处理。

参数名类型默认值是否必填描述
input任意类型(因组件而异)组件的输入数据,类型随组件变化:- 模型(如ChatTongyi):BaseMessage列表或PromptValue;- 链(Chain):字典(键为输入变量);- 检索器(Retriever):查询字符串;- 提示词模板:字典(键为模板变量)。
configRunnableConfig 或 NoneNone执行配置,包含:- callbacks:回调函数(日志、进度跟踪);- tags:标签(分类记录);- metadata:元数据;- configurable:动态参数(如切换模型)。
**kwargs任意组件专属参数(如模型调用时临时覆盖temperature,不推荐,优先用config)。

.page_content:存储单个检索结果(doc)的具体文本内容,即从文档中匹配到的与查询相关的片段。

langchain_schema:LangChain 历史遗留的 数据结构 / 接口兼容模块,多数核心功能已迁移至 langchain_core,仅保留部分接口用于兼容旧代码(新开发优先用 langchain_core)。

langchain_schema.output_parser:输出解析基础接口,定义 BaseOutputParser 及基础解析器(如 StrOutputParser),功能与 langchain_core.output_parsers 一致,用于兼容旧代码。

langchain_schema.runnable:流程编排基础接口,定义 Runnable 接口及相关工具(如 RunnableSequence),功能与 langchain_core.runnables 一致,用于兼容旧代码。

template:定义模型生成回答的规则,明确要求 “仅基于提供的上下文({context})回答问题({question})”,避免模型编造信息。

prompt:封装 template 并提供格式化方法,用于将 context(检索到的文档)和 question(用户查询)填充到模板中,生成模型可接收的完整提示词。

ChatPromptTemplate():LangChain 中用于 构建聊天场景提示词模板 的类,支持多角色消息(如系统提示、用户输入、AI 回复),生成符合聊天模型(如通义千问、GPT)输入格式的 PromptValue 对象,是构建结构化对话的核心工具。

参数名类型是否必填描述
messagesList[BaseMessagePromptTemplate]消息模板列表,每个元素对应一个角色的模板(如系统消息模板、用户消息模板)。

llm:基于检索到的上下文(context)和用户问题(question),生成自然语言回答。

ChatTongyi():langchain_community.chat_models 中用于 调用阿里云通义千问聊天模型 的类,封装了通义千问的 API 调用逻辑,提供与 LangChain 其他组件(如 ChatPromptTemplateRunnable)兼容的接口,是国内场景下替代 OpenAI 模型的核心工具。

参数名类型默认值是否必填描述
model_namestr"qwen-plus"通义千问模型名称(如 "qwen-plus" 标准版、"qwen-max" 增强版、"qwen-turbo" 轻量版)。
temperaturefloat0.7模型随机性(0.0 = 确定性高,1.0 = 随机性高,范围 [0, 1])。
dashscope_api_keystrNone阿里云 DashScope API 密钥(建议通过环境变量 os.getenv("DASHSCOPE_API_KEY") 加载)。

rag_chain:封装 “用户查询→检索→提示词生成→模型调用→结果解析” 的完整 RAG 流程,实现端到端的问答功能。

  • {"question": RunnablePassthrough(), "context": retriever}:将用户输入作为 question,同时调用 retriever 获取 context(检索结果);
  • | prompt:用 question 和 context 填充 prompt,生成完整提示词;
  • | llm:将提示词传入 llm,生成回答;
  • | StrOutputParser():将模型输出的 AIMessage 对象转换为纯字符串。

res:存储 RAG 流程的最终输出,即模型基于检索到的上下文对用户问题的回答。

import osfrom langchain_community.chat_models import ChatTongyi
from langchain_core.prompts import ChatPromptTemplate
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_community.document_loaders import PyMuPDFLoader
from langchain_community.embeddings.dashscope import DashScopeEmbeddings# 加载文档
loader = PyMuPDFLoader("./data/deepseek-v3-1-4.pdf")
pages = loader.load_and_split()# 文档切分
text_splitter = RecursiveCharacterTextSplitter(chunk_size=512,chunk_overlap=200,length_function=len,add_start_index=True,
)texts = text_splitter.create_documents([page.page_content for page in pages[:1]]
)# 灌库
embeddings = DashScopeEmbeddings(model="text-embedding-v1", dashscope_api_key=os.getenv("DASHSCOPE_API_KEY")
)
db = FAISS.from_documents(texts, embeddings)# 检索 top-5 结果
retriever = db.as_retriever(search_kwargs={"k": 5})docs = retriever.invoke("deepseek v3有多少参数")for doc in docs:print(doc.page_content)print("----")from langchain.schema.output_parser import StrOutputParser
from langchain.schema.runnable import RunnablePassthrough# Prompt模板
template = """Answer the question based only on the following context:
{context}Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)llm = ChatTongyi(model_name="qwen-max", api_key=os.environ["DASHSCOPE_API_KEY"], temperature=0.01)# Chain
rag_chain = ({"question": RunnablePassthrough(), "context": retriever}| prompt| llm| StrOutputParser()
)res = rag_chain.invoke("deepseek V3有多少参数")
print(res)


3.用 LCEL 实现模型切换(工厂模式)

langchain_core:LangChain 生态的底层核心模块,包含所有组件的基础数据结构、抽象接口和核心逻辑,是整个框架的 “骨架”,其他模块(如 langchainlangchain_openai)均基于此扩展。

langchain_core.runnables:langchain_core 中负责流程编排的子模块,提供 Runnable 接口及相关工具,用于将不同组件(模型、提示词、工具、解析器等)串联成 “链(Chain)”,实现复杂逻辑的有序执行(如 “输入→提示词→模型→解析→输出” 的流水线)。

langchain:LangChain 的主框架模块,基于 langchain_core 构建,集成了 “提示词管理、模型调用、工具链、记忆系统、文档处理” 等完整功能,是构建 LLM 应用的 “一站式入口”。

langchain.prompts:langchain 框架中专注于提示词管理的子模块,提供标准化的提示词模板工具,解决 “动态生成提示词、复用提示词结构、适配多角色消息” 等问题。

langchain_openai:LangChain 官方提供的OpenAI 生态集成模块,专门适配 OpenAI 及兼容其 API 的模型(如 GPT-3.5/4 系列、Azure OpenAI 等),提供统一接口调用这些模型的功能。

qw_model:通义千问(Qwen)大语言模型的实例,用于调用阿里云的 qwen-max 模型。

ds_model:DeepSeek 大语言模型的实例,用于调用 deepseek-r1 模型(同样通过阿里云 DashScope 平台)。

ChatOpenAI():LangChain(langchain_openai 模块)中用于初始化 OpenAI 聊天模型实例的类,封装了与 OpenAI 聊天模型(如 gpt-3.5-turbogpt-4o 等)的交互逻辑,提供统一接口调用 OpenAI 的 API,支持文本生成、工具调用等功能。

参数名类型默认值是否必填描述
modelstr"gpt-3.5-turbo"模型名称,如 "gpt-4o""gpt-4-turbo""gpt-3.5-turbo-1106" 等。
api_keystrNoneOpenAI API 密钥,若为 None 则从环境变量 OPENAI_API_KEY 读取。
base_urlstrNone自定义 API 基础 URL(如代理地址或私有部署地址),默认使用 OpenAI 官方 URL。
temperaturefloat0.7生成随机性(0.0~2.0),值越低回复越越确定。
max_tokensintNone最大生成 token 数(输入 + 输出),超过则截断,默认由模型上下文窗口决定。
stopList[str] 或 strNone生成终止符,出现时停止生成。
timeoutint30超时时间(秒),超过则终止请求。
max_retriesint2请求失败失败重试次数。
toolsList[Tool]None绑定的工具列表,支持模型调用工具(需模型支持,如 gpt-3.5-turbo-0613)。
tool_choicestr 或 dict"auto"工具调用策略:"auto"(自动)、"none"(不调用)或指定工具名。
**kwargs任意-其他 OpenAI API 支持的参数(如 top_pfrequency_penalty 等)。

model:可配置的模型选择器,支持运行时动态切换 qw_model(通义千问)和 ds_model(DeepSeek)。

通过 qw_model.configurable_alternatives() 方法创建,核心参数:

  • ConfigurableField(id="llm"):定义配置字段 ID 为 llm(用于后续指定模型);
  • default_key="qwen":默认使用 qw_model(通义千问);
  • deepseek=ds_model:添加 deepseek 选项,对应 ds_model(DeepSeek)。后续可通过 with_config(configurable={"llm": "qwen"/"deepseek"}) 动态选择使用哪个模型。

.configurable_alternatives():LangChain 中 Runnable 接口的配置方法,用于为流程组件(如模型、工具、链)定义 “可替换的实现方案”,支持动态切换不同的实现(如不同模型、不同检索器),无需修改整体流程逻辑,提升灵活性。

参数名类型默认值是否必填描述
namestr配置项名称(用于标识该可替换组件,如 "llm""retriever")。
defaultRunnable默认实现(如默认模型 ChatOpenAI())。
alternativesDict[str, Runnable]{}可选实现的字典,键为别名(如 "gpt4""claude"),值为对应 Runnable 实例(如 ChatAnthropic())。
**kwargs任意-其他配置参数(如验证逻辑、描述信息)。

.configurableFiled():LangChain 中用于标记组件可配置字段的工具,允许在 Runnable 组件(如模型、链、工具)中定义 “可动态修改的参数”,支持在运行时通过 config 参数调整组件属性(无需重新初始化组件),提升流程的灵活性(例如动态切换模型温度、调整检索阈值等)。

核心参数(装饰器形式)类型描述
namestr配置字段的名称(用于在 config 中引用,如 "temperature")。
descriptionstr字段描述(可选,用于文档说明)。

prompt:聊天提示词模板,用于生成符合模型输入格式的用户消息。

.from_messages():ChatPromptTemplate 类的类方法,用于从多角色消息模板列表创建聊天提示模板,支持整合 SystemMessagePromptTemplateHumanMessagePromptTemplate 等,生成包含系统提示、用户输入等的结构化模板,最终用于生成模型可直接接收的 messages 列表。

参数名类型默认值是否必填描述
messagesList[Union[BaseMessagePromptTemplate, str, Tuple[str, str]]]消息模板列表,支持:- 消息模板类(如 SystemMessagePromptTemplate);- 纯文本(默认视为 HumanMessage);- 元组 (角色标识, 文本)(如 ("system", "你是助手"))。

.from_template():对于 PromptTemplate:从单一字符串模板创建提示词模板,自动解析变量(简化 PromptTemplate 初始化)。对于 ChatPromptTemplate:从单一字符串模板创建聊天提示模板,默认将模板视为 HumanMessage(简化单一角色提示词构建)。

参数名类型默认值是否必填描述
templatestr字符串模板(含 {变量}),默认作为 HumanMessage 内容(如 "请分析{text}")。
template_formatstr"f-string"模板格式("f-string" 或 "jinja2")。
validate_templateboolTrue是否校验模板合法性(如占位符格式)。

 chain:通过 LCEL(LangChain Expression Language)构建的完整处理链,实现 “输入→提示词生成→模型调用→输出解析” 的端到端流程。

{"query": RunnablePassthrough()}  # 1. 接收输入(如用户问题),传递给 "query" 变量
| prompt                          # 2. 用 prompt 模板将 "query" 转为模型输入消息
| model                           # 3. 调用选中的模型(qw_model 或 ds_model)生成响应
| StrOutputParser()               # 4. 将模型响应解析为纯字符串

.RunnablePassthrough():LangChain 中 Runnable 接口的工具类,用于在链(Chain)中传递输入数据而不做修改,或通过 assign 方法添加额外键值对(扩展上下文),是流程编排中连接不同组件的 “桥梁”。

参数名类型默认值是否必填描述
assigndictNone键值对字典,用于在传递输入时添加新字段(值可以是静态数据或函数)。示例:RunnablePassthrough(assign={"timestamp": datetime.now})

StrOutputPasser():LangChain 中最常用的输出解析器,用于将模型返回的 AIMessage 对象(或其他包含 content 属性的响应对象)解析为纯字符串,直接提取 content 字段的值,简化从模型响应中获取文本结果的流程(避免手动访问 response.content)。 

ret1:使用 DeepSeek 模型执行 chain 后得到的结果(即 deepseek-r1 对问题的回答)。

ret2:使用 通义千问 模型执行 chain 后得到的结果(即 qwen-max 对问题的回答)。

chain.with_config():LangChain 中 Chain 或 Runnable 对象的配置方法,用于为链的执行设置额外配置(如回调、标签、元数据等),控制链的执行行为(如日志记录、追踪、权限控制),不改变链的核心逻辑。

参数名类型默认值是否必填描述
callbacksList[BaseCallbackHandler]None回调函数列表,监听链执行事件(如开始、结束、错误),用于日志、进度跟踪。
tagsList[str]None标签列表(如 "rag_chain""user_123"),用于分类或筛选链执行记录。
metadatadictNone元数据字典(如 {"version": "1.0"}),附加到链执行信息中。
run_namestrNone链执行的名称(用于日志或追踪中标识该次运行)。
max_concurrencyintNone最大并发数(用于并行执行的链)。
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_core.runnables.utils import ConfigurableField
from langchain.prompts import (ChatPromptTemplate,HumanMessagePromptTemplate,
)
import osfrom langchain_openai import ChatOpenAI# 模型1
qw_model = ChatOpenAI(model="qwen-max",           # 通义千问api_key=os.getenv("DASHSCOPE_API_KEY"),base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)# 模型2
ds_model = ChatOpenAI(model="deepseek-r1",           # DeepSeekapi_key=os.getenv("DASHSCOPE_API_KEY"),base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)# 通过 configurable_alternatives 按指定字段选择模型
model = qw_model.configurable_alternatives(ConfigurableField(id="llm"),default_key="qwen",deepseek=ds_model,# claude=claude_model,
)# Prompt 模板
prompt = ChatPromptTemplate.from_messages([HumanMessagePromptTemplate.from_template("{query}"),]
)# LCEL
chain = ({"query": RunnablePassthrough()}| prompt| model| StrOutputParser()
)# 运行时指定模型 "qwen" or "deepseek"
ret1 = chain.with_config(configurable={"llm": "deepseek"}).invoke("请介绍你的模型结构")print(ret1)print("----------------------------------------------------------------------------------------------------------------")
ret2 = chain.with_config(configurable={"llm": "qwen"}).invoke("请介绍你的模型结构")print(ret2)

扩展阅读:什么是工厂模式;设计模式概览。


4.ICEL的其他功能

  1. 配置运行时变量:https://python.langchain.com/docs/how_to/configure/
  2. 故障回退:https://python.langchain.com/docs/how_to/fallbacks/
  3. 并行调用:https://python.langchain.com/docs/how_to/parallel/
  4. 逻辑分支:https://python.langchain.com/docs/how_to/routing/
  5. 动态创建 Chain: https://python.langchain.com/docs/how_to/dynamic_chain/

更多例子:https://python.langchain.com/docs/how_to/lcel_cheatsheet/


四、LangChain与LlamaIndex的错位竞争

  • LangChain 侧重与 LLM 本身交互的封装
    • Prompt、LLM、Message、OutputParser 等工具丰富
    • 在数据处理和 RAG 方面提供的工具相对粗糙
    • 主打 LCEL 流程封装
    • 配套 Agent、LangGraph 等智能体与工作流工具
    • 另有 LangServe 部署工具和 LangSmith 监控调试工具
  • LlamaIndex 侧重与数据交互的封装
    • 数据加载、切割、索引、检索、排序等相关工具丰富
    • Prompt、LLM 等底层封装相对单薄
    • 配套实现 RAG 相关工具
    • 同样配套智能体与工作流工具
    • 提供 LlamaDeploy 部署工具,通过与三方合作提供过程监控调试工具

注:LangGraph在下一篇单独进行讲解

总结

① LangChain 随着版本迭代可用性有明显提升

② 使用 LangChain 要注意维护自己的 Prompt,尽量 Prompt 与代码逻辑解依赖

③ 它的内置基础工具,建议充分测试效果后再决定是否使用

http://www.dtcms.com/a/532060.html

相关文章:

  • 泰安最好的网站建设公司怎么通过做网站赚钱吗
  • 初识C语言15.文件操作
  • 聊聊连续、递增
  • 9款上班打卡软件测评:帮你选出最适合企业的工具
  • 建站服务网络公司建设宣传网站上的请示
  • Mem0 使用案例学习总结 - 记忆化应用结构
  • 如何自动清理 Linux 临时文件 ?
  • C++容器forward_list
  • 茂名网站建设培训品牌宣传网站
  • 油漆工找活做的网站网站免费建设
  • TcpClinet
  • Appium+Python+Android+Nodejs环境安装
  • SCDN:互联网时代网站安全的安全保障
  • Linux小课堂: Apache服务在CentOS上的安装与基础配置指南
  • Gorm(八)预加载方式
  • 网站开发与设计的实训场地WordPress无法自动推送
  • 【找指针数组最大值】2022-11-24
  • 自己做网站能赚钱吗做spa的网站怎么推广
  • 网络管理中的名词
  • gitlab配置git的ssh秘钥
  • 机器狗进化论:当“园区跑腿”遇上具身智能,一场静悄悄的变革正在发生
  • 江宁区建设工程质量监督站网站学校网站源码开源
  • Docker LXC深度解析:从基础概念到实战演练
  • Spring Boot3零基础教程,docker 批量安装软禁,笔记68
  • 【C语言】函数栈帧的创建和销毁
  • 架构的尺度:从单机到分布式,服务端技术的深度演进
  • 优秀国内个人网站网址网站设计需要那些模块
  • 【ARM驱动】【FreeROTS移植到ARM驱动平台介绍】
  • BELLE中的表1
  • go-ethereum core之交易索引txIndexer