LangChain 入门学习第二篇-PromptTemplate 和结构化输出

💡 原文中文,约7700字,阅读约需19分钟。
📝

内容提要

本教程介绍LangChain中PromptTemplate和结构化输出的用法。通过ChatPromptTemplate管理提示词模板,使用LCEL管道组合流程,并用PydanticOutputParser将模型输出解析为Python对象。文章包含代码示例、运行方法和常见问题,帮助读者掌握提示词模板化及结构化数据提取技巧。

🔎

延伸解读

为什么用模板而不是直接拼字符串

文章指出,当提示词变量增多时,手动拼接字符串难以维护。ChatPromptTemplate 将提示词结构与变量分离,使代码更清晰,也便于后续从命令行、接口或数据库传入变量。这种设计在 RAG 场景中尤为重要,因为用户问题、检索文档和格式要求都可以通过模板组织,避免硬编码。

LCEL 管道如何简化流程

示例中 `prompt | model | StrOutputParser()` 展示了 LCEL 的管道写法,将提示词生成、模型调用和输出解析串联成一条链。这种声明式组合让流程一目了然,且易于替换组件或插入新步骤。相比手动调用模型并解析结果,LCEL 减少了样板代码,提升了可维护性。

结构化输出的实用价值与注意事项

通过 PydanticOutputParser,模型输出被解析为带类型校验的 Python 对象,便于程序后续处理、存储或展示。文章强调,这种方式不依赖模型原生 JSON Schema,对本地代理更友好。但解析可能失败,建议明确提示词、降低 temperature,并避免字段过于复杂。若模型支持,可后续尝试 `with_structured_output`。

Q&A

LangChain中PromptTemplate的作用是什么?

PromptTemplate用于将提示词的固定结构和变量内容分离,通过占位符(如{topic})传入变量,从而生成完整的消息列表,便于维护和复用。

如何在LangChain中使用ChatPromptTemplate创建提示词模板?

使用ChatPromptTemplate.from_messages()方法,传入消息列表,其中可以包含系统消息和人类消息,并在人类消息中使用占位符(如{topic})表示变量。例如:ChatPromptTemplate.from_messages([("system", "..."), ("human", "请用三点说明{topic}")])。

LangChain中的LCEL管道是什么?如何用LCEL组合PromptTemplate、模型和输出解析器?

LCEL(LangChain Expression Language)是一种声明式语法,用管道符(|)将组件串联成处理链。例如:chain = prompt | model | parser,表示先由prompt生成消息,再交给model调用大模型,最后通过parser解析输出。

为什么需要结构化输出?LangChain中如何实现结构化输出?

结构化输出可以让模型返回固定格式的数据(如JSON),便于程序直接读取字段、进行类型校验和后续处理。LangChain中可以使用PydanticOutputParser,先定义Pydantic模型(如ArticleSummary),然后通过parser.get_format_instructions()将格式要求注入提示词,最后用chain = prompt | model | parser将输出解析为Pydantic对象。

在LangChain中,PydanticOutputParser如何与提示词结合?

PydanticOutputParser通过parser.get_format_instructions()生成格式说明,然后使用ChatPromptTemplate的.partial()方法将格式说明作为变量(如{format_instructions})注入提示词,从而指导模型输出符合要求的JSON。

LangChain中结构化输出解析失败时如何排查?

可以尝试以下方法:1. 将提示词写得更明确,如强调“只输出JSON”;2. 降低temperature参数,减少模型自由发挥;3. 检查字段定义是否过于复杂;4. 如果模型服务支持原生JSON Schema,可尝试with_structured_output。

PromptTemplate和普通字符串有什么区别?

普通字符串写提示词时,变量多起来难以维护;PromptTemplate将提示词结构固定,变量通过占位符传入,便于管理和复用,尤其在RAG等场景中能灵活组织用户问题、文档片段和格式要求。

🏷️

标签

➡️

继续阅读