百万上下文RAG,Agent还能这么玩
作者: Asksia 来源: Asksia
❝
在AI技术飞速发展的今天,我们见证了许多令人惊叹的突破。最近,Qwen2 模型的开源引起了广泛的关注,它不仅展示了超越闭源模型的能力,还带来了一个全新的框架——Qwen-Agent 。
Qwen-Agent 的设计思路虽然与LangChain 相似,但其发布几个的Agent示例却很有意思。今天本文将深入探讨如何使用Qwen-Agent 将上下文记忆扩展到百万量级 ,让Agent的智能得到更广泛的应用。
暴力关键字检索优于向量方案
在处理大规模文本数据时,一个关键的挑战是如何快速准确地定位到最相关的信息块。Qwen-Agent通过一种看似“暴力”的方法——,基于LLM判断相关性 AND基于关键字检索 ,解决了这一难题。这种方法虽然简单,但在实际操作中却显示出了意想不到的效果。
关键字检索的基本原理
关键字检索 是一种直接且高效的方法,尤其是在面对大规模文本数据时。通过预先定义的关键字,我们可以快速定位到包含这些关键字的文本块。这种方法的优势在于其速度和简单性,尤其是在处理大规模数据时。
实现关键字检索的步骤
1.预处理文本数据 :将大规模文本数据分块。
2.基于LLM判断相关性 :并行处理每个分块,让聊天模型评估其与用户查询的相关性, 如果相关则输出相关句子用于后续检索。
3.分析用户指令,提取关键字 :通过LLM对用户指令进行两个方面的预处理。1.区分指令信息与非指令信息。2.从查询的信息部分推导出多语言关键词
4.最终检索 :运用BM25这一传统的基于关键词的检索方法,找出与提取关键词最相关的块并生成最终答案,这一步骤的实现方式与通常的RAG相同。。
示例代码
from qwen_agent.agents import Assistant
from qwen_agent.gui import WebUI
def test():
bot = Assistant(llm={'model': 'qwen-plus'})
messages = [{'role': 'user', 'content': [{'text': '介绍图一'}, {'file': 'https://arxiv.org/pdf/1706.03762.pdf'}]}]
for rsp in bot.run(messages):
print(rsp)
def app_gui():
# Define the agent
bot = Assistant(llm={'model': 'qwen-plus'},
name='Assistant',
description='使用RAG检索并回答,支持文件类型:PDF/Word/PPT/TXT/HTML。')
chatbot_config = {
'prompt.suggestions': [
{
'text': '介绍图一'
},
{
'text': '第二章第一句话是什么?'
},
]
}
WebUI(bot, chatbot_config=chatbot_config).run()
if __name__ == '__main__':
# test()
app_gui()
实践案例
假设我们有一个包含100万字的维基百科语料库,其中包含了大量关于历史、科学、文化等方面的知识。现在,用户想要查询爱因斯坦在1905年发表了什么重要的理论?用英语回答
传统的向量检索方法:
-
将整个维基百科语料库转换为向量表示,并存储在向量数据库中。
-
将用户查询转换为向量,并在向量数据库中进行相似度检索。
-
返回与用户查询向量最相似的文本块。
由于维基百科语料库包含了大量关于爱因斯坦的信息,传统的向量检索方法很可能会返回很多与用户查询不直接相关的文本块,例如爱因斯坦的生平介绍、其他科学家的理论等等,导致检索精度下降。
Qwen-Agent的关键字检索方法:
-
将维基百科语料库切分为多个小的文本块,每个文本块包含512字。
-
将用户问题通过LLM转换为检索关键字,例如“爱因斯坦”、“1905年”、“理论”。并区分检索信息与指令
{
"信息": ["爱因斯坦在1905年发表了什么重要的理论"],
"指令": ["用英文回复"]
}
-
基于检索信息(爱因斯坦在1905年发表了什么重要的理论 ),并行过滤所有分块,查询相关性,并抽取相关语句。
-
基于检索关键字(“爱因斯坦”、“1905年”、“理论” )检索分块。
-
将匹配到的文本块输入到Qwen模型中,模型会根据这些文本块的内容推理出答案:“爱因斯坦在1905年发表了狭义相对论。”
通过这种方式,Qwen-Agent可以更精准地定位到与用户查询相关的文本块,避免了无关信息的干扰,提高了检索效率和答案的准确性。
检索之前先做推理,多跳问题又快又准
在基于文档的问题回答中,一个典型的挑战是多跳推理。多跳推理是指需要结合多个文档的信息才能回答用户问题的情况。例如,用户可能会问“《红楼梦》的作者是谁的粉丝?”,要回答这个问题,就需要先找到《红楼梦》的作者是曹雪芹,然后找到曹雪芹是哪个朝代的人,最后才能找到答案。
什么是多跳推理
多跳推理是指在回答一个问题时,需要跨越多个不同的文本块或信息源,逐步推理得到最终答案。这种方法能够提供更准确和全面的回答,但也增加了计算复杂度。
多跳推理的实现步骤
1.初步推理 :首先将用户问题转化分解为逐级递进的子问题。
2.子问题检索 :调用上述RAG的能力,进行问题检索与回答。
3.多跳推理 :逐步在推理链上进行推理,得到最终答案。
实践案例
例如,考虑回答问题:“与第五交响曲创作于同一世纪的交通工具是什么?
-
首先将问题转化为子问题“贝多芬的第五交响曲是在哪个世纪创作的?“
-
通过RAG获取答案为:19世纪
-
提出新的子问题:“19世纪期间发明了什么交通工具?“
-
通过RAG获取答案为:自行车
-
最后推理出与第五交响曲创作于同一世纪的交通工具是自行车。
以用促训,Agent智能反哺模型
官方实验结果表明,4k-智能体在处理长上下文方面的表现优于32k-模型。这种分块阅读所有上下文的方式,使得Agent能够克服原生模型在长上下文训练上的不足。而Agent智能在使用过程中生产的数据,则能迭代用于后续长文本上下文的进一步微调。
智能反哺模型的实现步骤
1.智能体训练 :通过与用户交互,训练智能体,使其能够处理复杂的上下文推理任务。
2.数据合成 :利用智能体生成的数据,构建新的训练数据集。
3.模型微调 :使用新生成的数据集对模型进行微调,提高模型在长上下文任务中的表现。
总结
通过本文的探讨,我们了解到Qwen-Agent 如何通过智能体扩展模型的上下文记忆,以及如何利用这些智能体来提升模型的性能。这不仅为AI技术的发展提供了新的思路,也为我们在处理大规模文本数据时提供了有效的工具。希望这篇文章能为大家在实际应用中提供一些启发和帮助。
以上就是本文的全部内容,希望能够帮助新手程序员更好地理解Qwen-Agent 的工作原理,并激发大家对AI技术更深层次的探索和思考。如果你对本文有任何疑问或建议,欢迎在评论区留言,我们一起讨论。
PS:AI小智技术交流群(技术交流、摸鱼、白嫖课程为主)又不定时开放了,感兴趣的朋友,可以在下方公号内回复:666,即可进入。
老规矩,道友们还记得么,右下角的 “在看” 点一下,如果感觉文章内容不错的话,记得分享朋友圈让更多的人知道!
更多AI工具,参考Github-AiBard123,国内AiBard123