RAG 优化技巧:7 大挑战与解决方案
在当今快速发展的人工智能领域,大型语言模型(LLM)已经成为无处不在的技术,它们不仅改变了我们与机器交流的方式,还在各行各业中发挥着革命性的影响。
然而,尽管 LLM + RAG(检索增强生成)的能力已经让人惊叹,但在实际使用 RAG 优化 LLM 的过程中,我们仍会遇到许多挑战和困难。常见问题包括检索器返回不准确或不相关的数据,以及基于错误或过时信息生成答案。本文旨在提出 RAG 常见的 7 大挑战,并附带各自相应的优化方案,帮助改善 RAG 系统的表现。
下图展示了 RAG 系统的两个主要流程:检索和查询;红色方框代表可能会遇到的挑战点,主要有 7 项:
- Missing Content: 缺失内容
- Missed Top Ranked: 错误排序内容,导致正确答案没有被成功 Retrieve
- Not in Context: 上下文限制,导致正确答案没有被采用
- Wrong Format: 格式错误
- Incomplete: 回答不全面
- Not Extracted: 未能检索信息
- Incorrect Specificity: 不合适的详细回答
这些挑战不仅关系到系统的可用性和准确性,还直接影响到用户对技术的信任度。为了解决这些问题,以下是针对每个挑战的优化方案:
缺失内容(Missing Content)
当 RAG 系统面对的问题无法从现有文件中得到答案时,就会出现这种情况。在最佳情况下,我们希望 RAG 系统直接回答「我不知道」。然而,实际上 RAG 系统常常会编造或错误回答问题。
针对这个问题,目前有两大解决策略:
1. 数据清理
俗话说"吃什么、吐什么"。原始数据质量对信息处理系统的准确性至关重要。若输入数据错误或矛盾,或者预处理步骤不当,则无论检索增强生成(RAG)系统有多先进,也无法从混乱数据中提取有价值信息。这意味着我们必须在数据源选择、数据清洗、预处理等环节投入资源和技术,以确保输入数据尽可能准确和一致。这个策略不仅适用于本文讨论的问题,也适用于所有数据处理流程中,数据质量始终是关键。
2. Prompt 工程
在知识库缺乏相关信息、导致系统可能给出看似合理但实际上错误答案的情况下,使用提示工程是一个非常有帮助的解决方式。例如通过设定提示:"如果你对答案不确定,就直接告诉我你不知道",如此可以鼓励模型采取更谨慎和诚实的回应态度,从而避免误导用户。虽然不能保证系统回答的绝对准确性,但通过这样的提示,确实能提高回答品质。
未命中排名靠前的内容(Missed Top Ranked)
这个挑战主要在于"答案在文件中,但由于排名靠前而未能提供给用户"。理论上,检索系统会为每个文档分配一个排名,此排名将决定其在后续处理中的使用程度。然而,在实际操作中,受限于性能和资源,通常只有排名最高的前 K 个文档会被选取并展示给用户。这里的 K 是基于性能考虑的参数。
针对该问题,存在两种解决方式:
1. 调整参数以优化搜索效果
该部分提出了两个方面调整以增加 RAG 效率和准确性:chunk_size。
如果要直接在 langchain 调整块大小,请使用以下代码:
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100)
all_splits = text_splitter.split_documents(PDF_data)
k 值涉及到检索器应该返回多少个答案,我们可以选择返回更多的答案,以确保正确答案不会被 LLM 忽略:
retriever = vectordb.as_retriever(search_kwargs={"k": 8})
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
verbose=
)


