RAG知识库的可靠性评估(一)
作者: 码农Linx 来源: 码农Linx
在开发基于LLM的RAG应用并准备将其上线应用时,都会比较关注RAG的性能、质量、可靠性其回答的结果准确性到底如何,甚至可以说RAG的质量可靠性其重要性要大于性能,RAG“调好了”看上去效果不错,有没有什么方法去量化度量RAG 应用的质量也至关重要,下图为RAG应用度量质量指标分布图 。
####何为RAG
由于LLM回答问题存在一定的概率,且很多敏感、内部私有知识LLM也没有见过所以在一些问题的回答上任何大语言模型也不是什么都知道,这时候要求私有域数据LLM也能准确做出应答就需要对模型进行微调或外挂知识库,这里的外挂知识库就是Retrieval Augmented Generation(检索增强生成) 也就是RAG的全称。
在向LLM模型提问时根据提问文本从知识库中查找提问问题相关的内容(余弦相似度),并将其作为问题的上下文传递给LLM模型,此时大语言模型会根据所问的问题与所提供的从知识库所得到的上下文回答该问题,为了防止LLM胡说八道,通常会在Prompt 中提示LLM只从上下文中获取信息回答如上下文无法得到结果则回答不知道;
####RAG优化理论
RAG的开发主要流程分为:加载文件、文本分割、文本向量化、文本内嵌(Embedding)、持久化、向量检索器 等这么几个阶段。优化可以是在这几个阶段都进行调优;这里主要简单介绍几点。
####文本分割
在进行文本分割时块大小的设置也至关重要,LangChain 默认使用文本分割后的小块(chunks)进行索引存储,并在查询时比较查询问题与向量库中文本块的相似度来实现检索,所以索引块的大小会影响到查询的精度,通常较小的文件可使用小块、大文件使用大块。
####小块
较小的文本块可能会捕获到更精细的语义细节,从而在嵌入后能够更准确地反映文档的特定部分的含义。这对于需要精确匹配的查询很有帮助。然而,过小的文本块可能会导致丢失上下文信息,从而影响检索结果的完整性和准确性。
####大块
较大的文本块能够保留更多的上下文信息,有助于理解文档的整体含义。这对于理解复杂或多主题的文档很有用。但是,较大的文本块可能会导致嵌入向量失去一些细节,从而影响检索的精确度。
####文本内嵌
Embeddings模型(嵌入模型) 的选择至关重要,会影响到向量库检索的精度,从向量库检索的到文本内容如何提问文本关联度很低就会导致RAG应用质量降低。比如中文知识文本肯定不能选择纯英文Embeddings模型作为文本嵌入模型,在生产环境也尽量不用参数规模较小的模型如ernie-3.0-nano-zh,可使用ERNIE 3.0-Base 、text2vec-base-chinese等规模相对大点的模型;
####检索器
Langchain中提供的VectorStoreRetriever 向量检索器是最常见。其提供了Similarity Search :侧重于找到与查询最相似的文档或文档片段,目标是精确匹配语义上最接近**、MMR(Max Marginal Relevance)** :是一种旨在提高搜索结果多样性的检索策略考虑相关性和多样性检索算法,还提供了多样性lambda_mult 配置参数、score_threshold 分数阈值、k值、fetch_k 等参数。这些参数的调整适当也会对向量知识库的检索精度有很大帮助;
为了平衡精确度和上下文信息的保留,LangChain 提供了ParentDocumentRetriever ,它允许在检索时首先使用小块的嵌入向量进行高效匹配,然后根据需要检索完整的父文档 以获取更全面的上下文。这种方法结合了小块的精确匹配能力和大块的丰富上下文信息。
####度量评估
目前业内也有多种自动化度量评估RAG的方法,其基本原理都是根据RAG应用的提问、上下文、LLM回答的内容、或LLM回答答案与Ground-truth的相关性;通过算法计算他们相关性得到具体的数字用于评估RAG的质量。在TruLens-Eval在没有Ground-truth的情况下评估RAG、Ragas使用了测试数据集在有Ground-truth(真实答案)的情况下评估RAG。
####无Ground-truth(真实答案)的情况下对RAG进行评估
TruLens-Eval提出了RAG 三元组的概念:Query、Context、Response
RAG 流程为用户Query问题,RAG应用在向量库查询出Context ,然后将Query与 Context喂到LLM,LLM生成满足Query的Response答案。在这里存在三元组:Query、Context 和 Response 就是 RAG 整个过程中最重要的三元组,它们之间两两相互牵制。此时可以通过检测三元组之间两两之间的相关度,评估RAG 应用的效果。
从上图可以看到三个度量值,数值范围为值0-1 :
Context Relevance: 上下文相关性,上下文Context与Query的相关性越高RAG效果越好。此值得分低说明从向量库查询得到的上下文Context与Query问题相关性低,就会造成LLM幻觉或LLM的Response的回答错误。
Groundedness: 真实性,度量LLM返回Response答案是否得到了Context的支撑。如关联度低,反应了LLM的Response答案不遵从上下文Context知识,出现幻觉的可能就越大。
Answer Relevance: 答案相关性,度量LLM的Response答案与Query提问的相关度。如分低,可能反应了回答不对题。
在这个面板中可以清楚的看到,每个提问Query在RAG进行回答后Context Relevance(上下文相关性****) 、Groundedness(真实性) 、Answer Relevance(答案相关性) 三个指标的度量值。
选择一行记录可以看到该行记录的详细信息,并给出三个指标的每个(result)评分的具体原因,0-1分值范围 ,最高最低分别为1和0。
可以看到这次RAG表现非常好,这条记录的评分为:
** Context Relevance** :0.8
** Groundedness** :1
** Answer Relevance** :1
####存在Ground-truth(真实答案)对RAG评估
Ragas可使用生成数据集**(question、context、answer****)** 的answer答案作为Ground-truth (真实答案),通过数据集中的question 和 ground-truth,去定量评估RAG 应用。
####主要代码
def initTru(rag_chain):
(f_groundedness, f_answer_relevance, f_context_relevance) =feedback.init()
tru_recorder = TruChain(rag_chain,
app_id='Chain1_ChatApplication',
feedbacks=[f_answer_relevance, f_context_relevance, f_groundedness])
return tru_recorder
def truLen(rag_chain,tru_recorder,quetion):
response, tru_record = tru_recorder.with_record(rag_chain.invoke,quetion)
json_like = tru_record.layout_calls_as_app()
return response
def chatQA(quetion,history):
tru_recorder=initTru(qa)
resp = truLen(qa,tru_recorder,quetion)
return resp['result']
更多AI工具,参考Github-AiBard123,国内AiBard123