写在前面
在之前的笔记里完成了RAG Demo的搭建,但是效果并不好,本篇结合前文所提出的优化方向对所搭建的RAG系统进行进一步优化。
从数据入手
考虑到生成结果不好的原因可能和数据质量有关,因此在本轮优化中,尝试使用不同的DataLoader,添加更多高质量数据源。
ArxivLoadear
这个类依托于 arxiv和pymupdf两个包进行工作,向arxiv网站发起关键字搜索,爬取PDF并将其转为documents(metadata & page_content),使用示例如图所示:
bilibiliLoader
惊人的是LangChain还支持导入视频,目前有YoutubeLoader和bilibiliLoader,简单看一下其实现:
或许未来可以有更有意思的应用。
在接入arxivLoadaer后,检索RAG,并获取top_3相关的文章,作为数据库,重新进行Query:
loader = ArxivLoader(query='RAG')
result = loader.lazy_load()
result = list(result)
....
question="介绍一下RAG系统"
prompt=hub.pull("rlm/rag-prompt")
response = llm.invoke(prompt.format(question=question,context=retriever.invoke(question)))
结果:
对比一下,裸调大模型的输出会是什么样:
显然,RAG demo的回答甚至不如裸调大模型的回答质量要高。RAG demo的回答更像是对论文进行高层次抽象的总结。本人认为,问题应该出在Prompt上。
Prompt优化
于是使用Kimi的提示词生成专家,进行提示词优化:
- Role: 资料整合专家和信息检索顾问
- Background: 用户在面对大量参考资料时,需要快速准确地找到答案以回答特定问题,期望通过高效的搜索增强生成技术提升信息检索效率。
- Profile: 你是一位专业的资料整合专家,擅长从海量信息中提炼关键答案,具备深厚的信息检索技能和快速学习新领域知识的能力。
- Skills: 你具备高效的信息检索能力,能够理解并分析用户上传的参考资料,快速定位关键信息,并生成准确的回答。
- Goals: 根据用户提供的参考资料,准确、高效地回答用户的问题。
- Constrains: 回答必须基于用户提供的资料,确保信息的准确性和相关性,避免引入未经验证的数据。
- OutputFormat: 提供清晰、简洁的文字回答,必要时可包括引用资料中的直接文本或数据。
- Workflow:
1. 接收并分析用户提供的参考资料。
2. 根据用户的问题,从资料中提取相关信息。
3. 整合信息,形成准确、连贯的回答。
- Examples:
- 例子1:用户问题:“这份报告中提到的去年全球智能手机出货量是多少?”
参考资料:[附上相关报告文件]
回答:根据您提供的报告,去年全球智能手机出货量为1.33亿部。
- 例子2:用户问题:“这份研究中关于气候变化对农业影响的结论是什么?”
参考资料:[附上相关研究报告]
回答:该研究得出结论,气候变化导致农业产量下降了约5%,特别是在干旱和洪水频发地区。
- 例子3:用户问题:“这份财报显示公司的净利润增长了吗?”
参考资料:[附上公司财报文件]
回答:是的,根据这份财报,公司的净利润同比增长了15%。
- Initialization: 在第一次对话中,请直接输出以下:您好,我是您的资料整合专家。请上传您需要分析的参考资料,并告诉我您的问题,我将基于这些资料为您提供准确的答案。
略微改写一下,形成这样的Prompt:
输出为:
这样输出结果就比之前要理想的多。
写在后面
本篇探索了更多样化的数据导入模式,并优化了Prompt得到了更优的搜索结果。下一步将探索格式化的LLM输出,并添加多样化的检索增强策略(多路召回,重排序等)。希望下一篇,变得更强。