掌握Few-Shot示例:提升LLM生成效果的秘诀

170 阅读3分钟

引言

在生成式AI中,提供少量示例(few-shot)是一种强有力的方法,可以显著提升语言模型(LLM)的生成效果。通过在提示模板中嵌入示例,模型可以更好地理解任务目标及其复杂性。这篇文章将详细介绍如何使用Few-Shot示例来改善模型的生成性能,涵盖从创建提示模板到使用示例选择器的各个环节。

主要内容

创建Few-Shot提示模板

要开始Few-Shot示例,首先需要创建一个提示模板(PromptTemplate)来格式化示例。

from langchain_core.prompts import PromptTemplate

example_prompt = PromptTemplate.from_template("Question: {question}\n{answer}")

构建示例集

接下来,我们需要构建一个示例集。每个示例是一个字典,代表一个输入和输出。

examples = [
    {
        "question": "Who lived longer, Muhammad Ali or Alan Turing?",
        "answer": """
Are follow up questions needed here: Yes.
Follow up: How old was Muhammad Ali when he died?
Intermediate answer: Muhammad Ali was 74 years old when he died.
Follow up: How old was Alan Turing when he died?
Intermediate answer: Alan Turing was 41 years old when he died.
So the final answer is: Muhammad Ali
""",
    },
    # 更多示例...
]

使用FewShotPromptTemplate

创建一个FewShotPromptTemplate对象,使用这些示例及其格式化模板。

from langchain_core.prompts import FewShotPromptTemplate

prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    suffix="Question: {input}",
    input_variables=["input"],
)

print(
    prompt.invoke({"input": "Who was the father of Mary Ball Washington?"}).to_string()
)

使用示例选择器

为了提高灵活性,可以使用示例选择器(ExampleSelector)来动态选择与输入相似度最高的示例。

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

example_selector = SemanticSimilarityExampleSelector.from_examples(
    examples,
    OpenAIEmbeddings(),
    Chroma,
    k=1,
)

question = "Who was the father of Mary Ball Washington?"
selected_examples = example_selector.select_examples({"question": question})

代码示例

以下是完整的代码示例,展示了如何创建和使用Few-Shot的模板和选择器。

from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
from langchain_chroma import Chroma
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_openai import OpenAIEmbeddings

example_prompt = PromptTemplate.from_template("Question: {question}\n{answer}")

examples = [
    {
        "question": "Who lived longer, Muhammad Ali or Alan Turing?",
        "answer": """
Are follow up questions needed here: Yes.
Follow up: How old was Muhammad Ali when he died?
Intermediate answer: Muhammad Ali was 74 years old when he died.
Follow up: How old was Alan Turing when he died?
Intermediate answer: Alan Turing was 41 years old when he died.
So the final answer is: Muhammad Ali
""",
    },
    # 更多示例...
]

example_selector = SemanticSimilarityExampleSelector.from_examples(
    examples,
    OpenAIEmbeddings(),
    Chroma,
    k=1,
)

prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=example_prompt,
    suffix="Question: {input}",
    input_variables=["input"],
)

print(
    prompt.invoke({"input": "Who was the father of Mary Ball Washington?"}).to_string()
)

常见问题和解决方案

问题1: 输出结果不准确?

  • 解决方案: 确保示例集覆盖了输入问题的足够多样性,或者增加示例数量。

问题2: 模型不理解任务?

  • 解决方案: 提高示例和输入间的语义相似度,可以利用更多的上下文信息。

总结和进一步学习资源

Few-Shot示例是提高生成型AI性能的有效手段。通过这一技术,开发者可以更有效地引导模型生成更准确、更相关的内容。为了深入了解更多关于Few-Shot技术的应用,请查看以下资源:

参考资料

  1. Langchain Documentation
  2. OpenAI API Documentation

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