【LangChain】 入门:从分步调用到链式编程
LangChain 入门从分步调用到链式编程本文基于一段翻译助手的示例代码讲解 LangChain 的核心概念、输出解析器的作用以及普通写法与链式写法的对比。一、LangChain 是什么名字拆解缩写含义LangLanguage语言→ 大语言模型LLM LargeLanguage ModelChain链 → 把多个步骤像链条一样串起来执行核心理念把和大语言模型打交道的各种操作拆成一个个小模块再用链串起来像工厂流水线一样工作。原料 → 工序A → 工序B → 工序C → 成品 ↓ ↓ ↓ 提示词 调模型 解析结果二、完整代码示例翻译助手以下是一段使用 LangChain 调用通义千问模型进行翻译的完整代码fromlangchainimportPromptTemplatefromlangchain_community.chat_modelsimportChatTongyifromlangchain_core.output_parsersimportStrOutputParser# 1. 创建模型客户端modelChatTongyi()# 2. 构建提示词模板promptPromptTemplate(template你是一个翻译助手请讲以下内容翻译成{language}:{text})# 3. 输入参数构建真正的提示词fact_promptprompt.format(language中文,textI am a programmer)print(fact_prompt)# 4. 调用模型resultmodel.invoke(fact_prompt)# 5. 解析输出结果parserStrOutputParser()str_resultparser.invoke(result)print(str_result)三、分步详解第1步创建模型客户端modelChatTongyi()初始化通义千问 Tongyi 的聊天模型客户端后续通过它向大模型发送请求。第2步构建提示词模板promptPromptTemplate(template你是一个翻译助手请讲以下内容翻译成{language}:{text})使用PromptTemplate创建带占位符的模板{language}→ 目标语言如中文{text}→ 待翻译内容如I am a programmer好处模板可复用只需替换变量就能生成不同提示词。第3步填充参数fact_promptprompt.format(language中文,textI am a programmer)将具体值填入占位符生成真正发送给模型的提示词你是一个翻译助手请讲以下内容翻译成中文:I am a programmer第4步调用模型resultmodel.invoke(fact_prompt)向大模型发送请求返回一个复杂对象不是纯文本。第5步解析输出结果 ⭐重点parserStrOutputParser()str_resultparser.invoke(result)print(str_result)为什么要解析大模型返回的result是一个包装对象结构类似AIMessage(content我是一名程序员,# 真正的回答内容response_metadata{token_usage:{...},# Token 消耗统计model_name:qwen-turbo,# 模型名称finish_reason:stop# 结束原因},idrun-xxxxxx,usage_metadata{input_tokens:15,output_tokens:6,total_tokens:21})StrOutputParser 的作用功能说明提取 content从AIMessage对象中抽取出.content字段转为纯字符串去掉所有元数据包装只保留模型生成的文本链式兼容可以无缝接入 LangChain 的|管道操作符效果对比操作输出结果print(result)AIMessage(content我是一名程序员, ...)一大串对象信息print(str_result)我是一名程序员← 干净的人话解析的本质大模型 API 返回的是包裹在快递盒里的商品StrOutputParser就是帮你拆快递盒只把里面的商品纯文本答案拿出来。四、普通写法 vs 链式写法普通写法分步式fromlangchainimportPromptTemplatefromlangchain_community.chat_modelsimportChatTongyifromlangchain_core.output_parsersimportStrOutputParser# 创建各个组件modelChatTongyi()promptPromptTemplate(template你是一个翻译助手请讲以下内容翻译成{language}:{text})parserStrOutputParser()# 手动一步步执行fact_promptprompt.format(language中文,textI am a programmer)resultmodel.invoke(fact_prompt)str_resultparser.invoke(result)print(str_result)# 我是一名程序员特点每一步都显式写出来变量中间结果可见适合调试理解。链式写法管道式fromlangchainimportPromptTemplatefromlangchain_community.chat_modelsimportChatTongyifromlangchain_core.output_parsersimportStrOutputParser# 创建组件modelChatTongyi()promptPromptTemplate(template你是一个翻译助手请讲以下内容翻译成{language}:{text})parserStrOutputParser()# 用 | 符号把组件串成一条链chainprompt|model|parser# 一次调用全程自动流转resultchain.invoke({language:中文,text:I am a programmer})print(result)# 直接输出我是一名程序员特点一行chain prompt | model | parser定义数据流向调用时自动按顺序执行。对比总结维度普通写法链式写法代码行数多步骤分散少高度浓缩可读性适合新手流程清晰适合熟练后一眼看全貌中间变量fact_prompt、result、str_result都暴露内部自动传递无中间变量数据流向靠变量赋值串联靠|管道符号直观表达调试难度容易每步可打断点检查稍难错误可能在链中某环扩展性改流程要改多处改链定义即可如加prompt | model | parser | 其他LangChain 推荐度教学/理解用生产/工程用底层执行逻辑两者完全一样只是代码组织方式不同普通写法: prompt.format() → model.invoke() → parser.invoke() 链式写法: prompt | model | parser → chain.invoke() 实际都是: 字典参数 → 填充模板 → 调用模型 → 解析结果 → 输出字符串\|只是语法糖LangChain 内部会把A | B转成RunnableSequence(A, B)按顺序执行。五、总结Lang 语言模型Chain 链式组合LangChain 让语言模型工作流像搭积木一样简单。写法适用场景普通写法学习阶段理解每一步在干什么链式写法实际项目代码简洁、易于维护建议先理解普通写法每一步在干什么再过渡到链式写法写实际项目。普通写法是手工作坊——每一步亲力亲为看得懂链式写法是流水线——定义好工序原料进去成品出来效率高。本文基于 LangChain 翻译助手示例整理涵盖提示词模板、模型调用、输出解析及链式编程核心概念。