LangChain实战课笔记04 提示模板 | 豆包MarsCode AI刷题

111 阅读5分钟

一、提示工程的原则与策略

吴恩达老师在其 ChatGPT Prompt Engineering for Developers 公开课中提出针对大模型提示工程的两大原则:写出清晰而具体的指示、给模型思考的时间。Open AI 的官方文档 GPT 最佳实践中也给出了一脉相承的 6 大策略,包括写清晰的指示、给模型提供参考(示例)、将复杂任务拆分成子任务、给 GPT 时间思考、使用外部工具、反复迭代问题。这些原则和策略不仅对大语言模型有指导意义,也有助于我们自身思维过程的清晰化,体现了大模型思维过程与人类思维过程的相通性。

二、提示的结构

一个实用的提示框架包含指令(Instruction)、上下文(Context)、提示输入(Prompt Input)和输出指示器(Output Indicator)。

  • 指令:告知模型任务大概内容、做法,如使用外部信息、处理查询及构造输出的方式,常是提示模板中较固定部分,如 “你是一个有用的 XX 助手” 可让模型更认真对待角色。
  • 上下文:作为模型额外知识来源,信息可手动插入、通过矢量数据库检索或其他方式(如调用 API、计算器等工具)获取,如将向量数据库查询到的知识作为上下文传递给模型。
  • 提示输入:通常是具体问题或需大模型做的具体事情,虽可与 “指令” 合二为一,但拆分后更结构化,便于复用模板,常作为变量在调用模型前传递给提示模板以形成具体提示。
  • 输出指示器:标记要生成文本的开始,如生成 Python 代码时用 “import” 表明开始编写代码,ChatGPT 对话中有时可有可无,LangChain 代理构建提示模板时常用 “Thought:” 引导模型输出推理。

三、LangChain 提示模板的类型

LangChain 提供 String(StringPromptTemplate)和 Chat(BaseChatPromptTemplate)两种基本类型模板,并构建了不同类型提示模板。其导入方式多样,如from langchain.prompts.prompt import PromptTemplate等,有时也可直接从 LangChain 包导入,如from langchain import PromptTemplate

image.png 不同类型的提示模板

(一)使用 PromptTemplate

通过示例说明其使用,如创建模板你是业务咨询顾问。你给一个销售{product}的电商公司,起一个好的名字?,使用PromptTemplate.from_template方法创建提示模板对象,再用prompt.format方法将{product}替换为具体值(如 “鲜花”)得到具体提示。也可通过构造函数手工指定input_variables创建模板,如prompt = PromptTemplate(input_variables=["product", "market"], template="你是业务咨询顾问。对于一个面向{market}市场的,专注于销售{product}的公司,你会推荐哪个名字?"),二者效果相同。

(二)使用 ChatPromptTemplate

针对 ChatGPT 等聊天模型,LangChain 提供的模板有对应角色。OpenAI 对传输到 gpt - 3.5 - turbo 和 GPT - 4 的 message 格式有规定,包括系统、用户、助理角色及对应内容。LangChain 的 ChatPromptTemplate 依此设计。示例中先导入聊天消息类模板,构建模板如你是一位专业顾问,负责为专注于{product}的公司起名。(系统消息模板)和公司主打产品是{product_detail}。(用户消息模板),再通过ChatPromptTemplate.from_messages方法创建提示模板对象,最后格式化提示消息并传入模型得到结果。

(三)使用 FewShotPromptTemplate

FewShot(少样本)概念是提示工程重要部分,对应 OpenAI 提示工程指南中 “给模型提供参考(示例)”。

  • Few - Shot 思想起源:Few - Shot、One - Shot(单样本)和 Zero - Shot(零样本)概念起源于机器学习,旨在让模型在极少或无示例情况下学习新事物,在机器学习和深度学习研究中逐渐形成发展。Few - Shot Learning 相关重要参考文献有 2016 年 Vinyals, O. 的《小样本学习的匹配网络》,Zero - Shot Learning 相关有 2009 年 Palatucci, M. 的《基于语义输出编码的零样本学习(Zero - Shot Learning with semantic output codes)》。在提示工程中也被广泛应用,如 GPT - 3 模型在《Language models are Few - Shot learners(语言模型是少样本学习者)》论文中被指出可通过提升规模实现出色 Few - Shot 学习性能。

  • 使用 FewShotPromptTemplate

    • 创建示例样本:创建包含花的类型、适合场合及对应广告文案的字典列表作为示例,如[{"flower_type": "玫瑰","occasion": "爱情","ad_copy": "玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。"},...]
    • 创建提示模板:用PromptTemplate创建格式化示例的提示模板对象,如template="鲜花类型: {flower_type}\n场合: {occasion}\n文案: {ad_copy}"prompt_sample = PromptTemplate(input_variables=["flower_type", "occasion", "ad_copy"], template=template)
    • 创建 FewShotPromptTemplate 对象:利用之前的prompt_sample和示例列表创建FewShotPromptTemplate对象,如prompt = FewShotPromptTemplate(examples=samples, example_prompt=prompt_sample, suffix="鲜花类型: {flower_type}\n场合: {occasion}", input_variables=["flower_type", "occasion"]),可生成包含多个示例和新提示的复杂模板。
    • 调用大模型创建新文案:将FewShotPromptTemplate对象输出给大模型(需设置 OpenAI API Key),如model = OpenAI(model_name='gpt - 3.5 - turbo - instruct')result = model(prompt.format(flower_type="野玫瑰", occasion="爱情")),模型可根据示例模仿写出新文案。
  • 使用示例选择器:当示例很多时,为避免一次性发送所有示例给模型造成不现实和低效,以及节省 Token 用量(OpenAI 按 Token 收费),LangChain 提供示例选择器。如from langchain.prompts.example_selector import SemanticSimilarityExampleSelector等,先初始化示例选择器(需安装向量数据库,如 Chroma),再创建使用示例选择器的FewShotPromptTemplate对象,可根据语义相似度选择最相关示例构建提示,如生成红玫瑰文案时,示例选择器会找到最相似的 “玫瑰” 示例构建模板。

四、总结

通过对 LangChain 中这些提示模板的学习与应用,我们能更好地进行提示工程,让大模型生成更符合需求的结果,提升其在各种任务中的表现与应用价值,为我们的实际工作和项目开发提供有力支持与帮助。