📄 文件代码内容
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))
🔄 代码流程梳理
-
导入所需模块
PromptTemplate:用于定义单个示例的模板。FewShotPromptTemplate:用于构建包含少量示例的提示模板。Tongyi:通义千问模型封装(LLM)。
-
定义示例模板
- 使用
PromptTemplate.from_template创建example_template,格式为"单词:{word}, 反义词:{antonym}"。 - 该模板用于将每个示例(字典)渲染成字符串。
- 使用
-
准备示例数据
examples_data是一个列表,包含两个示例字典,分别提供word和antonym。
-
构建 FewShotPromptTemplate
example_prompt:指定示例渲染模板。examples:传入示例数据列表。prefix:在所有示例前添加的固定提示。suffix:在所有示例后添加的提示,包含变量{input_word}。input_variables:声明需要动态注入的变量(此处为input_word)。
-
生成最终提示文本
- 调用
few_shot_template.invoke({"input_word": "左"}),将input_word替换为"左",得到PromptValue对象。 - 通过
.to_string()转为字符串,打印输出,查看最终提示内容。
- 调用
-
模型调用与输出
- 初始化通义千问模型(
Tongyi(model="qwen-max"))。 - 将生成的提示字符串传入
model.invoke(),获得模型回复并打印。
- 初始化通义千问模型(
💡 高频面试知识点与回答思路
1. FewShotPromptTemplate 的作用及适用场景
- 作用:通过提供少量示例(Few-shot)引导模型理解任务格式和输出要求,提升模型在特定任务上的表现(尤其是格式严格、风格固定或需要推理的任务)。
- 适用场景:分类、命名实体识别、代码生成、格式转换等需要模仿示例的任务。
2. FewShotPromptTemplate 与 PromptTemplate 的关系
PromptTemplate定义单个示例的格式化方式。FewShotPromptTemplate将多个示例拼接起来,并在前后添加前缀/后缀,构成完整的提示。它内部会复用example_prompt来渲染每个示例。
3. prefix 和 suffix 的设计要点
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动态选择最相关的示例,进一步提升提示质量。"