里有个容易踩的坑:创建 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)