尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

LLM-Cookbook 学习——使用 LangChain 开发应用程序>模型、提示模板与输出解析器 Models、Prompts and Output Parsers

发布时间:2026/9/11 20:22:17

资讯中心
01
ARTICLE

LLM-Cookbook 学习——使用 LangChain 开发应用程序>模型、提示模板与输出解析器 Models、Prompts and Output Parsers

LLM-Cookbook 学习——使用 LangChain 开发应用程序>模型、提示模板与输出解析器 Models、Prompts and Output Parsers
一、这一章到底在学习什么使用大语言模型开发应用时一个非常典型的过程可以概括成用户数据 ↓ Prompt Template ↓ 完整 Prompt ↓ Model ↓ 模型输出字符串 ↓ Output Parser ↓ Python 字典等结构化数据也就是输入 → 组织提示词 → 调用模型 → 得到回答 → 解析回答在 LangChain 中这几个步骤被进一步封装成了不同组件组件作用Model调用大语言模型Prompt Template构造、复用 PromptOutput Parser将模型输出转换成结构化数据理解这三个组件是后面继续学习Chain、Memory、Agent、RAG等 LangChain 功能的基础。二、直接调用大模型在使用 LangChain 之前可以先看看最简单的 LLM 调用方式。例如get_completion(11是什么)模型返回11等于2。这实际上完成了一个非常简单的过程Prompt ↓ LLM ↓ Response但在实际应用中我们通常不会只问一句固定的问题。例如电商客服系统可能希望将客户发送的比较情绪化的消息转换成“正式、平静、有礼貌”的表达方式。这时候 Prompt 就会变得更加复杂。三、传统方法使用 Python f-string 构造 Prompt假设现在有一封客户邮件customer_email 我现在非常生气 我的搅拌机盖子突然飞了出去 果汁弄得到处都是。 而且保修居然不负责厨房清洁费用 赶快帮我处理 希望模型把它转换为正式普通话 平静、尊敬、有礼貌于是定义style 正式普通话 使用平静、尊敬、有礼貌的语气 然后使用 Python 的f-stringprompt f 把下面文本转换成 {style} 风格。 文本 {customer_email} 这里的核心就是{style} {customer_email}Python 会把变量中的实际内容填入字符串。因此prompt最终实际上会变成类似把下面文本转换成正式普通话 使用平静、尊敬、有礼貌的语气。 文本 我现在非常生气……这种方法当然可以工作但存在一个问题如果项目里有几十个、几百个 Prompt每次都手工使用 f-string 拼接会越来越难维护。这也是Prompt Template提示模板出现的重要原因。四、LangChain 中的 ModelLangChain 将各种大语言模型封装成统一的调用接口。教程使用的是from langchain.chat_models import ChatOpenAI然后创建模型chat ChatOpenAI(temperature0.0)这里的ChatOpenAI可以理解为LangChain 对 OpenAI Chat Model 的一层 Python 封装。创建这个对象以后就可以通过它向模型发送消息。教程还将temperature设置为0.0用于降低输出随机性。五、Prompt Template提示模板这一章非常重要的一个知识点就是ChatPromptTemplate首先导入from langchain.prompts import ChatPromptTemplate然后定义模板template_string 把下面文本转换成 {style} 风格。 文本 {text} 注意这里{style} {text}暂时都只是占位符。相当于先制作好了一个模具把下面文本转换成 ______ 风格。 文本 ______以后只需要不断向里面填数据即可。六、ChatPromptTemplate.from_template()接下来prompt_template ChatPromptTemplate.from_template( template_string )可以拆开理解ChatPromptTemplate是一个类。而from_template()是这个类提供的方法。作用就是将普通字符串模板转换成 LangChain 可以管理的 Prompt Template 对象。也就是普通字符串 template_string ↓ ChatPromptTemplate.from_template() ↓ LangChain Prompt Template prompt_template七、Prompt Template 为什么比 f-string 好例如有模板template_string 将下面文本转换成 {style} 风格 {text} 今天可以执行style 正式商务风格 text 你好我想问一下什么时候发货明天又可以执行style 活泼幽默风格 text 这个产品真的很好用。模板本身完全不需要修改。因此 Prompt Template 最大的优势之一就是将 Prompt 的固定结构和不断变化的数据分离。这样一个 Prompt 可以重复使用。教程也指出在真实应用中 Prompt 往往很长、包含很多细节模板可以显著提高 Prompt 的复用性和可维护性。八、format_messages() 是干什么的定义模板后customer_messages prompt_template.format_messages( stylecustomer_style, textcustomer_email )这一行非常重要。可以理解为把实际的数据填进 Prompt Template然后生成真正准备发送给 Chat Model 的消息。例如{style}被customer_style替换。而{text}被customer_email替换。过程就是Prompt Template 把下面文本转换成 {style} 风格 {text} ↓ format_messages() 实际数据 style 正式普通话 text 客户邮件 ↓ 完整 Message九、为什么 format_messages() 得到的是 list教程打印print(type(customer_messages))得到class list而print(type(customer_messages[0]))得到类似HumanMessage也就是说customer_messages实际上类似[ HumanMessage(...) ]而不是普通字符串原因在于 Chat Model 本身面对的是一个消息序列。一个完整对话可能是SystemMessage HumanMessage AIMessage HumanMessage AIMessage ...因此 LangChain 使用列表保存多条 Message 是非常自然的设计。教程中的format_messages()返回消息列表其中元素属于 LangChain 的消息对象。十、调用模型生成customer_messages之后就可以将其交给模型。教程中的写法为customer_response chat(customer_messages)然后print(customer_response.content)这里需要特别理解customer_response本身是一个消息对象。真正的文本回答存储在customer_response.content中。所以经常会看到response.content这种写法。十一、Prompt Template 的复用前面的模板template_string 把下面文本转换成 {style} 风格。 文本 {text} 并没有规定必须把海盗语言转换成普通话它只是一个通用的文本 目标风格转换模板。因此以后还可以service_style 使用礼貌的语气 转换成海盗风格 然后service_messages prompt_template.format_messages( styleservice_style, textservice_reply )模板完全不用重新写。这就是 Prompt Template 的核心价值固定 Prompt 逻辑 动态输入变量 可复用的提示系统教程也使用同一个模板完成了不同语言风格的转换任务。十二、Output Parser输出解析器接下来是本章第二个非常重要的知识点Output Parser为什么需要 Output Parser假设让模型分析一段商品评论并提取是否作为礼物 配送时间 价格评价我们希望得到{ 礼物: 是, 交货天数: 2, 价钱: 价格稍贵 }看起来像 Python 字典。但是有一个非常重要的问题。十三、模型输出的 JSON 不一定是 Python 字典例如模型返回{ 礼物: 是, 交货天数: 2, 价钱: 价格稍贵 }乍一看像dict但如果执行print(type(response.content))实际上得到的是class str也就是说它只是“长得像 JSON 的字符串”。这两个概念一定要区分。字符串data { 礼物: 是 } 类型str不能直接data[礼物]Python 字典data { 礼物: 是 }类型dict可以直接data[礼物]或者data.get(礼物)因此模型输出 JSON 样式文本并不代表程序已经得到了 Python 字典教程正是通过这个例子说明为什么需要 Output Parser。十四、ResponseSchema定义我要哪些字段LangChain 提供ResponseSchema可以定义输出字段。导入from langchain.output_parsers import ResponseSchema例如gift_schema ResponseSchema( name礼物, description该商品是否作为礼物送给别人 )这里name表示字段名称。description表示告诉模型这个字段应该包含什么信息。再比如delivery_schema ResponseSchema( name交货天数, description商品多少天送达如果未知则返回 -1 )以及price_schema ResponseSchema( name价钱, description提取与商品价格或者价值有关的信息 )最终就定义了三个字段礼物 交货天数 价钱十五、为什么叫 SchemaSchema可以理解为数据结构规范。比如希望模型最后必须返回{ 姓名: ..., 年龄: ..., 专业: ... }那么这个结构本身就是一种 Schema。它告诉模型我不要你自由发挥。 我要的就是 姓名 年龄 专业这对于后续程序处理非常重要。十六、StructuredOutputParser创建好多个 Schema 后response_schemas [ gift_schema, delivery_schema, price_schema ]然后创建输出解析器from langchain.output_parsers import StructuredOutputParser output_parser StructuredOutputParser.from_response_schemas( response_schemas )这一段可以理解为多个字段定义 ResponseSchema ↓ 组成 response_schemas ↓ StructuredOutputParser ↓ 结构化输出规则十七、get_format_instructions()接下来format_instructions output_parser.get_format_instructions()这一行非常关键。作用就是根据前面定义的 Schema自动生成一段告诉 LLM“应该按照什么格式输出”的 Prompt。例如类似{ 礼物: string, 交货天数: string, 价钱: string }也就是说以前可能需要自己写请按照 JSON 输出。 必须包括字段 礼物 交货天数 价钱现在 LangChain 可以根据 Schema 自动生成格式要求。教程正是将这段format_instructions再插入 Prompt Template。十八、为什么 Prompt 里面还有 {format_instructions}于是 Prompt Template 会写成review_template 分析下面的商品评论并提取相关信息 礼物商品是否作为礼物 交货天数多少天送达 价钱提取价格相关信息。 评论 {text} {format_instructions} 这里有两个变量{text}和{format_instructions}其中{text}负责传入真正需要分析的数据。而{format_instructions}负责告诉模型你的答案必须按照什么格式输出因此messages prompt.format_messages( textcustomer_review, format_instructionsformat_instructions )相当于同时给模型任务要求 原始数据 输出格式十九、模型返回后为什么还要 parse()即使已经告诉模型请按照 JSON 返回模型最终返回的response.content本质上仍然是str所以还要output_dict output_parser.parse( response.content )执行type(output_dict)就会得到dict于是整个过程完成了模型输出 ↓ response.content ↓ str ↓ output_parser.parse() ↓ dict之后就能output_dict.get(礼物)或者output_dict[交货天数]这也是结构化输出对于真实软件开发非常重要的原因程序处理字典、对象等结构化数据比处理自然语言字符串更加方便。二十、完整流程梳理这一章最重要的内容其实可以浓缩成下面这张流程图原始数据 │ ▼ ChatPromptTemplate │ format_messages() │ ▼ Messages │ ▼ Model │ ▼ AIMessage │ response.content │ ▼ str │ output_parser.parse() │ ▼ dict换句话说Prompt Template 负责“输入” Model 负责“处理” Output Parser 负责“输出”二十一、三个核心组件的关系我认为可以用“工厂流水线”来理解。1. Prompt Template —— 原材料加工说明告诉模型 你要干什么 输入的数据是什么 回答应该是什么风格例如分析这条评论 提取配送时间和价格信息。2. Model —— 工人负责真正理解 Prompt 并生成答案。Prompt ↓ LLM ↓ Response3. Output Parser —— 产品质检与包装模型可能返回这个东西应该算礼物大概两天送到……但是程序希望得到{ gift: True, delivery_days: 2 }Output Parser 就负责把输出转换成程序更容易使用的数据形式。二十二、一个非常容易误解的地方结构化 ≠ 正确这里我认为是学习 Output Parser 时非常重要的一点。Output Parser 可以让结果变成{ 礼物: ..., 交货天数: ..., 价钱: ... }但是它主要解决的是输出格式问题并不能自动保证模型对原文的理解一定正确。教程案例中评价提到了与妻子的周年纪念礼物有关的信息而不同输出中的“礼物”判断本身就可能存在差异。所以实际开发需要区分两个问题问题 1 模型有没有按照 JSON 输出 → Output Parser / Structured Output 问题 2 JSON 里面的信息是不是正确 → Prompt 设计、模型能力、验证机制、评估这两个问题并不是同一件事。二十三、本章几个重要函数总结代码作用ChatOpenAI()创建 Chat ModelChatPromptTemplate.from_template()将字符串转换成 Prompt Templateformat_messages()将变量填入 Prompt生成 MessageResponseSchema()定义一个输出字段StructuredOutputParser.from_response_schemas()创建结构化输出解析器get_format_instructions()自动生成输出格式说明parse()将模型输出解析成 Python 数据结构response.content获取模型真正返回的文本内容二十四、代码之间的变量关系这一部分非常容易乱我单独整理一下。template_string是普通 Prompt 模板字符串↓prompt_template是LangChain Prompt Template 对象↓messages是把真实变量填进去以后生成的消息列表↓response是LLM 返回的消息对象↓response.content是真正的文本回答类型通常为 str↓output_dict是Output Parser 解析后的 Python dict所以template_string ↓ prompt_template ↓ messages ↓ response ↓ response.content ↓ output_dict把这几个变量的类型和作用搞清楚以后这一章的大部分代码就不会觉得混乱了。二十五、关于教程代码版本需要特别注意Datawhale 这一章使用的是较早时期的 LangChain API例如from langchain.chat_models import ChatOpenAI目前 LangChain 官方文档已经将 OpenAI 集成独立到langchain-openai包中官方当前示例使用pip install -U langchain-openai然后from langchain_openai import ChatOpenAI因此如果按照教程代码运行时出现ImportError ModuleNotFoundError DeprecationWarning不一定是自己代码理解错了也有可能是教程所使用的 LangChain 版本 ≠ 当前安装的 LangChain 版本二十六、本章学习总结学习这一章以后我认为最需要掌握的是下面三个概念。1. Model负责真正调用大语言模型。2. Prompt Template负责将 Prompt 中固定的逻辑与动态数据分开 从而实现 Prompt 的复用和管理。核心过程template ↓ ChatPromptTemplate ↓ format_messages() ↓ messages3. Output Parser负责约束模型输出格式 并把模型返回的文本解析成程序容易处理的数据。核心过程ResponseSchema ↓ StructuredOutputParser ↓ get_format_instructions() ↓ LLM ↓ response.content ↓ parse() ↓ dictPrompt Template 决定“怎么问” Model 负责“回答” Output Parser 决定“怎么把回答交给程序使用”这三个组件组合起来以后就开始从简单的“调用 ChatGPT API”逐渐进入真正的LLM 应用程序开发。下一章继续学习 LangChain 中另一个非常重要的组件Memory —— 如何让大模型应用拥有“对话记忆”
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。