共计 1579 个字符,预计需要花费 4 分钟才能阅读完成。
最近开始研究Agent记忆这块,现在的大模型都是有指定的窗口限制,比如gpt3.5 8k token 的窗口。理论上在这个窗口内的聊天信息,gpt都应该了如指掌,现在gpt4-128k,那么在这128k内它真的是什么都记住了?基于此才有这篇文章的存在。
在 github上看到这个项目 https://github.com/gkamradt/LLMTest_NeedleInAHaystack 做了这样的一个测试。
测试
- 在一个长篇背景中(称为“needle”),将一个随机的事实或陈述(称为“haystack”)放在中间
- 请模型检索此陈述
- 迭代不同的文档深度(即放置haystack的位置)和上下文长度,以衡量性能
将 haystack放在不同的位置就是用来测试模型的记忆能力,比如放在最开始和最后LLM输出的结果就是不一样,那么就验证了首尾存在着差异。
目前代码只支持OpenAI和Anthropic分析的代码。
如果运行并且 save_results = True
,那么这个脚本将会生成一个 result/
目录,并填充评估信息。由于可能存在并发请求,每个新的测试将会保存为多个文件。
我已经将原始测试结果放在 /original_results
中。由于我升级了脚本,所以数据格式可能与您的脚本结果不匹配。
关键参数:
- - 将放置在您的上下文(“干草堆”)中的陈述或事实
haystack_dir
– 包含要作为背景上下文加载的文本文件的目录。仅支持文本文件。- 在背景环境中找到您的答案的问题
- 您可能希望对相同的长度/深度组合运行多次测试,如果是这样,请更改版本号
- 迭代的上下文长度列表的起始点
- 迭代上下文长度列表的结束点
- - 在您的最小值和最大值之间迭代的间隔数量
- - 文档深度的起始点。应为大于0的整数。
- - 文档深度的结束点。应为整数 < 100。
- - 在您的最小/最大点之间执行的迭代次数
- - 确定要迭代的深度分布。可以选择’linear’(线性)或’sigmoid’(S型)。
model_provider
– ‘OpenAI’ 或 ‘Anthropic’model_name
– 您想要测试的模型名称。应与需要传递给API的确切值匹配。例如:gpt-4-1106-preview
- - 是否要将结果保存到文件中。无论如何,结果都将在对象中临时保存。是/否
- 是否要将您的上下文保存到文件中。警告:这些文件会变得非常长。是/否
其他参数:
-
context_lengths
– 一组自定义的上下文长度。如果设置了,将覆盖context_lengths_min
、最大值和间隔的设定值。 - - 一个自定义的文档深度长度集合。如果设置了,它将覆盖
document_depth_percent_min
、最大值和间隔的设定值。 openai_api_key
– 必须提供。用于评估的GPT-4。可以在创建对象时传递,也可以作为环境变量传递。- - 仅在测试人类模型时需要。可以在创建对象时传递,也可以作为环境变量传递。
- - 默认值:1。如果您希望并行运行更多请求,请将其设置为更高的值。请注意速率限制。
- - 每个输入中要减去的上下文量,以考虑系统消息和输出令牌。目前可以更智能地处理,但现在使用的是固定值。默认为200个令牌。
- - 默认值:无,如果您希望减慢请求的速度,请设置以秒为单位的时间
- - 默认值:True,是否打印测试完成时的状态信息
结果可视化
LLMNeedleInHaystackVisualization.ipynb
包含了生成数据透视表可视化的代码。然后将数据透视表转移到 Google 幻灯片中进行自定义注释和格式设置。请查看 Google 幻灯片版本。在此处查看创建此可视化的概述。
OpenAI的GPT-4-128K(2023年11月8日发布)
在64k以内可以确定全部记得所有的内容,在这之后其实都会存在部分位置无法记住的情况。