**使用Few-shot示例提高聊天模型性能的指南**

80 阅读3分钟

使用Few-shot示例提高聊天模型性能的指南

引言

在AI和编程领域,少量示例(Few-shot)技术是一种简单却强大的方法,可以通过提供一些输入输出示例来引导生成过程,并在某些情况下显著提高模型的性能。本文将探讨如何在聊天模型中使用Few-shot示例,并提供实用的代码示例,帮助开发者更好地理解和应用这一技术。

主要内容

1. Few-shot示例的基础

Few-shot示例是一种通过提供几个示例来帮助模型理解任务的技术。主要包括以下组件:

  • examples: 包含在最终提示中的字典示例列表。
  • example_prompt: 通过其 format_messages 方法将每个示例转换为一个或多个消息。

2. 使用固定示例进行Few-shot提示

固定示例是最基本和常见的Few-shot提示技术,可以选择一个链条评估并避免生产中的额外移动部件。让我们来看一个简单的示例,定义一个数学运算符,该运算符以"🦜"表情符号表示,并为模型提供一些示例。

# 安装必要的包
%pip install -qU langchain langchain-openai langchain-chroma

import os
from getpass import getpass

# 设置API密钥
os.environ["OPENAI_API_KEY"] = getpass()

from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0.0)

# 尝试问模型一个问题(未提供示例时)
response = model.invoke("What is 2 🦜 9?")
print(response)

输出如下:

AIMessage(content='The expression "2 🦜 9" is not a standard mathematical operation or equation...', response_metadata={...})

3. 提供Few-shot示例

现在我们为模型提供一些数学操作的示例,使其理解新的运算符"🦜"意味着加法。

from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate

examples = [
    {"input": "2 🦜 2", "output": "4"},
    {"input": "2 🦜 3", "output": "5"},
]

# 定义每个示例的消息格式
example_prompt = ChatPromptTemplate.from_messages(
    [
        ("human", "{input}"),
        ("ai", "{output}"),
    ]
)

# 构建Few-shot提示模板
few_shot_prompt = FewShotChatMessagePromptTemplate(
    example_prompt=example_prompt,
    examples=examples,
)

# 最终提示模板
final_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "You are a wondrous wizard of math."),
        few_shot_prompt,
        ("human", "{input}"),
    ]
)

# 使用模型和提示模板
chain = final_prompt | model

# 请求模型进行计算
response = chain.invoke({"input": "What is 2 🦜 9?"})
print(response)

输出如下:

AIMessage(content='11', response_metadata={...})

4. 动态Few-shot提示

动态Few-shot提示允许基于输入选择示例。可以使用 SemanticSimilarityExampleSelector,基于语义相似性选择最相似的示例。

from langchain_chroma import Chroma
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_openai import OpenAIEmbeddings

examples = [
    {"input": "2 🦜 2", "output": "4"},
    {"input": "2 🦜 3", "output": "5"},
    {"input": "2 🦜 4", "output": "6"},
    {"input": "What did the cow say to the moon?", "output": "nothing at all"},
    {
        "input": "Write me a poem about the moon",
        "output": "One for the moon, and one for me, who are we to talk about the moon?",
    },
]

to_vectorize = [" ".join(example.values()) for example in examples]
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_texts(to_vectorize, embeddings, metadatas=examples)

# 创建示例选择器
example_selector = SemanticSimilarityExampleSelector(
    vectorstore=vectorstore,
    k=2,
)

print(example_selector.select_examples({"input": "horse"}))

# 输出类似于:
# [{'input': 'What did the cow say to the moon?', 'output': 'nothing at all'},
#  {'input': '2 🦜 4', 'output': '6'}]

# 构建Few-shot提示模板
few_shot_prompt = FewShotChatMessagePromptTemplate(
    input_variables=["input"],
    example_selector=example_selector,
    example_prompt=ChatPromptTemplate.from_messages(
        [("human", "{input}"), ("ai", "{output}")]
    ),
)

# 最终提示模板
final_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "You are a wondrous wizard of math."),
        few_shot_prompt,
        ("human", "{input}"),
    ]
)

# 使用模型和提示模板
chain = final_prompt | ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0.0)

response = chain.invoke({"input": "What's 3 🦜 3?"})
print(response)

输出如下:

AIMessage(content='6', response_metadata={...})

常见问题和解决方案

  1. 模型无法理解运算符含义
    • 提供更多示例,确保示例覆盖广泛的输入输出。
  2. API访问问题

总结和进一步学习资源

Few-shot示例是一种高效方法,可显著提高模型对特定任务的理解能力。通过动态选择示例,可以使模型更加灵活和智能。建议进一步阅读以下资源,以深入了解和应用Few-shot提示技术:

参考资料

  1. OpenAI API
  2. LangChain Documentation

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---