一、结构化输出原因
- LangChain 输出解析器在提示中添加 {format_instructions},明确指示模型依据特定 schema 格式化输出文本,如 JSON 格式,使智能程度较高的模型(如 GPT3.5 及以上)能生成结构化数据。
二、提示工程原则与策略
-
吴恩达老师提出两大原则:写出清晰而具体的指示;给模型思考的时间。
-
Open AI 官方文档给出 6 大策略:写清晰的指示;给模型提供参考(示例);将复杂任务拆分成子任务;给 GPT 时间思考;使用外部工具;反复迭代问题。这些原则与策略不仅适用于大模型,也有助于人类处理问题时思路清晰。
三、提示结构组成
-
指令(Instuction):告知模型任务大致内容、做法,如使用外部信息、处理查询与构造输出,常是提示模板固定部分,如设定模型角色为 “有用的 XX 助手”。
-
上下文(Context):作为模型额外知识来源,可手动插入、通过矢量数据库检索或其他方式(API、计算器等工具)获取,如传递向量数据库查询到的知识。
-
提示输入(Prompt Input):具体问题或要求模型做的事,可与 “指令” 合二为一,拆分后便于复用模板,作为变量在调用模型前传递给提示模板。
-
输出指示器(Output Indicator):标记生成文本开始,如写 “解” 或特定代码开头(如 “import”),ChatGPT 对话时可有可无,LangChain 代理常以 “Thought:” 引导模型输出推理。
四、LangChain 提示模板类型
- String(StringPromptTemplate)和 Chat(BaseChatPromptTemplate)为基本类型,并构建不同类型模板。
- PromptTemplate 使用示例:通过 from_template 方法自动提取变量名创建提示模板对象,再用 prompt.format 方法替换占位符形成具体提示,也可通过构造函数手工指定 input_variables。
- ChatPromptTemplate:适用于聊天模型,有对应角色,代码展示了 Chat Model 中的各种消息角色。
五、FewShotPromptTemplate
-
FewShot 概念起源:源于机器学习,Few-Shot Learning 重要参考文献是 2016 年 Vinyals, O. 的《小样本学习的匹配网络》,提出匹配网络针对单样本学习;Zero-Shot Learning 代表性参考文献是 2009 年 Palatucci, M. 的《基于语义输出编码的零样本学习》。在提示工程中,Few-Shot 给予模型几个示例帮助理解任务并生成响应,Zero-Shot 仅依据任务描述生成响应。
-
使用步骤:
- 创建示例样本:每个示例为字典,含输入变量及对应值,作为模型参考信息。
- 创建提示模板:基于指定输入变量和模板字符串创建 PromptTemplate 对象,将字典示例格式转换为提示模板。
- 创建 FewShotPromptTemplate 对象:结合上一步的 prompt_sample 和示例列表生成更复杂提示。
-
示例选择器:若示例多,为避免低效和浪费流量,LangChain 提供示例选择器(如 SemanticSimilarityExampleSelector)根据语义相似性选最相关示例创建 FewShotPromptTemplate 对象,可节省 Token 用量。
六、总结
- 提示工程原理包括明确输出格式、遵循相关原则策略、构建合适提示结构与模板等。
- 提供示例对解决某些任务极为关键,FewShot 方式通常能提升模型回答质量,若效果不佳可考虑对模型微调或尝试高级提示技术