文章目录【LangChain系列八】LangChain 基础使用链式编程快速上手1. 先搞清楚整体流程2. 定义模型和消息3. 输出解析器StrOutputParser4. 链式调用三种写法5. 把 Prompt 也串进来6. 实战做个简单的问答链7. 链的复用和组合8. 加个输出解析器的进阶用法9. 调试技巧查看链的中间结果小结【LangChain系列八】LangChain 基础使用链式编程快速上手前面几篇把 LangChain 的模型、提示词、输出解析器都讲了这篇把这些零件组装起来——聊聊 LangChain 的链式编程。链式编程是 LangChain 最核心的设计思想。把模型、提示词、解析器像管道一样串起来数据流过去结果就出来了。1. 先搞清楚整体流程用 LangChain 调用大模型标准流程就五步定义大模型定义消息提示词调用大模型定义输出解析器链式执行看起来步骤多但其实写起来很短。下面一步步来。2. 定义模型和消息fromlangchain_openaiimportChatOpenAIfromlangchain_core.messagesimportSystemMessage,HumanMessage# 定义模型modelChatOpenAI(modelgpt-4,temperature0)# 定义消息messages[SystemMessage(content你是一个翻译助手把中文翻译成英文),HumanMessage(content今天天气真不错)]SystemMessage是系统指令告诉模型扮演什么角色。HumanMessage是用户输入。这两个是最基本的消息类型。调用模型很简单resultmodel.invoke(messages)print(result.content)# 输出类似: The weather is really nice today.3. 输出解析器StrOutputParser直接调用模型返回的是一个AIMessage对象要拿到纯文本字符串还得.content。每次这么写挺烦的。StrOutputParser就是干这个的——把模型输出直接转成字符串fromlangchain_core.output_parsersimportStrOutputParser parserStrOutputParser()# 单独用resultmodel.invoke(messages)textparser.invoke(result)print(text)# 直接就是字符串不用再 .content 了当然单独用解析器没啥意义。它的价值在于——链式组合。4. 链式调用三种写法这才是 LangChain 的精髓。把模型和解析器串起来形成一条链。写法一管道运算符|最推荐chainmodel|parser resultchain.invoke(messages)print(result)# 直接拿到字符串一个|就把模型和解析器串起来了。invoke之后数据先经过模型再经过解析器最终输出字符串。这种写法最简洁也是 LangChain 社区最常用的风格。写法二RunnableSequencefromlangchain_core.runnablesimportRunnableSequence chainRunnableSequence(model,parser)resultchain.invoke(messages)和model | parser效果完全一样只是写法更显式。了解一下就行实际开发中很少这么写。写法三.pipe()方法chainmodel.pipe(parser)resultchain.invoke(messages)又是一种等价写法。如果你更习惯函数式编程的风格.pipe()也挺直观。三种写法选哪种我个人推荐|最简洁社区认可度最高。后面所有示例都用这种。5. 把 Prompt 也串进来实际开发中你不会手动拼消息列表。而是用ChatPromptTemplate定义模板然后一起串进链里fromlangchain_core.promptsimportChatPromptTemplate promptChatPromptTemplate.from_messages([(system,你是一个翻译助手把{source_lang}翻译成{target_lang}),(user,{text})])# 三件套prompt → model → parserchainprompt|model|parser# 调用resultchain.invoke({source_lang:中文,target_lang:英文,text:今天天气真不错})print(result)这就是 LangChain 的标准范式了。prompt负责格式化输入model负责推理parser负责提取输出。三个环节各司其职通过|串成一条流水线。6. 实战做个简单的问答链来个稍微实际点的例子——做个能回答问题的链要求模型用中文回答并且控制回答长度fromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParser# 模型modelChatOpenAI(modelgpt-4,temperature0.7)# 提示词promptChatPromptTemplate.from_messages([(system,你是一个知识渊博的技术专家。请用简洁的中文回答问题不超过200字。),(user,{question})])# 解析器parserStrOutputParser()# 组装chainprompt|model|parser# 使用answerchain.invoke({question:什么是微服务架构})print(answer)整个调用就一行chain.invoke(...)干净利落。7. 链的复用和组合链的好处是可以复用。定义一次到处调用questions[什么是RESTful API,Python的GIL是什么,Docker和虚拟机有什么区别]forqinquestions:answerchain.invoke({question:q})print(fQ:{q})print(fA:{answer}\n)而且链是可以嵌套组合的。一条链的输出可以作为另一条链的输入这就形成了更复杂的处理流程。不过这个后面讲 LCELLangChain Expression Language时再展开。8. 加个输出解析器的进阶用法StrOutputParser是最简单的解析器但实际场景中你可能需要结构化输出。比如让模型返回 JSONfromlangchain_core.output_parsersimportJsonOutputParserfromlangchain_core.promptsimportChatPromptTemplate promptChatPromptTemplate.from_messages([(system,你是一个信息提取器。请以JSON格式返回结果。),(user,从这段文本中提取人名和年龄{text})])chainprompt|model|JsonOutputParser()resultchain.invoke({text:小明今年25岁他的朋友小红23岁})print(result)# {小明: 25, 小红: 23} 或类似的结构不过JsonOutputParser有时候不太稳定模型可能返回不符合 JSON 格式的内容。更可靠的方案是用PydanticOutputParser或with_structured_output这些后面的文章会详细讲。9. 调试技巧查看链的中间结果调试时你可能想看 prompt 格式化后的结果或者模型的原始输出。用RunnablePassthrough可以实现fromlangchain_core.runnablesimportRunnablePassthrough# 只看 prompt 的输出debug_chainprompt|RunnablePassthrough()resultdebug_chain.invoke({question:什么是Python})print(result)或者用 LangSmithLangChain 的可观测性平台来追踪每一步的输入输出这个在生产环境中很有用。小结这篇文章讲了 LangChain 链式编程的核心整体流程模型 → 提示词 → 输出解析器通过|串起来三种链式写法|管道、RunnableSequence、.pipe()推荐用|标准范式prompt | model | parser三件套复用性定义一次多次调用链式编程是 LangChain 的灵魂。掌握了它后面做 RAG、Agent 都是在这个基础上叠加。觉得有帮助的话点个赞收藏⭐支持一下吧