使用自反射检索增强生成 (Self-RAG) 增强大型语言模型

2025年01月06日 由 alex 发表 4042 0

大型语言模型 (LLM)(例如 GPT-4)彻底改变了自然语言处理,在生成连贯且上下文相关的文本方面提供了令人印象深刻的功能。但是,通过动态集成外部信息并确保输出的准确性和相关性,可以进一步提高其性能。这就是自反思检索增强生成 (Self-RAG)发挥作用的地方。Self-RAG 利用检索机制和反思评估来改进和增强 LLM 生成的响应。以下是 Self-RAG 如何处理用户查询的全面概述,以及对其实现和优势的见解。


Self-RAG 简介

Self-RAG 是一个先进的框架,旨在通过整合外部数据源并进行自我评估来增强 LLM,以确保高质量的响应。与仅依赖预先训练的知识的传统 LLM 不同,Self-RAG 会根据用户的查询动态检索相关文档,评估检索到的数据的相关性和准确性,并整合这些信息以产生精致可靠的输出。


自 RAG 的逐步过程


51


让我们检查一下 LlamaIndex 中 Self-RAG 的实现。


描述:当用户向系统输入查询时,该流程就开始了。查询内容可以是简单的事实问题,也可以是复杂的多方面请求。


代码集成:通过类custom_query中的方法处理SelfRAGQueryEngine。


def custom_query(self, query_str: str) -> Response:
    """Run self-RAG."""
    response = self.llm(prompt=_format_prompt(query_str), **_GENERATE_KWARGS)
    answer = response["choices"][0]["text"]
    source_nodes = []
    # Further processing...


初始响应生成

描述:在接收到查询后,大型语言模型(LLM)基于其现有的知识库生成一个初步响应。在此阶段,模型会评估是否需要额外信息,并通过生成一个特殊的检索令牌来进行此判断。


代码集成:生成初始响应并检查检索令牌。


response = self.llm(prompt=_format_prompt(query_str), **_GENERATE_KWARGS)
answer = response["choices"][0]["text"]
if "[Retrieval]" in answer:
    # Proceed to retrieval phase
    ...


决定检索外部信息

描述:检索令牌的存在表明初始响应可能受益于额外的外部信息。系统根据此令牌决定是否继续进行检索。


代码集成:对检索令牌进行条件检查。


if "[Retrieval]" in answer:
    if self.verbose:
        print_text("Retrieval required\n", color="blue")
    documents = self.retriever.retrieve(query_str)
    ...


检索相关文档

描述:系统会在预定义的语料库或外部数据库中搜索,以检索与用户查询相关的一定数量的(K个)文档。检索标准包括相关性、时效性和可信度。


代码集成:使用检索器检索文档。


documents = self.retriever.retrieve(query_str)
paragraphs = [
    _format_prompt(query_str, document.node.text) for document in documents
]


评估检索到的文档

描述:对每个检索到的文档进行评估,以确定其相关性以及它对初始响应的支持程度。这包括生成反思令牌,对每个文档的实用性进行批判性分析。


代码集成:评估在 _run_critic 方法中执行。


def _run_critic(self, paragraphs: List[str]) -> CriticOutput:
    paragraphs_final_score = {}
    llm_response_text = {}
    source_nodes = {}
    for p_idx, paragraph in enumerate(paragraphs):
        pred = self.llm(paragraph, **self.generate_kwargs)
        llm_response_text[p_idx] = pred["choices"][0]["text"]
        logprobs = pred["choices"][0]["logprobs"]
        pred_log_probs = logprobs["top_logprobs"]
        isRel_score = _relevance_score(pred_log_probs[0])
        isSup_score = _is_supported_score(logprobs["tokens"], pred_log_probs)
        isUse_score = _is_useful_score(logprobs["tokens"], pred_log_probs)
        paragraphs_final_score[p_idx] = (
            isRel_score + isSup_score + 0.5 * isUse_score
        )
        source_nodes.append(
            NodeWithScore(
                node=TextNode(text=paragraph, id_=str(p_idx)),
                score=isRel_score,
            )
        )
    return CriticOutput(llm_response_text, paragraphs_final_score, source_nodes)


选择支持文档

描述:根据评估结果,系统选择最相关的文档以纳入最终响应。通常,优先考虑相关性评分最高的文档,但如果有益,系统也可以整合来自多个文档的信息。


代码集成:根据最终评分选择最佳段落。


critic_output = self._run_critic(paragraphs)
paragraphs_final_score = critic_output.paragraphs_final_score
llm_response_per_paragraph = critic_output.llm_response_per_paragraph
best_paragraph_id = max(
    paragraphs_final_score, key=paragraphs_final_score.get
)
answer = llm_response_per_paragraph[best_paragraph_id]


最终响应生成

描述:大型语言模型(LLM)通过整合选定文档中的见解,生成一个经过优化且全面的响应。在将响应返回给用户之前,会对其进行后处理,以删除任何控制令牌或不需要的字符。


代码集成:后处理并返回最终响应。


answer = _postprocess_answer(answer)
if self.verbose:
    print_text(f"Final answer: {answer}\n", color="green")
return Response(response=str(answer), source_nodes=source_nodes)


结论

自反思检索增强生成(Self-Reflective Retrieval-Augmented Generation)代表了大型语言模型能力的一次重大进步。通过动态整合外部信息并纳入自我评价机制,自反思检索增强生成(Self-RAG)解决了传统大型语言模型的一些固有局限,如静态知识库和潜在的准确性问题。像LlamaIndex的Self-RAG这样的实现展示了这一框架的实际应用性,为更可靠、准确和上下文感知的AI驱动通信系统铺平了道路。随着这一领域的研究和开发不断发展,Self-RAG有望进一步缩小AI生成内容与人类般理解和可靠性之间的差距。

文章来源:https://kargarisaac.medium.com/enhancing-large-language-models-with-self-reflective-retrieval-augmented-generation-self-rag-26eeebdf8ae7
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消