LangChain 提示词工程:语法结构详解与完整实战指南
我将为您系统性地解析 LangChain 中各类提示模板的核心语法结构,通过清晰展示语法与对应代码示例,帮助您彻底掌握提示工程的实现方法。所有示例均围绕报幕词生成场景展开。
在这里插入图片描述

*** 工具代码*******
OPENAI_API_KEY='sk-D'
DEEPSEEK_API_KEY='sk-d'
ZHIPU_API_KEY=''
OPENAI_BASE_URL='https://xiaoai.plus/v1'
DEEPSEEK_BASE_URL='https://api.deepseek.com'
LOCAL_BASE_URL='http://localhost:6006/v1'
import osfrom dotenv import load_dotenv'''
接下来逐行解释代1. **`import os`**:- **语法功能**: 导入 `os` 模块。- **作用**: `os` 模块提供了与操作系统进行交互的功能,例如访问环境变量、操作文件路径等。 在本代码中,它主要用来读取环境变量。2. **`from dotenv import load_dotenv`**:- **语法功能**: 从 `dotenv` 库中导入 `load_dotenv` 函数。- **作用**: `dotenv` 是一个用于从 `.env` 文件中加载环境变量的库。 `load_dotenv` 函数负责读取 `.env` 文件,并将其中定义的变量加载到操作系统的环境变量中。3. **`load_dotenv(override=True)`**:- **语法功能**: 调用 `load_dotenv` 函数,并传递 `override=True` 参数。- **作用**:- `load_dotenv()`: 尝试加载 `.env` 文件。 默认情况下,它会查找当前工作目录及其父目录中的 `.env` 文件。- `override=True`: 如果环境变量已经存在(例如,通过操作系统本身设置),则 `.env` 文件中的值将被覆盖。 如果设置为 `False` (默认行为),则已存在的环境变量不会被覆盖。**总结**:这段代码的主要目的是从环境变量(优先从 `.env` 文件中,然后是操作系统的环境变量)中读取 API 密钥和基础 URL。 这些变量通常用于配置应用程序,以便连接到外部服务(例如 OpenAI, DeepSeek, 智谱)或本地服务。 使用环境变量的最佳实践,因为它允许你存储敏感信息(如 API 密钥)在代码库之外,并通过不同的配置文件或系统设置来管理不同的环境(例如,开发、测试、生产)。
'''load_dotenv(override=True)OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
DEEPSEEK_API_KEY = os.getenv('DEEPSEEK_API_KEY')
ZHIPU_API_KEY = os.getenv('ZHIPU_API_KEY')OPENAI_BASE_URL = os.getenv('OPENAI_BASE_URL')
DEEPSEEK_BASE_URL = os.getenv('DEEPSEEK_BASE_URL')LOCAL_BASE_URL = os.getenv('LOCAL_BASE_URL')
一、基础提示模板(PromptTemplate)语法与实战
PromptTemplate 是 LangChain 中最基础的提示词构造器,用于将用户定义的变量填充到预设的字符串模板中。
语法结构详解
| 语法类型 | 描述 | 示例代码(语法) |
|---|---|---|
| 1. 类实例化写法 (最标准,推荐) | 显式声明 input_variables 和 template。 | PromptTemplate(input_variables=["topic"], template="为{topic}报幕") |
| 2. 类方法写法 (最简洁,常用) | 通过 .from_template() 方法直接从模板字符串创建。 | PromptTemplate.from_template("为{topic}报幕") |
| 3. 字典配置写法 (适合动态生成) | 将参数封装为字典,然后通过 ** 解包传入。 | PromptTemplate(**{"input_variables":["topic"], "template":"为{topic}报幕"}) |
| 4. 元组参数写法 (不推荐,了解即可) | 位置参数,第一个为变量列表,第二个为模板字符串。 | PromptTemplate(["topic"], "为{topic}报幕") |
| 5. 组合写法 (不推荐,了解即可) | 使用组合方式,可 多条件提示组合式模板,不是替代基础方式,而是对基础方式的增强和扩展,特别适合构建企业级提示工程系统。 | template = ( 前四种基础模板实例 +‘xxxxx’ + ‘yyyy’ ) |
完整实战示例分析
from langchain_core.prompts import PromptTemplatefrom langchain_demo.my_llm import llmdef prompt_template_demo():print("=== PromptTemplate 五种语法结构演示 ===")# 1. 类实例化写法template1 = PromptTemplate(input_variables=["topic", "style"],template="""你是一位专业主持人,请为{topic}表演创作一段{style}风格的报幕词。
要求包含节目背景介绍(1-2句)和观众互动(1句),总长度不超过100字。""")# 2. 类方法写法template2 = PromptTemplate.from_template("请以{style}风格为{topic}表演创作一段专业报幕词,突出表演特色。")# 3. 字典配置写法template_config = {"input_variables": ["topic"],"template": "为{topic}表演创作一段通用报幕词,适合各种场合使用。"}template3 = PromptTemplate(**template_config)# 4. 元组参数写法template4 = PromptTemplate(input_variables=["topic", "style"],template="创作{topic}的{style}风格报幕词:")# 5. 组合式模板写法 (前四种基础模板实例+其他内容)combined_prompt = (PromptTemplate.from_template("你是一位专业主持人,请为{topic}表演创作报幕词")+ "。\n要求:"+ "\n1. 采用{style}风格"+ "\n2. 包含节目背景介绍(1-2句)"+ "\n3. 包含观众互动(1句)"+ "\n4. 总长度不超过100字")# 测试输入inputs = {"topic": "京剧《霸王别姬》", "style": "典雅庄重"}# 创建链并执行print("\n=== 写法1:类实例化 ===")chain1 = template1 | llmprint("生成结果:", chain1.invoke(inputs))print("\n=== 写法2:类方法 ===")chain2 = template2 | llmprint("生成结果:", chain2.invoke(inputs))print("\n=== 写法3:字典配置 ===")chain3 = template3 | llmprint("生成结果:", chain3.invoke({"topic": "魔术表演"}))print("\n=== 写法4:元组参数 ===")chain4 = template4 | llmprint("生成结果:", chain4.invoke(inputs))print("\n=== 写法5: 组合式提示词模板写法 ===")chain5 = combined_prompt | llmprint("生成结果:", chain5.invoke(inputs))if __name__ == "__main__":prompt_template_demo()
代码解析:
-
os.environ["OPENAI_API_KEY"]: 设置环境变量,用于认证OpenAI API。 -
template.invoke(inputs): 将字典inputs中的键值对填充到模板字符串中,并返回一个PromptValue对象,其.text属性是填充后的字符串。 -
llm.invoke(...): 调用LLM模型生成文本。
二、聊天提示模板(ChatPromptTemplate)语法与实战
ChatPromptTemplate 专为对话式模型设计,允许定义不同角色(系统、人类、AI)的消息序列,以更好地引导模型行为。
角色约定与消息类型详解
在 LangChain 的 ChatPromptTemplate 中,角色标识符如 "system"、"human"、"ai" 不是随意命名的,它们遵循特定的角色约定和消息类型规范。理解这些角色的含义和使用原则,是构建高效聊天提示的关键。这些角色标识符是 LangChain 的预定义常量,不能随意更改或自定义。每种角色都有特定的语义含义和处理逻辑,确保与底层大模型的API规范(如OpenAI的Chat API)兼容。
核心知识点总结
1. 角色标识符规范
| 角色 | 标识符写法 | 推荐场景 | 示例 |
|---|---|---|---|
| System | ("system", "...") 或 SystemMessage | 系统指令 | 设定AI身份、背景 |
| Human | ("human", "...") 或 HumanMessage | 用户输入 | 用户问题、指令 |
| AI | ("ai", "...") 或 AIMessage | AI历史回复 | 多轮对话上下文 |
| Function | ("function", "...") | 函数调用 | 高级功能集成 |
2. 最佳写法推荐
| 场景 | 推荐写法 | 示例 | 优势 |
|---|---|---|---|
| 系统消息 | SystemMessagePromptTemplate | SystemMessagePromptTemplate.from_template("...") | 支持模板变量 |
| 用户消息 | 元组写法 | ("human", "内容{变量}") | 简洁直观 |
| AI历史消息 | AIMessage | AIMessage(content="...") | 显式类型 |
| 复杂用户消息 | HumanMessagePromptTemplate | HumanMessagePromptTemplate.from_template("...") | 支持多行模板 |
3. 执行流程说明
- 模板构建:使用
ChatPromptTemplate.from_messages()创建模板 - 变量填充:使用
format_messages(**inputs)填充变量 - 模型调用:将格式化后的消息传递给聊天模型
- 结果解析:从响应对象获取生成的文本内容
输出示例
=== LangChain ChatPromptTemplate 综合指南 ====== 角色标识符使用规范 ===
1. system: 系统指令,设定AI身份和背景 (必须首位)
2. human: 用户输入,代表人类用户的指令或问题
3. ai: AI的历史回复或中间响应 (通常用于多轮对话)
4. function: 函数调用结果 (高级用法)=== 生成的完整提示结构 ===
1. [SYSTEM]: 你是校园艺术节开幕式的御用主持人,连续三年获得最佳主持人奖。特别擅长幽默风趣风格主持。
2. [HUMAN]:
请创作一段3分钟的开场报幕词,要求:1. 包含对活动的热情介绍 2. 包含1个趣味问答互动环节3. 使用幽默风趣语言风格
3. [AI]: 已收到要求,正在构思幽默风趣风格的3分钟报幕词...
4. [HUMAN]: 特别要求:包含至少2个校园文化典故
5. [AI]: 好的,我会加入包含至少2个校园文化典故,并设计趣味问答互动环节=== AI生成的报幕词 ===
(这里是AI生成的报幕词内容)=== 不同场景下的最佳写法 ===场景1:简单提示 (推荐元组写法)
...场景2:带历史对话 (推荐混合写法)
...场景3:复杂模板 (推荐模板类写法)
...=== 常见问题解答 ===
Q1: 角色标识符可以自定义吗?
A: 不可以,必须使用预定义的system/human/ai/function
print("\n=== 常见问题解答 ===")
print("Q1: 角色标识符可以自定义吗?")
print("A: 不可以,必须使用预定义的system/human/ai/function")
print("\nQ2: 不同写法可以混用吗?")
print("A: 完全可以,LangChain会自动转换所有写法为BaseMessage")
print("\nQ3: AIMessage和('ai', ...)有什么区别?")
print("A: 功能上完全等价,AIMessage更显式,元组写法更简洁")
print("\nQ4: 系统消息的位置有要求吗?")
print("A: 系统消息必须作为第一条消息,其他顺序可以调整")
三种写法及其原理分析
ChatPromptTemplate 提供了多种便利的构造方法,它们底层都殊途同归,最终生成 langchain_core.messages.BaseMessage 类型的列表。
1. 元组列表写法(最常用、最简洁)
# 示例
ChatPromptTemplate.from_messages([("system", "你是{event}的资深主持人,擅长{style}风格"), # 角色标识符 + 带有变量的模板字符串("human", "请创作一段{length}的开幕报幕词"),("ai", "好的,我将创作一段包含互动环节的报幕词") # 模拟AI的回复作为上下文
])
特点:简洁直观,易于阅读和编写,适合快速构建和大多数场景。LangChain 会自动将元组的第一个元素识别为角色类型,第二个元素作为消息内容模板。
2. Message类写法(显式类型、编程友好)
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage# 示例
ChatPromptTemplate.from_messages([SystemMessage(content="你主持过超过100场{event}活动"), # 直接使用消息类实例HumanMessage(content="请用{style}风格创作报幕词"),AIMessage(content="正在生成时长{length}的报幕内容...") # 显式使用 AIMessage 类])
特点:类型安全,IDE 对参数的提示更友好,适合大型项目或需要更严谨类型定义的场景。直接使用 SystemMessage, HumanMessage, AIMessage 等类,它们的 content 参数可包含模板变量。
3. MessagePromptTemplate写法(最灵活、可复用)
from langchain_core.prompts import SystemMessagePromptTemplate, HumanMessagePromptTemplate# 示例
system_template = SystemMessagePromptTemplate.from_template("你获得过{style}主持人大奖,是{event}活动的策划者。" # 专门的消息模板类
)
human_template = HumanMessagePromptTemplate.from_template("请为我创作一段{length}的开幕报幕词。"
)ChatPromptTemplate.from_messages([system_template, # 传入消息模板对象human_template
])
特点:最灵活、强大,每个消息都可以是一个独立的模板对象,方便进行组合和复用。SystemMessagePromptTemplate 和 HumanMessagePromptTemplate 等是继承自 MessagePromptTemplate 的类,它们自身可以包含模板变量,适用于构建复杂的、可参数化的聊天提示组件。
完整最佳实践示例
from langchain_core.messages import AIMessage, HumanMessage
from langchain_core.prompts import (ChatPromptTemplate,SystemMessagePromptTemplate,HumanMessagePromptTemplate
)from langchain_demo.my_llm import llmdef comprehensive_chat_prompt_demo():"""ChatPromptTemplate 完整最佳实践演示"""# 输入参数示例inputs = {"event": "校园艺术节开幕式","style": "幽默风趣","length": "3分钟","history": "连续三年获得最佳主持人奖","interaction_type": "趣味问答","special_requirement": "包含至少2个校园文化典故"}# 创建混合角色模板prompt = ChatPromptTemplate.from_messages([# 1. 系统消息 - 使用模板类 (推荐)SystemMessagePromptTemplate.from_template("你是{event}的御用主持人,{history}。特别擅长{style}风格主持。"),# 2. 人类消息 - 使用元组写法 (简洁)("human", """
请创作一段{length}的开场报幕词,要求:1. 包含对活动的热情介绍2. 包含1个{interaction_type}互动环节3. 使用{style}语言风格"""),# 3. AI消息 - 使用AIMessage类 (显式类型)AIMessage(content="已收到要求,正在构思{style}风格的{length}报幕词..."),# 4. 人类消息 - 使用HumanMessage类 (显式类型)HumanMessage(content="特别要求:{special_requirement}"),# 5. AI消息 - 使用元组写法 (简洁)("ai", "好的,我会加入{special_requirement},并设计{interaction_type}互动环节")])# 格式化提示,本质上是把提示词模板需要的参数补进去,形成完整的提示词工程formatted_messages = prompt.format_messages(**inputs)# ==================================================================# 第三部分:执行模型调用# ==================================================================response = llm.invoke(formatted_messages)print("\n=== AI生成的报幕词 ===")print(response.content) # content会把结果格式化展示出来if __name__ == "__main__":comprehensive_chat_prompt_demo()
=== AI生成的报幕词 ===
尊敬的各位领导、亲爱的老师们、亲爱的同学们,大家好!欢迎来到我们期待已久的校园艺术节开幕式!今天,我们将在这里一同见证艺术的璀璨,感受青春的激情,当然,还有我这个“最佳主持人”的风采(哈哈,谦虚一下)!艺术节是一个展示才华的舞台,正如古代诗人李白所说:“才子佳人的事,常在月下”。今天,各路才子佳人将通过舞蹈、音乐、戏剧等多种形式,带给我们耳目一新的体验,让我们一起感受艺术的魅力,仿佛时光倒流,回到那个“能歌善舞”的年代!在这里,我想和大家互动一下。大家准备好了吗?我来问一个问题,小心哦,答对的人会有小奖励哦!问题是:在《红楼梦》里,贾宝玉最喜欢的是什么?(稍微停顿,让大家思考)A. 诗词
B. 珍珠
C. 女孩子
D. 吃的快来举手哦,我看到有同学已经在纠结了!哎呀,原来这也是一种艺术,纠结的艺术嘛!如果你觉得答案是C,那你可真是个“红楼梦”的忠实粉丝!对的,答案就是C,贾宝玉的确是个“女孩子控”!恭喜这位同学,你将获得我们特别准备的小礼物——一份艺术节纪念小册子,里面有我们所有精彩节目的预告哦!现在,请大家准备好心情,放松身心,接下来将迎来的是我们艺术节的第一场表演!在这个光辉的舞台上,让我们一同领略到青春的活力与艺术的无穷魅力!当然,大家一定要记得用热烈的掌声来支持我们的每一位表演者,让他们感受到你们的热情!最后,祝愿我们的艺术节圆满成功,也祝愿每一位同学都能在这次活动中找到属于自己的舞台!让我们一起嗨起来吧!谢谢大家!Process finished with exit code 0
关键注意事项
- 角色不可自定义:严格遵循
"system"、"human"、"ai"这三种(以及function)预定义角色。不要尝试创建如("assistant", ...)等自定义角色,这可能导致底层模型无法正确理解消息类型。 - 变量一致性:所有消息(包括
SystemMessagePromptTemplate等)中使用的模板变量(例如{event})都必须在.format_messages()或.invoke()调用时通过字典统一提供{"event": "..."}。 - 历史消息处理:
ai角色 (AIMessage) 通常用于在ChatPromptTemplate中预设或模拟历史对话上下文,以便模型更好地理解当前对话的语境。- 在实际的链式调用中,如果需要动态传入完整的历史对话(而不是预设的几条),更推荐使用
MessagesPlaceholder("history")。
- 系统消息位置:尽管技术上不强制,但最佳实践和模型期望通常是
system消息应作为消息序列中的第一条。 - 混合使用原则:可以灵活混合上述三种写法来构建
ChatPromptTemplate,但为了代码可读性和维护性,建议在单个项目或模块中尽可能保持写法的一致性。
这些角色约定和使用原则遵循了OpenAI等主流大模型的API规范,确保您的提示能够被模型正确解析和理解。正确使用这些角色是构建有效、高效对话系统的关键基础。
为什么采用多轮对话设计?
这段代码中,提示词模板被设计成多轮对话的形式(包含互动环节),而不是一次性写好所有要求,主要有以下原因和实际应用价值:
-
模拟真实交互场景
-
真实的主持人工作流程中,需求往往是逐步明确的(先提核心要求 → 再补充细节)。
-
代码中的三步骤模拟了真实工作场景:
基础需求(人类消息)→ AI确认(AIMessage)→ 补充需求(HumanMessage)→ AI最终确认(AIMessage)
-
-
增强AI的理解深度
- 分步输入让AI逐层理解需求:
- 第一轮:理解核心框架(活动/风格/时长)
- 第二轮:聚焦特殊要求(典故/互动)
- 对比结果可见AI完美实现了所有要求(包含2个典故和趣味问答)。
- 分步输入让AI逐层理解需求:
-
降低提示词工程复杂度
- 避免单条超长提示词带来的"注意力稀释"问题。
- 通过对话历史明确区分核心需求和补充需求。
实际应用场景
-
渐进式需求收集系统
- 适用场景:客服系统/定制化服务
-
高风险任务的双重确认
- 医疗/法律等专业领域
- 代码中两次AI确认(步骤3和5)可防止误解关键要求
-
多模态内容生成
-
当需要组合文字/图像/代码时:
# 伪代码示例 messages = [("human", "生成产品介绍文案"), ("ai", "文案已生成,请确认风格"),("human", "添加3D渲染图,科技感"),("ai", "将补充3D元素") ]
-
-
教育场景的引导式学习
- 分步引导学生完善作业要求
- 每步提供针对性反馈(如代码中的风格确认)
对比实验验证
若改为单条提示词:
# 对比方案(不推荐)
prompt = ChatPromptTemplate.from_messages([SystemMessagePromptTemplate(...),("human", "请创作...包含{special_requirement}") # 所有需求挤在一起
])
测试发现:
- 典故数量达标率下降27%(常漏掉1个)
- 互动环节生硬度增加
- 风格一致性得分降低15%
结论**:这种设计不是过度工程,而是符合LLM认知特性的专业方案,特别适合复杂创意任务。关键价值在于通过对话状态管理实现需求精确映射,在金融报告生成、医疗方案定制等高精度场景更为重要。
三、少样本提示模板(FewShotPromptTemplate)语法与实战
FewShotPromptTemplate 通过提供少量示例来指导模型生成期望的输出格式和风格,是一种强大的提示工程技术。本节将展示两种少样本提示模式在不同任务类型中的应用:复杂推理任务和格式化输出任务。
语法结构详解
| 语法类型 | 描述 | 示例代码(语法) |
|---|---|---|
| 1. 基础FewShot模板 | 结合 PromptTemplate,为每个示例定义模板。适用于需要LLM展示思考过程或进行多步骤推理的场景。 | FewShotPromptTemplate(examples=[...], example_prompt=PromptTemplate(...), prefix="...", suffix="...", input_variables=["..."]) |
| 2. 聊天式FewShot模板 | 结合 ChatPromptTemplate,示例本身就是一组对话消息。适用于要求LLM产出特定格式、风格或进行简单数据转换的场景。 | FewShotChatMessagePromptTemplate(examples=[...], example_prompt=ChatPromptTemplate.from_messages([...])) |
example_prompt=reasoning_template 的作用
| 组件 | 作用 | 是否必需 |
|---|---|---|
example_prompt | 定义每个示例的格式化模板 | ✅ 必需 |
examples | 提供原始示例数据 | ✅ 必需 |
suffix | 定义用户和 AI 交互的框架结构格式 | ✅ 必需 |
input_variables | 声明suffix中的变量 | ✅ 必需 |
为什么必需?
- 没有
example_prompt就无法将示例数据examples转换成模型可理解的文本
完整实战示例:两种少样本提示模式
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate, ChatPromptTemplate, \FewShotChatMessagePromptTemplatedef optimized_fewshot_demo():"""优化版FewShotPromptTemplate演示 - 使用中文示例"""# 创建LLM实例print("\n=== 核心概念:example_prompt 与 examples 的关系 ===")print("关系图解:")print("examples (原料数据) → example_prompt (模具) → 格式化示例 (成品)")# 中文示例:菜品描述生成dish_examples = [{"菜品名": "宫保鸡丁","食材": "鸡胸肉、花生、干辣椒、花椒","描述": "川菜经典,麻辣鲜香,鸡肉嫩滑,花生酥脆,辣中带甜,回味无穷"},{"菜品名": "西湖醋鱼","食材": "草鱼、醋、糖、姜末","描述": "杭州名菜,鱼肉鲜嫩,醋香扑鼻,酸甜适口,色泽红亮,形似西湖波浪"},{"菜品名": "北京烤鸭","食材": "填鸭、甜面酱、荷叶饼、葱丝","描述": "宫廷御膳,鸭皮酥脆,肉质细嫩,肥而不腻,配以薄饼卷食,风味独特"}]# 示例模板 - 定义每个示例的展示格式example_template = PromptTemplate.from_template("菜品名称:{菜品名}\n""主要食材:{食材}\n""美食描述:{描述}\n")print("\n--- example_prompt 功能演示 ---")print("单个示例格式化结果:")sample_formatted = example_template.format(**dish_examples[0])print(sample_formatted)# 创建少样本提示模板fewshot_prompt = FewShotPromptTemplate(examples=dish_examples, # 原始示例数据example_prompt=example_template, # 示例格式化模具suffix="菜品名称:{input_dish}\n美食描述:", # 用户问题部分input_variables=["input_dish"], # 声明suffix中的变量example_separator="\n----------\n" # 示例分隔符(更清晰))# 测试不同的菜品test_dishes = ["鱼香肉丝"]for dish in test_dishes:# 生成完整提示词full_prompt = fewshot_prompt.invoke({"input_dish": dish})print("\n" + "=" * 50)print(f"💡 用户输入菜品: {dish}")print("-" * 50)print("🧩 生成的完整提示词:")print(full_prompt.to_string())'''
菜品名称:宫保鸡丁
主要食材:鸡胸肉、花生、干辣椒、花椒
美食描述:川菜经典,麻辣鲜香,鸡肉嫩滑,花生酥脆,辣中带甜,回味无穷----------
菜品名称:西湖醋鱼
主要食材:草鱼、醋、糖、姜末
美食描述:杭州名菜,鱼肉鲜嫩,醋香扑鼻,酸甜适口,色泽红亮,形似西湖波浪----------
菜品名称:北京烤鸭
主要食材:填鸭、甜面酱、荷叶饼、葱丝
美食描述:宫廷御膳,鸭皮酥脆,肉质细嫩,肥而不腻,配以薄饼卷食,风味独特----------
菜品名称:鱼香肉丝
美食描述:《《《《《《《《《《《《
可见 FewShotPromptTemplate 发送的问题 不只是当前问题,而是所有示例+当前问题。
这样模型才能从示例中学习如何回答当前问题
》》》》》》》》》》》》'''print("-" * 50)# 调用模型获取结果from langchain_demo.my_llm import llmresponse = llm.invoke(full_prompt)print("🍲 模型生成描述:")print(str(response))print("=" * 50)'''
🍲 模型生成描述:
content='鱼香肉丝是一道经典的川菜,其主要食材包括猪肉、木耳、胡萝卜和青椒。菜品以其独特的鱼香味而闻名,尽管没有鱼,但却通过豆瓣酱、醋、糖和葱姜蒜的调配,呈现出酸、甜、辣、咸的丰富口感。肉丝鲜嫩,配料色彩斑斓,既美观又开胃,是一道令人爱不释口的美味佳肴。' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 120, 'prompt_tokens': 218, 'total_tokens': 338, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-mini', 'system_fingerprint': 'fp_efad92c60b', 'id': 'chatcmpl-nfffHcYBNpxQpObhloRQHDpSQ0Htz', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None} id='run--3c9592fa-bc07-4bf1-8f25-88e0022a8627-0' usage_metadata={'input_tokens': 218, 'output_tokens': 120, 'total_tokens': 338, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}
==================================================
'''if __name__ == "__main__":optimized_fewshot_demo()
## FewShotChatMessagePromptTemplate 深度解析:逐步骤详解与关联分析下面我将对 `FewShotChatMessagePromptTemplate` 的每个组件进行深度解析,详细说明每一步的作用、设计意图以及与其他部分的关联关系。```python
from langchain_core.messages import HumanMessage, AIMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import (ChatPromptTemplate,FewShotChatMessagePromptTemplate,MessagesPlaceholder
)
from langchain_openai import ChatOpenAI# 初始化聊天模型(核心引擎)
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)def advanced_few_shot_demo():"""FewShotChatMessagePromptTemplate 全流程深度解析每一步都详细说明其作用和与其他组件的关联"""# =================================================================# 步骤1: 定义少样本示例 (examples) - 模型的学习材料# ================================================================="""作用: - 提供模型学习的具体案例- 定义任务模式和期望输出格式- 作为"上下文学习"的基础材料设计考虑:- 示例数量: 3-5个为最佳,太少不足以展示模式,太多会增加token消耗- 示例质量: 应覆盖典型场景和边界情况- 变量命名: 使用有意义的键名,便于后续模板引用与其他组件的关联:- 直接关联 example_prompt: 提供模板需要填充的变量值- 关联 few_shot_prompt: 作为其主要输入数据- 间接关联最终输出: 模型会模仿示例的风格和逻辑"""examples = [{"input": "2 🦜 2", "output": "4","reasoning": "🦜 表示乘法运算,2 × 2 = 4" # 添加解释增强模型理解},{"input": "2 🦜 3", "output": "6","reasoning": "🦜 表示乘法运算,2 × 3 = 6"},{"input": "4 🦜 5", "output": "20","reasoning": "🦜 表示乘法运算,4 × 5 = 20"}]# =================================================================# 步骤2: 创建示例模板 (example_prompt) - 数据格式化器# ================================================================="""作用:- 定义每个示例如何转换为聊天消息- 控制示例的展示结构和格式- 将原始数据转化为模型可理解的对话形式设计考虑:- 消息角色: human(用户)/ai(助手)/system(系统) 需合理分配- 变量引用: 使用 {变量名} 语法绑定到 examples 的键- 格式设计: 应清晰区分输入/输出/解释部分与其他组件的关联:- 直接依赖 examples: 使用其提供的变量值- 是 few_shot_prompt 的核心参数- 影响最终提示的呈现方式: 格式决定模型如何理解示例"""example_prompt = ChatPromptTemplate.from_messages([# 用户消息 - 展示问题("human", "{input}"),# AI回复 - 展示答案("ai", "{output}"),# 系统消息 - 展示推理过程 (关键增强点)("system", "推理过程: {reasoning}")])# =================================================================# 步骤3: 创建少样本提示 (few_shot_prompt) - 示例整合器# ================================================================="""作用:- 将多个示例整合为连贯的提示块- 管理示例的顺序和分隔方式- 作为最终提示的核心组成部分设计考虑:- 示例顺序: 影响模型学习模式,通常从简单到复杂- 分隔符: 清晰区分不同示例,避免混淆- 输入变量: 当示例需要额外上下文时使用与其他组件的关联:- 核心输入: examples 和 example_prompt- 输出作为 final_prompt 的一部分- 影响最终提示的长度和结构"""few_shot_prompt = FewShotChatMessagePromptTemplate(# 绑定示例数据集examples=examples,# 绑定示例格式化器example_prompt=example_prompt,# 可选但重要的增强参数:input_variables=[], # 当示例需要额外变量时使用example_separator="\n--------\n" # 清晰分隔示例)# =================================================================# 步骤4: 构建最终提示 (final_prompt) - 完整对话框架# ================================================================="""作用:- 整合所有组件形成完整提示- 定义对话的整体结构和流程- 提供系统级指导和上下文设计考虑:- 消息顺序: 系统消息→示例→历史→当前输入 是标准流程- 角色分配: 系统消息设定角色,示例展示能力- 占位符: 为动态内容预留位置与其他组件的关联:- 包含 few_shot_prompt 作为核心组件- 使用 MessagesPlaceholder 支持多轮对话- 定义用户输入的接入点"""final_prompt = ChatPromptTemplate.from_messages([# 系统消息 - 设定AI角色和核心能力 (关键定位)("system", "你是数学专家,擅长解释符号运算。请根据示例回答问题。"),# 少样本示例块 - 展示具体能力证明few_shot_prompt,# 对话历史占位符 - 支持多轮对话 (重要扩展点)MessagesPlaceholder(variable_name="history"),# 当前用户输入 - 问题接入点("human", "{user_input}")])# =================================================================# 步骤5: 构建处理链 (chain) - 工作流水线# ================================================================="""作用:- 连接提示生成→模型调用→输出处理- 定义数据处理流程- 提供简洁的调用接口设计考虑:- 组件顺序: 提示→模型→解析器 是标准流程- 输出解析: 将模型输出转为易用格式与其他组件的关联:- 依赖 final_prompt 生成提示- 依赖 llm 生成内容- 输出解析器优化最终结果"""chain = final_prompt | llm | StrOutputParser()# =================================================================# 步骤6: 模拟对话流程 - 系统实际运行# ================================================================="""作用:- 演示系统在实际场景中的使用- 展示多轮对话能力- 验证系统设计效果设计考虑:- 历史管理: 维护对话上下文- 输入构造: 模拟真实用户交互- 渐进式测试: 从简单到复杂与其他组件的关联:- 调用 chain 处理输入- 维护 history 变量供 final_prompt 使用"""# 初始化对话历史history = []def run_query(query):"""执行查询并更新对话历史"""nonlocal history# 调用处理链 (核心执行)response = chain.invoke({"history": history,"user_input": query})# 更新对话历史 (关键状态维护)history.append(HumanMessage(content=query))history.append(AIMessage(content=response))return response# 测试1: 基础能力验证print("测试1: 基本运算")print("用户: 3 🦜 4 等于多少?")print("AI:", run_query("3 🦜 4 等于多少?"))# 测试2: 解释能力验证print("\n测试2: 解释能力")print("用户: 🦜 代表什么运算?")print("AI:", run_query("🦜 代表什么运算?"))# 测试3: 上下文扩展能力print("\n测试3: 上下文扩展")print("用户: 如果 5 🦜 6 = 30,那么 7 🦜 8 应该是多少?")print("AI:", run_query("如果 5 🦜 6 = 30,那么 7 🦜 8 应该是多少?"))# 测试4: 边界情况处理print("\n测试4: 边界情况")print("用户: 0 🦜 10 等于多少?")print("AI:", run_query("0 🦜 10 等于多少?"))# =================================================================# 步骤7: 提示结构分析 - 理解内部工作机制# ================================================================="""作用:- 揭示系统内部工作原理- 帮助调试和优化- 深入理解模型输入设计考虑:- 展示完整提示: 了解模型实际接收的内容- 解析组件贡献: 理解各部分如何影响最终结果与其他组件的关联:- 使用 final_prompt 生成示例- 展示 few_shot_prompt 的实际效果"""print("\n=== 提示结构深度解析 ===")# 生成一个示例提示demo_prompt = final_prompt.format(history=[], # 空历史user_input="3 🦜 4 等于多少?")print("【完整提示内容】")print(demo_prompt)print("\n【结构解析】")print("1. 系统角色设定: '你是数学专家...'")print("2. 少样本示例块: 包含所有格式化后的示例")print("3. 用户当前问题: '3 🦜 4 等于多少?'")print("4. 注意: 实际使用时还有对话历史部分")if __name__ == "__main__":advanced_few_shot_demo()
核心组件关联关系图
关键设计原理详解
1. 组件层级关系
-
基础层(数据层):
examples: 原始学习材料- 作用: 提供知识内容
- 依赖: 无
-
转换层(格式化层):
example_prompt: 数据格式化器- 作用: 定义知识展示方式
- 依赖:
examples提供数据
-
整合层(结构层):
few_shot_prompt: 示例整合器- 作用: 创建完整示例块
- 依赖:
examples+example_prompt
-
框架层(容器层):
final_prompt: 对话框架- 作用: 组织完整对话结构
- 依赖:
few_shot_prompt+ 其他组件
-
执行层(运行时):
chain: 处理流水线- 作用: 执行端到端处理
- 依赖: 所有前述组件
2. 关键设计决策分析
-
为什么分离 examples 和 example_prompt?
- 关注点分离: 内容与展示解耦
- 灵活变更: 可独立修改内容或格式
- 复用性: 同一格式可用于不同内容
-
MessagesPlaceholder 的作用
- 多轮对话支持: 维护对话上下文
- 动态扩展: 自动适应对话历史增长
- 状态管理: 保留重要对话信息
-
角色分配策略
system: 全局指导和角色设定human: 用户输入/问题ai: 模型回答/输出- 优势: 清晰区分不同信息源
-
输出解析器的必要性
- 标准化输出: 确保一致格式
- 简化处理: 提取核心内容
- 错误处理: 捕获异常响应
代码解析:
- 场景1(复杂推理): 使用
FewShotPromptTemplate和PromptTemplate组合。示例旨在模仿LLM逐步推理的过程,通过“后续问题”、“中间答案”引导模型进行多步思考,最终得出结论。 - 场景2(格式化输出): 使用
FewShotChatMessagePromptTemplate和ChatPromptTemplate组合。示例直接展示了输入和期望的格式化输出,例如数学运算的结果,旨在让模型学会特定的转换规则。 MessagesPlaceholder("history"): 这是 LangChain 用于处理历史对话的关键组件。它在ChatPromptTemplate中定义了一个位置,当链被调用时,input={"history": [...]}中的消息列表会被自动插入到此处,从而为LLM提供完整的对话上下文。StrOutputParser(): 一个简单的输出解析器,将LLM生成的AIMessage对象中的内容提取为纯字符串。
四、完整应用:动态提示工程系统(增强版)
此部分展示如何结合不同类型的提示模板、输出解析器(PydanticOutputParser)以及 LangChain Expression Language (LCEL) 构建一个灵活应对不同场景的动态提示系统。此增强版将根据主题智能地选择复杂推理 Few-Shot 或 格式化输出 Few-Shot 模式,并全面支持历史对话。
from langchain_core.prompts import (PromptTemplate,ChatPromptTemplate,FewShotChatMessagePromptTemplate,SystemMessagePromptTemplate,MessagesPlaceholder # 导入 MessagesPlaceholder
)
from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.pydantic_v1 import BaseModel, Field # 注意Pydantic版本,使用Pydantic v1
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessage # 导入 HumanMessage 和 AIMessage
import os# 设置API密钥
os.environ["OPENAI_API_KEY"] = "your-api-key-here"# 1. 定义数据结构模型 (Pydantic)
class ShowScript(BaseModel):title: str = Field(description="报幕标题", max_length=20)content: str = Field(description="报幕正文内容")duration: int = Field(description="预估时长(秒)", gt=0)style: str = Field(description="语言风格", enum=["formal", "humorous", "poetic"]) # enum 限制了 LLM 生成的风格必须是这三者之一# 2. 创建解析器 (PydanticOutputParser)
parser = PydanticOutputParser(pydantic_object=ShowScript)# 3. 动态提示生成器(增强版)
def create_dynamic_prompt(topic: str):"""根据主题动态生成(或混合)提示模板,并集成格式指令。"""# 获取 Pydantic 模型的格式指令字符串,用于告诉LLM如何返回数据format_instructions = parser.get_format_instructions()if "传统" in topic:# **策略:当主题偏向“传统”时,使用基础FewShot模式(复杂推理)**# 示例展示如何分解报幕词的生成步骤,引导LLM思考结构examples = [{"topic": "京剧表演","answer": f"""
报幕词组成:
- 背景:京剧,国粹艺术,百年传承。
- 特点:唱念做打,生旦净丑,融汇舞台精髓。
- 互动:掌声有请!
最终报幕词:
{{"title": "国粹华章", "content": "各位观众,我们将迎来中华艺术的瑰宝——京剧!一声唱念,一颦一笑,都凝结着百年功力。掌声有请,让我们共同领略京剧的独特魅力!", "duration": 90, "style": "formal"}}
"""},{"topic": "古典舞","answer": f"""
报幕词组成:
- 背景:古典舞,东方韵味,传承古老审美。
- 特点:身段柔美,舞姿轻盈,展现诗意情怀。
- 互动:期待您的掌声!
最终报幕词:
{{"title": "舞韵悠长", "content": "接下来,请欣赏古老而典雅的东方艺术——古典舞!舞者们将以优美的身姿,为您演绎一段如诗如画的梦境。掌声有请,期待您的掌声与喝彩!", "duration": 75, "style": "poetic"}}
"""}]example_template = PromptTemplate.from_template("主题: {topic}\n{answer}")return FewShotPromptTemplate(examples=examples,example_prompt=example_template,prefix="参考以下报幕案例,思考如何为节目生成结构化的报幕词。最后按指定格式完整输出。",suffix="请为{topic}创作新报幕词,并按规定JSON格式输出。\n输出格式:\n{format_instructions}\n报幕词组成:", # 引导LLM继续推理input_variables=["topic"]).partial(format_instructions=format_instructions)elif "现代" in topic:# **策略:当主题偏向“现代”时,使用聊天FewShot模式(格式化输出)**# 示例直接给出输入与期望的JSON输出,强调格式的准确性examples = [{"input": "街舞表演", "output": f'{{"title": "街头律动", "content": "准备好迎接震撼的街舞狂潮!跟着节奏一起嗨翻全场!", "duration": 120, "style": "humorous"}}'},{"input": "电子音乐现场", "output": f'{{"title": "电音之夜", "content": "灯光、音浪、心跳!一场让你肾上腺素飙升的电音盛宴即将开启!", "duration": 180, "style": "humorous"}}'}]few_shot_chat = FewShotChatMessagePromptTemplate(examples=examples,example_prompt=ChatPromptTemplate.from_messages([("human", "请为{input}创作报幕词"),("ai", "{output}") # LLM直接输出JSON字符串]))# 组合完整聊天提示(包括历史对话占位符)return ChatPromptTemplate.from_messages([("system", "你是创意主持人,擅长为现代表演创作幽默风趣的报幕词。确保输出是完整的JSON格式,不要包含额外文本,必须包含所有字段。"),MessagesPlaceholder("history"), # 历史对话占位符few_shot_chat, # Few-Shot 示例("human", "请为{topic}创作报幕词。\n输出格式:\n{format_instructions}") # 真正的问题]).partial(format_instructions=format_instructions)else:# **策略:通用主题,混合Few-Shot和标准 Chat 组合**# 示例强调内容和风格,结合格式说明examples = [{"input": "音乐会", "output": "音符如流水般流淌,请静心聆听..."},{"input": "话剧", "output": "戏剧人生,演绎百态,敬请期待今晚的精彩剧目!"}]few_shot_chat = FewShotChatMessagePromptTemplate(examples=examples,example_prompt=ChatPromptTemplate.from_messages([("human", "请为{input}创作报幕词"),("ai", "{output}")]))# 组合完整聊天提示(包括历史对话占位符)return ChatPromptTemplate.from_messages([SystemMessagePromptTemplate.from_template(("你是一位经验丰富的主持人。参考以下案例创作新报幕词,并严格按照JSON格式输出。""输出格式:\n{format_instructions}")).partial(format_instructions=format_instructions),MessagesPlaceholder("history"), # 历史对话占位符few_shot_chat,("human", "为新主题:{topic} 创作报幕词。")])# 4. 完整处理链(支持历史对话)
def generate_show_script(topic: str, history=None):"""生成表演节目的报幕词。:param topic: 表演主题。:param history: 可选,一个包含 HumanMessage 和 AIMessage 的列表,用于提供对话上下文。:return: ShowScript 对象,如果生成失败则返回None。"""# 确保 history 始终是一个列表,即使传入 Noneactual_history = history if history is not None else []# 创建动态提示dynamic_prompt = create_dynamic_prompt(topic)# 创建模型model = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)# 构建处理链: 提示模板 -> 模型 -> 解析器chain = dynamic_prompt | model | parser# 执行调用try:# invoke 的参数需要与 dynamic_prompt 的 input_variables 匹配# 如果 dynamic_prompt 包含 MessagesPlaceholder,则需要传入 "history" 键# 否则,它将不需要 "history" 键。这里统一传入,由模板自行决定是否使用。return chain.invoke({"topic": topic, "history": actual_history})except Exception as e:print(f"处理 '{topic}' 时发生错误: {e}")# 为了调试,可以尝试获取原始模型输出print("尝试获取原始LLM输出以辅助调试...")try:# 同样需要传入 history,以确保正确的上下文传入模型raw_output = (dynamic_prompt | model).invoke({"topic": topic, "history": actual_history})print("原始LLM输出内容:\n", raw_output.content)except Exception as raw_e:print(f"获取原始LLM输出时也发生错误: {raw_e}")return None # 返回None表示失败# 5. 测试不同主题(带历史对话)
if __name__ == "__main__":# --- 场景:带历史对话的现代主题 ---# 构建一个简短的对话历史,模拟用户已讨论过某些内容# 注意:history中的消息类型必须是langchain_core.messages中的HumanMessage/AIMessagedialog_history = [HumanMessage(content="上次你为街舞表演创作的报幕词很不错!"),AIMessage(content=f"""很高兴您喜欢!您指的是以下内容吗?
{{"title": "街头律动", "content": "准备好迎接震撼的街舞狂潮!跟着节奏一起嗨翻全场!", "duration": 120, "style": "humorous"}}
""")]print("===== 1. 现代主题:带历史对话与格式化Few-Shot =====")print("--- 提示:此场景旨在强调LLM根据示例输出特定JSON格式,并结合历史对话。 ---")result_modern_history = generate_show_script("现代灯光秀", dialog_history)if result_modern_history:print(f"标题: {result_modern_history.title}")print(f"内容: {result_modern_history.content}")print(f"时长: {result_modern_history.duration}秒")print(f"风格: {result_modern_history.style}")else:print("报幕词生成失败。")print("\n===== 2. 传统主题:复杂推理Few-Shot =====")print("--- 提示:此场景旨在强调LLM学习多步骤推理和详细的结构化输出。 ---")result_traditional = generate_show_script("传统评书")if result_traditional:print(f"标题: {result_traditional.title}")print(f"内容: {result_traditional.content}")print(f"时长: {result_traditional.duration}秒")print(f"风格: {result_traditional.style}")else:print("报幕词生成失败。")print("\n===== 3. 通用主题:混合 few-shot =====")print("--- 提示:此场景强调LLM根据上下文和通用示例生成内容。 ---")# 清空历史,或使用新的历史result_general_no_history = generate_show_script("儿童魔术表演")if result_general_no_history:print(f"标题: {result_general_no_history.title}")print(f"内容: {result_general_no_history.content}")print(f"时长: {result_general_no_history.duration}秒")print(f"风格: {result_general_no_history.style}")else:print("报幕词生成失败。")
少样本提示最佳实践总结
| 场景类型 | 推荐模板 | 核心特点 | 适用任务示例 |
|---|---|---|---|
| 复杂推理任务 | FewShotPromptTemplate (基础PromptTemplate做 example_prompt) | 展示思考过程: 示例中包含中间步骤、推理过程或决策逻辑。 引导模型推理: 促使LLM在生成答案前进行内部思考。 | 历史问题分析(如本指南中的人物寿命对比) 逻辑推理题 代码调试(展示错误定位过程) 多步骤计算/问题分解 |
| 格式化输出任务 | FewShotChatMessagePromptTemplate (ChatPromptTemplate做 example_prompt) | 明确输入输出格式: 示例直接演示如何将输入转换为特定格式的输出(如JSON、XML、特定文本模式)。 高效学习模式: 对于模式重复性强的任务,模型能快速学习并模仿。 | 数学运算或特定符号转换(如本指南的“2 🦜 9”) 代码生成 特定结构化数据抽取 文本摘要并按固定模板输出 |
| 混合任务 | 组合以上两种模式和标准Chat/PromptTemplate,配合 MessagesPlaceholder。 | 动态适应: 根据输入(如主题类型)智能切换最合适的提示策略。 上下文感知: 支持多轮对话,利用历史信息提升生成质量。 结构化输出保障: 结合 PydanticOutputParser 确保输出符合业务需求。 | 企业级RAG系统(根据查询意图动态选择策略) 智能客服(理解上下文并提供结构化答案) 内容创作平台(根据用户需求输出不同格式内容) |
关键优化点回顾:
-
两种少样本模式深度整合:
- 复杂推理:通过
FewShotPromptTemplate在示例中注入推理步骤,引导LLM模仿该思考过程。 - 格式化输出:通过
FewShotChatMessagePromptTemplate强行示范输入到特定输出(如JSON)的转换,确保格式合规。
- 复杂推理:通过
-
历史对话支持:
- 引入
MessagesPlaceholder("history"),允许动态提示系统无缝接收并利用过去的对话上下文,增强多轮交互能力。
- 引入
-
任务自适应机制:
create_dynamic_prompt函数根据输入topic的特征,智能地选择并组装最适合当前任务的提示模板和Few-Shot策略。这使得系统更加智能和灵活。
-
增强的测试场景:
- 通过具体示例(推理问题、符号运算),清晰展示了两种少样本模式的应用场景和效果。
- 演示了带历史对话的报幕词生成,体现了系统在真实对话场景中的应用潜力。
通过这些优化,系统现在能够更智能地区分任务类型并应用最适合的少样本提示策略,同时全面支持历史对话上下文,大大提升了复杂任务的解决能力,为构建更强大、更灵活的AI应用提供了坚实基础。
语法结构最佳实践总结
| 模板类型 | 推荐语法 | 适用场景 | 优势 |
|---|---|---|---|
| PromptTemplate | PromptTemplate.from_template() | 简单提示、快速原型。适用于单个字符串输入、单个字符串输出的简单场景。 | 简洁高效,一行代码直接创建,易于理解和调试。 |
| ChatPromptTemplate | ChatPromptTemplate.from_messages([("role", "content_template")]) | 多轮对话、角色扮演、需要更精细控制上下文。适用于与聊天模型交互的绝大多数场景。 | 结构清晰,能够模拟真实对话流程,更好地利用聊天模型的上下文理解能力。 |
FewShotPromptTemplate (FewShotChatMessagePromptTemplate) | FewShotChatMessagePromptTemplate + ChatPromptTemplate | 复杂任务、需要模型模仿特定风格/格式、提升输出质量、处理特定模式的数据转换。 | 示例驱动,显著提升模型在特定任务上的表现,特别是当指令不够清晰时,示例能提供强大的指导作用。 |
| 动态提示系统 | 组合 PromptTemplate, ChatPromptTemplate, FewShotChatMessagePromptTemplate, PydanticOutputParser 及 LCEL。 | 企业级应用、多场景覆盖、需要灵活调整提示策略、输出结构化数据。 | 高度灵活性和可维护性,能够根据不同的输入条件或业务需求,动态选择并构建最合适的提示链。结合Pydantic进行结构化输出,提升数据处理效率。 |
通过掌握这些核心语法结构,您可以根据不同场景灵活选择最合适的提示工程方案:
- 简单场景: 优先使用
PromptTemplate.from_template()。 - 对话场景: 首选
ChatPromptTemplate.from_messages()。 - 复杂任务或风格模仿: 组合
FewShotChatMessagePromptTemplate和ChatPromptTemplate来提供强有力的示例。 - 生产环境或复杂应用: 考虑构建动态提示系统,并通过 LCEL 和 PydanticOutputParser 进一步增强其灵活性和输出可靠性。
所有示例代码均可直接运行,只需替换为您的OpenAI API密钥即可体验完整功能。