Generated by GPT-4o

你甚至应该相信双子座的百万标记上下文窗口吗?

想象一下,你被要求分析你公司的整个数据库 - 数百万客户互动,数年的财务数据和无数的产品评论 - 以提取有意义的见解。你转向人工智能寻求帮助。你把所有数据都塞进 Google Gemini 1.5,具有新的一百万标记上下文长度,并开始发出请求,似乎正在解决问题。但一个令人不安的问题仍然存在:你能相信人工智能准确处理和理解所有这些信息吗?当它处理如此庞大的数据量时,你对其分析有多有信心?你是否需要翻阅一百万个标记的数据来验证每一个答案?

传统人工智能测试,如众所周知的“大海捞针”测试,在真正评估人工智能在大量连贯信息中推理能力方面存在不足。这些测试通常涉及在一个同质的背景中隐藏不相关的信息(针)。问题在于,这使得焦点集中在信息检索和异常检测,而不是全面理解和综合。我们的目标不只是看它能不能在大海捞针中找到针,而是评估它是否能理解整个“大海捞针”。

使用真实世界的App Store信息数据集,我们系统地测试了逐渐增加的上下文长度下的Gemini 1.5闪光版本。我们要求它比较应用价格,回顾特定的隐私政策细节,并评估应用评级 - 这些任务需要信息检索和推理能力。对于我们的评估平台,我们使用了LangChain开发的LangSmith,证明在这个实验中是一个宝贵的工具。

结果简直令人惊叹!让我们深入了解。

设置实验

你可以跟着我们在这个Jupyter笔记本中的完整实验。

选择我们的数据集

我们需要3个数据集用于我们的实验:

  1. App数据集:我们使用了苹果应用商店数据集,这是一个关于1万个应用程序的真实世界信息集合。这个数据集为我们提供了丰富多样的信息进行分析。
  2. 黄金数据集: 我们随机选择了5个应用程序,用于制定我们的评估数据集问题和地面真实答案。这5个应用程序将需要在实验的每一步中包含在上下文中。
  3. 评估数据集:我们根据黄金数据集制作了一组三个问题和答案。这些是我们将要问双子座Flash的问题,我们将评估其答案与我们写的标准答案。
  4. examples = [
    {
    "question": "Do the 'Sago Mini Superhero' and 'Disney Channel Watch Full Episodes Movies TV' apps require internet connection?",
    "answer": "You can play Sago Mini Superhero without wi-fi or internet. Internet is required for Disney Channel Watch Full Episodes Movies TV"
    },
    {
    "question": "Where can I find the privacy policy for the 'Disney Channel Watch Full Episodes Movies TV' app?",
    "answer": "http://disneyprivacycenter.com/"
    },
    {
    "question": "Which one costs less? The 'KQ MiniSynth' app or the 'Sago Mini Superhero' app?",
    "answer": "The 'KQ MiniSynth' app costs $5.99, the 'Sago Mini Superhero' app costs $2.99. So 'Sago Mini Superhero' is cheaper"
    }
    ]

利用Gemini 1.5 Flash

对于我们的AI模型,我们利用了谷歌的Gemini 1.5 Flash。该模型允许在其上下文窗口中最多有100万个标记,大约相当于70万个词!在撰写本文时,Gemini 1.5 Flash的成本约为每百万输入标记0.70美元,而且这还没有缓存。这与GPT-3.5或Claude Haiku的定价相当。

LangSmith: 我们的评估平台

为了管理我们的实验并评估结果,我们转向了LangChain的LangSmith。LangSmith为我们提供了一些适合这种实验的功能。

  1. 当我们将评估数据集上传到LangSmith时,我们可以在LangSmith控制台中进行版本控制、拆分甚至生成合成数据。
  2. 我们所有的实验结果和追踪数据都在LangSmith中针对每个数据集进行跟踪。仪表板允许我们可视化不同上下文长度的性能。

在运行我们的实验时,不是必须的,但使用LLM作为评判员进行自动评估是相当方便的。在我们的情况下,这意味着对于数据集中的每个问题:

  1. 双子座闪光试图回答这个问题
  2. 根据数据集中我们编写的地面真实答案,如果Flash的答案正确,我们将有GPT-4o得分。

这个功能是通过LangSmith自定义评估器实现的,这些评估器是简单的Python函数,用来返回评估的得分。


# We define the scoring schema for the LLM to respond in
# using Pydantic
class EvaluationSchema(BaseModel):
"""An evaluation schema for assessing the correctness of an answer"""
reasoning: str = Field(
description="Detailed reasoning for the evaluation score")
correct: bool = Field(
description="Whether the user's answer is correct or not")

# Our evaluation function
def qa_eval(root_run: Run, example: Example):
"""Evaluate the correctness of an answer to a given question"""
# The question from the dataset example
question = example.inputs["question"]

# Gemini's answer
flash_answer = root_run.outputs["output"]

