做 AI 应用开发的人应该都有过这种经历:明明在提示词里写了一大堆要求,大模型还是会输出不符合预期的内容,甚至一本正经地胡说八道。这时候,与其继续堆砌文字说明,不如试试 LangChain 里的 FewShotPromptTemplate------ 用几个简单的示例,就能让大模型瞬间明白你想要什么。视频在这里《17. LangChain FewShotPromptTemplate 少样本应用实战》。
这个工具的底层逻辑是少样本学习,说白了就是让大模型先看几个正确的示范,再去处理新的任务。不管是翻译、文本分类还是逻辑推理,只要给对了例子,它的输出准确率和一致性都会有明显提升。
它的核心思想特别朴素:与其给 AI 写几百字的任务说明,不如直接扔给它两三个具体的例子。大模型对示例的理解能力,远比我们想象的要强得多。
这里有个容易踩的坑:创建 FewShotPromptTemplate 的时候,examples 和 example_selector 这两个参数是互斥的,必须填其中一个,不然代码直接报错。绝大多数情况下,我们直接用 examples 参数把准备好的示例数据传进去就行。
|-------------------|--------------|----------|-------------------------------------|
| 组件 | 说明 | 必填性 | 示例 |
| example_selector | 动态选择示例的选择器 | 二选一 | SemanticSimilarityExampleSelector |
| examples | 示例数据列表,每个是字典 | 二选一 | [{"input": "Hi", "output": "你好"}] |
| example_prompt | 单个示例的格式化模板 | 必填 | PromptTemplate.from_template(...) |
| prefix | 示例前的引导文本 | 可选,默认"" | "请把英文翻译成中文:" |
| suffix | 示例后的用户输入提示 | 必填 | "Input: {new_input}\nOutput:" |
| input_variables | 用户输入变量列表 | 必填 | ["new_input"] |
| example_separator | 示例之间的分隔符 | 默认\n\n | "\n" |
先来看最基础的用法,针对文本补全模型,我们可以这样写:
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
# 准备示例数据
examples = [
{"input": "Hello", "output": "你好"},
{"input": "Thank you", "output": "谢谢"},
{"input": "Good morning", "output": "早上好"},
]
# 定义示例的格式化模板
example_prompt = PromptTemplate.from_template(
"{input} -> {output}"
)
# 创建 FewShotPromptTemplate
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
prefix="请把以下英文翻译成中文:",
suffix="{new_input} -> ",
input_variables=["new_input"],
example_separator="\n",
)
prompt_value = few_shot_prompt.invoke(
{
"new_input": "Good bye"
}
)
print(prompt_value.to_string())
res = llm.invoke(prompt_value, config=config)
print(res.content)
如果用的是聊天模型,就要用专门的 FewShotChatMessagePromptTemplate,用法也差不多:
from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate
# 准备示例数据
examples = [
{"input": "Hello", "output": "你好"},
{"input": "Thank you", "output": "谢谢"},
{"input": "Good morning", "output": "早上好"},
]
# 定义示例的格式化模板
example_prompt = ChatPromptTemplate.from_messages(
[
{"role": "user", "content": "{input}"},
{"role": "ai", "content": "{output}"}
]
)
# 创建示例提示词模版
few_shot_prompt = FewShotChatMessagePromptTemplate(
examples=examples,
example_prompt=example_prompt
)
# 构建最终的聊天提示模板
chat_prompt = ChatPromptTemplate.from_messages(
[
{"role": "system", "content": "请把以下英文翻译成中文:"},
few_shot_prompt,
{"role": "user", "content": "{new_input}"}
]
)
# 输入内容
prompt_value = chat_prompt.invoke(
{
"new_input": "Where are you from?",
}
)
print(prompt_value.to_string())
res = llm.invoke(prompt_value, config=config)
print(res.content)
总的来说,FewShotPromptTemplate 是解决大模型输出不稳定问题最简单也最有效的手段之一。不用改模型,不用调参数,只要花几分钟准备几个高质量的示例,就能让你的 AI 应用体验上一个台阶。