1.1 关于LangChain中的FewShotPromptTemplate的使用

📄 文件代码内容

python 复制代码
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
from langchain_community.llms.tongyi import Tongyi

# 示例的模板
example_template = PromptTemplate.from_template("单词:{word}, 反义词:{antonym}")

# 示例的动态数据注入 要求是list内部套字典
examples_data = [
    {"word": "大", "antonym": "小"},
    {"word": "上", "antonym": "下"},
]

few_shot_template = FewShotPromptTemplate(
    example_prompt=example_template,    # 示例数据的模板
    examples=examples_data,             # 示例的数据(用来注入动态数据的),list内套字典
    prefix="告知我单词的反义词,我提供如下的示例:",                   # 示例之前的提示词
    suffix="基于前面的示例告知我,{input_word}的反义词是?",          # 示例之后的提示词
    input_variables=['input_word']      # 声明在前缀或后缀中所需要注入的变量名
)

prompt_text = few_shot_template.invoke(input={"input_word": "左"}).to_string()
print(prompt_text)

model = Tongyi(model="qwen-max")

print(model.invoke(input=prompt_text))

🔄 代码流程梳理

  1. 导入所需模块

    • PromptTemplate:用于定义单个示例的模板。
    • FewShotPromptTemplate:用于构建包含少量示例的提示模板。
    • Tongyi:通义千问模型封装(LLM)。
  2. 定义示例模板

    • 使用 PromptTemplate.from_template 创建 example_template,格式为 "单词:{word}, 反义词:{antonym}"
    • 该模板用于将每个示例(字典)渲染成字符串。
  3. 准备示例数据

    • examples_data 是一个列表,包含两个示例字典,分别提供 wordantonym
  4. 构建 FewShotPromptTemplate

    • example_prompt:指定示例渲染模板。
    • examples:传入示例数据列表。
    • prefix:在所有示例前添加的固定提示。
    • suffix:在所有示例后添加的提示,包含变量 {input_word}
    • input_variables:声明需要动态注入的变量(此处为 input_word)。
  5. 生成最终提示文本

    • 调用 few_shot_template.invoke({"input_word": "左"}),将 input_word 替换为 "左",得到 PromptValue 对象。
    • 通过 .to_string() 转为字符串,打印输出,查看最终提示内容。
  6. 模型调用与输出

    • 初始化通义千问模型(Tongyi(model="qwen-max"))。
    • 将生成的提示字符串传入 model.invoke(),获得模型回复并打印。

💡 高频面试知识点与回答思路

1. FewShotPromptTemplate 的作用及适用场景
  • 作用:通过提供少量示例(Few-shot)引导模型理解任务格式和输出要求,提升模型在特定任务上的表现(尤其是格式严格、风格固定或需要推理的任务)。
  • 适用场景:分类、命名实体识别、代码生成、格式转换等需要模仿示例的任务。
2. FewShotPromptTemplatePromptTemplate 的关系
  • PromptTemplate 定义单个示例的格式化方式。
  • FewShotPromptTemplate 将多个示例拼接起来,并在前后添加前缀/后缀,构成完整的提示。它内部会复用 example_prompt 来渲染每个示例。
3. prefixsuffix 的设计要点
  • prefix 通常用于描述任务背景或规则,suffix 用于提出最终问题。两者之间插入所有示例。
  • 示例数量不宜过多(通常 2~5 个),以免超出模型上下文窗口或引入过多噪声。
4. input_variables 的作用
  • 声明在 suffix(或 prefix)中出现的占位符变量名,运行时需要提供对应的值。
  • 若使用 invoke 传入参数,必须包含这些变量。
5. Few-shot 与 Zero-shot 的区别
  • Zero-shot:不给示例,仅靠指令。
  • Few-shot:提供少量示例,模型能更好地理解预期输出格式和风格。
  • 在模型能力较弱或任务格式复杂时,Few-shot 效果通常优于 Zero-shot。
6. 如何动态选择示例(高级用法)
  • 可通过 example_selector 参数,根据输入动态选择最相关的示例(如基于相似度),提高示例的针对性和提示质量。
7. 该示例中 to_string() 的作用
  • PromptValue 转为纯字符串,便于调试或与非聊天模型(如 Tongyi)对接(该模型可能接受字符串输入)。
  • 在实际开发中,也可直接传递 PromptValue 给支持消息列表的模型。
8. 通义千问(Tongyi)与 Chat 模型的区别
  • Tongyi 是 LLM(非聊天模型),接受字符串输入返回字符串。
  • ChatTongyi 是聊天模型,接受消息列表。两者接口不同,需按需选择。

📌 面试回答话术(示例)

"该文件展示了 LangChain 中 FewShotPromptTemplate 的使用。它通过提供少量示例(如"大→小"、"上→下"),让模型学会"反义词"任务格式。FewShotPromptTemplate 将示例模板、示例数据、前缀和后缀组合成一个完整提示,最终注入变量(如 input_word)生成具体问题。这种方法在任务格式特殊或模型需要模仿风格时非常有效。实际项目中,我还会结合 example_selector 动态选择最相关的示例,进一步提升提示质量。"