# Ground truth answer from the dataset
correct_answer = example.outputs["answer"]

# Force GPT-4o to respond in the scoring schema
llm = ChatOpenAI(model="gpt-4o", temperature=0.4).with_structured_output(EvaluationSchema)

system_prompt = f"""You are a judge tasked with evaluating a user's answer to a given question.
You will be provided with the question, the correct answer, and the user's thought process and answer.

Question:
{question}

Correct Answer:
{correct_answer}

Your job is to assess the user's answer and provide:
1. Detailed reasoning for your evaluation, comparing the user's answer to the correct answer
2. A boolean judgment on whether the user's answer is correct or not

Be thorough in your reasoning and accurate in your judgment. Consider partial correctness and any nuances in the answers."""

# Invoke the model with all of the context
evaluation: EvaluationSchema = llm.invoke(
[SystemMessage(content=system_prompt),
HumanMessage(content=flash_answer)]
)

score = 1 if evaluation.correct else 0

return {
"score": score,
"key": "correctness",
"comment": evaluation.reasoning
}

如果您不熟悉LangChain或Python,我们只是写一个函数(qa_eval),该函数从数据集中获取问题、Flash的答案和正确答案,并将它们全部放入一个提示中供GPT-4o使用。我们使用.with_structured_output来确保LLM以特定的模式回应,以便我们可以返回LangSmith期望的分数模式。

运行实验

我们逐渐增加上下文长度,直到完整的百万词汇容量,每次增加5万个词汇。要生成这些不同长度的上下文,我们编写了一个名为get_context的函数,将:

  1. 从我们的“黄金数据集”中开始,包括5个应用程序。
  2. 直到达到所需的令牌数量,添加额外的应用程序数据
  3. 在上下文中随机排列应用程序的顺序,以避免任何位置偏见。

目标功能

我们在我们的“目标函数”中使用这个get_context函数。目标函数描述了将用于生成需要评估的输出的函数。在我们的情况下,目标函数:

  1. 使用应用程序数据填充上下文窗口,直到我们在该步骤中测试的令牌数量。
  2. 将上下文放入Gemini Flash的提示中
  3. 用数据集中的问题查询Gemini Flash,并返回模型的响应。

这是我们目标函数的简化版本:

def predict(inputs: dict):
tokens = (max_context_limit / total_steps) * current_step
context = get_context(tokens)

system_prompt = f"""You are tasked with answering user questions based on the App Store data inside <APP STORE DATA>.
Use ONLY the information provided in the context. Be as accurate as possible."""

response = llm.invoke([
SystemMessage(content=system_prompt),
HumanMessage(content=inputs["question"])
])

return {"output": response.content}

我们将所有这些内容封装到一个自定义的Python类中,只是为了方便跟踪步骤并控制每个实验,然后我们就可以准备运行了!

result = evaluate(
self.predict, # Our predict function
data=client.list_examples(dataset_name=dataset_name), # Our evaluation dataset
evaluators=[qa_eval], # Our custom evaluator
experiment_prefix=f"{self.model}-{tokens}" # Prefixes the experiments in Langsmith for readability
)

结果

我们与 Gemini 1.5 闪光进行的实验结果简直是惊人的!无论是 50,000 个标记还是达到一百万个标记容量,Gemini 1.5 闪光在回答我们的测试问题时都达到了100%的准确率!

Experiment Results in LangSmith

您可以在LangSmith这里查看完整的测试结果。

让我们来分解一下这意思:

  1. 🔬 完美准确性:无论我们给予 Gemini 1.5 Flash 50,000标记的上下文还是1,000,000标记,它始终正确回答我们的问题。这种一致性水平令人印象深刻,并表明该模型能够有效处理和利用来自极大上下文的信息。
  2. 🧠信息综合:我们的问题需要不仅仅是检索信息。它们涉及比较来自不同上下文部分的数据点。 Gemini 1.5 Flash的满分表明具有强大的能力,可以理解跨越广泛上下文的信息,而不仅仅是定位特定字符串。

放在适当的背景下,Gemini 1.5 Flash 在最大上下文长度时,可以在处理相当于一本400页书的查询时准确地回答问题。这是传统文档分析能力的显著飞跃。

然而,值得注意的是我们实验的一些限制:

  1. 问题复杂度:我们的问题虽然需要综合,但相对简单。我们故意避免了需要复杂数值推理或跨整个数据集识别趋势的问题。
  2. 有限问题集:我们为每个评估使用了一套小问题集。更大更多样化的问题集可能会更深入地揭示模型的能力。

尽管存在这些局限性,但结果仍然非常令人兴奋。它们表明,即使在处理海量背景信息时,Gemini 1.5 Flash 仍能以极低成本保持高准确性和信息综合能力。这为在各个领域的应用提供了令人兴奋的可能性,从商业分析到科学研究。

如果你喜欢这篇文章,可以访问智者博客获取更多类似内容!

2024-08-31 04:11:32 AI中文站翻译自原文