html5 制作手机网站河南高端网站
html5 制作手机网站,河南高端网站,网站建设犀牛云,没有网站怎么做排名优化论文链接#xff1a;https://arxiv.org/pdf/2602.03442 代码链接#xff1a;https://github.com/Ayanami0730/arag 研究背景 RAG 遇到瓶颈#xff0c;该让模型自己做主了 讲道理#xff0c;2026 年了#xff0c;大家还在用那套老掉牙的 RAG 方法——要么就是一股脑把检索到…论文链接https://arxiv.org/pdf/2602.03442代码链接https://github.com/Ayanami0730/arag研究背景RAG 遇到瓶颈该让模型自己做主了讲道理2026 年了大家还在用那套老掉牙的 RAG 方法——要么就是一股脑把检索到的文档全塞给模型要么就是提前写好流程让模型按部就班地执行。这就好比你去图书馆找资料要么馆员直接给你扔一堆书管你需不需要要么给你一张固定的找书流程图第一步去A区第二步去B区…。但现在的大模型像 GPT-5、Claude Opus 这些推理能力和工具使用能力都已经这么强了为啥还要被这种死板的 RAG 系统限制住模型明明可以根据问题灵活调整检索策略但传统 RAG 就是不给这个机会。这篇论文的作者团队来自中国科技大学和 Metastone Technology就看不下去了直接提出了A-RAGAgentic RAG框架。核心思路就一句话把检索的决策权交还给模型让它像个真正的 Agent 一样自主探索知识库。他们做了个对比实验结果发现即使是最简单的 Agentic RAG只给模型一个嵌入搜索工具性能也能吊打传统方法。在 HotpotQA、MuSiQue 这些多跳问答数据集上A-RAG 的准确率比传统方法高出 10-20 个百分点而且用的检索 token 还更少看这个图就明白了左边是传统 RAG“你只能用这些文档回答”右边是 A-RAG“给你工具自己探索去”性能差距一目了然。相关工作三大 RAG 流派只有 A-RAG 是真 Agent作者把现有的 RAG 方法分成了三大流派并且定义了真正的 Agentic 系统必须满足三个原则1. Basic RAG / Graph RAG这类方法的核心是算法决定一切。比如微软的 GraphRAG 会构建知识图谱RAPTOR 搞递归摘要树HippoRAG 模仿海马体记忆机制。听起来很高级但问题是检索策略在设计阶段就定死了模型只能被动接受检索结果没法根据任务特点灵活调整。就好比你去餐厅菜单都是厨师提前定好的你只能从里面选想吃点特别的对不起没有。2. Workflow RAG这类方法看起来像 Agent 了比如 FLARE置信度低时触发检索、IRCoT推理和检索交替进行、MA-RAG多智能体协作。但本质上还是按流程办事模型虽然能多轮交互但每一步该做什么都是预先定义好的。这就像你去图书馆馆员给了你一张详细的找书流程图“先去历史区找关键词再去文学区找相关书籍最后去工具书区核对信息”。流程是灵活了但还是不够自主。3. A-RAG真正的 Agentic RAGA-RAG 的核心理念是给模型提供分层检索工具让它自己决定怎么用。就像给你一个图书馆的完整权限——你可以用关键词索引快速定位可以用语义搜索找相关内容还可以直接调阅完整文档。什么时候用哪个工具、检索多少轮、什么时候停止全由模型自己判断。作者总结了三个真 Agent的标准自主策略Autonomous Strategy模型能根据任务特点选择不同的检索策略迭代执行Iterative Execution可以多轮检索不断补充信息交错工具使用Interleaved Tool Use推理和工具调用可以灵活穿插只有 A-RAG 三个都满足其他方法都有缺陷。核心方法三层检索接口让模型随心所欲A-RAG 的设计非常简洁核心就是提供三个不同粒度的检索工具1. 关键词搜索Keyword Search这个工具做精确匹配适合找特定实体或术语。比如你要找Alex Wang关键词搜索就能快速定位包含这个名字的文档块。相关性得分的计算公式是Score kw ( c i , K ) ∑ k ∈ K count ( k , T i ) ⋅ ∣ k ∣ \text{Score}_{\text{kw}}(c_i, \mathcal{K}) \sum_{k \in \mathcal{K}} \text{count}(k, T_i) \cdot |k|Scorekw(ci,K)k∈K∑count(k,Ti)⋅∣k∣其中count ( k , T i ) \text{count}(k, T_i)count(k,Ti)是关键词k kk在文档块T i T_iTi中出现的次数∣ k ∣ |k|∣k∣是关键词的字符长度越长的关键词权重越高因为更具体。返回结果不是完整文档而是包含关键词的句子片段snippet让模型快速判断是否相关。2. 语义搜索Semantic Search这个工具做语义匹配适合找相关但不完全一致的内容。比如你问Alex 的妻子 3 月去了哪里关键词搜索可能找不到因为文档里写的是Betty 计划去中国旅行但语义搜索能通过向量相似度找到相关句子。相似度计算公式是经典的余弦相似度Score sem ( s i , j , q ) v i , j T v q ∥ v i , j ∥ ∥ v q ∥ \text{Score}_{\text{sem}}(s_{i,j}, q) \frac{\mathbf{v}_{i,j}^T \mathbf{v}_q}{\|\mathbf{v}_{i,j}\| \|\mathbf{v}_q\|}Scoresem(si,j,q)∥vi,j∥∥vq∥vi,jTvq同样返回 snippet不是完整文档。3. 文档块读取Chunk Read前两个工具返回的都是预览如果模型觉得某个文档块值得深入了解就可以用这个工具读取完整内容。模型还可以读取相邻文档块补充上下文信息。索引构建轻量且高效整个索引构建过程非常简单把语料库切成 1000 token 左右的文档块chunk每个块再拆成句子用预训练的 sentence encoder 生成向量关键词层面不预先建索引直接在查询时做文本匹配这样做的好处是索引成本低而且避免了 Graph RAG 那种复杂的知识图谱构建过程。Agent 循环设计简单但有效作者特意用了最简单的 ReAct 框架推理-行动交替每轮只调用一个工具观察结果后再决定下一步。这样做是为了排除复杂设计的干扰纯粹看接口设计的效果。还有个小细节很聪明他们加了个Context Tracker记录哪些文档块已经读过了。如果模型想重复读取系统直接返回这个块你已经读过了避免浪费 token。实验效果全面碾压而且更省 token作者在四个多跳问答数据集上做了测试用 GPT-4o-mini 和 GPT-5-mini 作为骨干模型结果非常炸裂主要发现传统 Naive RAG 依然是个强基线在统一评测设置下用 GPT-5-mini 做评判、用 Qwen3-Embedding 做检索简单的 Naive RAG 表现居然还不错。很多 Graph RAG 和 Workflow RAG 方法都没能稳定超过它。即使是 Naive A-RAG 也能碾压传统方法A-RAG (Naive) 只配了一个语义搜索工具但在多个数据集上都超过了 GraphRAG、HippoRAG2、LinearRAG 这些复杂方法。而且用 GPT-5-mini 后优势更明显说明模型越强Agentic 范式的优势越大。完整版 A-RAG 全面领先在 GPT-4o-mini 上A-RAG (Full) 在 5 个数据集中的 3 个拿到最佳成绩在 GPT-5-mini 上A-RAG (Full)全部数据集第一MuSiQue 数据集上准确率从 Naive RAG 的 52.8% 提升到 74.1%提升了 21 个百分点更高效的 token 使用更神奇的是A-RAG 不仅准确率高用的 token 还更少。对比数据Naive RAG 平均检索 5000 tokenA-RAG (Naive) 检索了 20000-50000 token因为没有分层接口只能反复检索完整文档A-RAG (Full) 只检索 2000-7000 token比传统方法更少但效果更好这证明了分层接口的威力模型可以先看 snippet 判断相关性只对真正需要的文档深入阅读避免了无效信息的干扰。消融实验三个工具缺一不可作者分别去掉了关键词搜索、语义搜索和文档块读取发现去掉任何一个工具都会导致性能下降去掉文档块读取直接返回完整文档性能也会下降说明先看 snippet 再决定是否深入的设计很关键测试时计算扩展性作者还测试了增加推理步数和推理努力程度的效果从 5 步增加到 20 步GPT-5-mini 提升 8%GPT-4o-mini 只提升 4%说明强模型更能利用长探索推理努力从 minimal 到 high性能提升 25%这说明 A-RAG 能很好地利用测试时计算资源是个很有前景的扩展方向。失败案例分析作者手动分析了 100 个错误案例发现主要问题是实体混淆最常见模型把相似实体搞混了检索策略错误选错了工具或检索时机问题理解错误没理解问题的真实意图这些问题其实是模型推理能力的限制而不是框架设计的问题。论文总结把决策权还给模型才是 RAG 的未来一句话概括A-RAG 通过设计分层检索接口关键词、语义、文档块三个粒度让大模型像真正的 Agent 一样自主探索知识库在多跳问答任务上全面超越传统 RAG 方法而且更省 token、更能利用测试时计算资源。作者的核心洞察很简单与其设计复杂的检索算法不如设计好用的检索接口让模型自己决定怎么检索。就像给程序员提供好的 API 比写死的脚本更有用一样。这个工作的意义在于它指明了 RAG 的一个新方向不要再纠结于怎么设计更好的检索流程而是应该思考怎么给模型提供更灵活的检索工具。随着大模型推理能力和工具使用能力的提升Agentic RAG 的优势会越来越明显。代码和评测套件已经开源地址在https://github.com/Ayanami0730/arag核心代码如下Base agent implementation for ARAG. import json from typing import Any, Dict, List, Optional import tiktoken from arag.core.context import AgentContext from arag.core.llm import LLMClient from arag.tools.registry import ToolRegistry class BaseAgent: Base agent with tool calling capabilities. def __init__( self, llm_client: LLMClient, tools: ToolRegistry, system_prompt: str None, max_loops: int 10, max_token_budget: int 128000, verbose: bool False, ): self.llm llm_client self.tools tools self.system_prompt system_prompt or You are a helpful assistant. self.max_loops max_loops self.max_token_budget max_token_budget self.verbose verbose self.tokenizer tiktoken.encoding_for_model(gpt-4o) def _calculate_message_tokens(self, messages: List[Dict[str, Any]]) - int: total len(self.tokenizer.encode(self.system_prompt)) for msg in messages: content msg.get(content, ) if content: total len(self.tokenizer.encode(str(content))) return total def _force_final_answer(self, messages: List[Dict[str, Any]], context: AgentContext, total_cost: float, reason: str) - tuple: Force the model to give a final answer when limits are reached. force_prompt ( You have reached the limit. You MUST now provide a final answer based on the information you have gathered so far. Do NOT call any more tools. Synthesize the available information and respond directly. ) messages.append({role: user, content: force_prompt}) try: response self.llm.chat(messagesmessages, toolsNone, temperature0.0) total_cost response[cost] final_answer response[message].get(content, ) if self.verbose: print(fForced answer: {final_answer[:200]}...) print(fTotal cost: ${total_cost:.6f}) except Exception as e: if self.verbose: print(fError getting forced answer: {e}) final_answer fError: {reason} and failed to generate final answer. return final_answer, total_cost def run(self, query: str) - Dict[str, Any]: context AgentContext() messages [ {role: system, content: self.system_prompt}, {role: user, content: query}, ] trajectory [] total_cost 0.0 loop_count 0 tool_schemas self.tools.get_all_schemas() if self.verbose: print(f\n{*60}) print(fQuestion: {query}) print(f{*60}\n) for loop_idx in range(self.max_loops): loop_count loop_idx 1 current_tokens self._calculate_message_tokens(messages) if current_tokens self.max_token_budget: if self.verbose: print(fToken budget exceeded ({current_tokens} {self.max_token_budget}), forcing answer...) final_answer, total_cost self._force_final_answer( messages, context, total_cost, Token budget exceeded ) return { answer: final_answer, trajectory: trajectory, total_cost: total_cost, loops: loop_count, token_budget_exceeded: True, **context.get_summary() } if self.verbose: print(fLoop {loop_count}/{self.max_loops} (Tokens: {current_tokens}/{self.max_token_budget})) try: response self.llm.chat(messagesmessages, toolstool_schemas) except Exception as e: if self.verbose: print(fLLM error: {e}) break total_cost response[cost] message response[message] messages.append(message) if self.verbose and message.get(content): print(fAssistant: {message[content][:200]}...) tool_calls message.get(tool_calls) if not tool_calls: # No tool calls - agent is done final_answer message.get(content, ) return { answer: final_answer, trajectory: trajectory, total_cost: total_cost, loops: loop_count, **context.get_summary() } # Execute tool calls for tc in tool_calls: func_name tc[function][name] try: func_args json.loads(tc[function][arguments]) except json.JSONDecodeError: func_args {} if self.verbose: print(fTool: {func_name}) print(f Args: {func_args}) try: tool_result, tool_log self.tools.execute(func_name, context, **func_args) except Exception as e: tool_result fError executing tool: {str(e)} tool_log {retrieved_tokens: 0, error: str(e)} if self.verbose: output_preview tool_result[:300] ... if len(tool_result) 300 else tool_result print(f Result: {output_preview}) if tool_log.get(retrieved_tokens, 0) 0: print(f Tokens: {tool_log[retrieved_tokens]}) print() messages.append({ role: tool, tool_call_id: tc[id], content: tool_result, }) # Record trajectory (same format as original A-RAG) traj_entry { loop: loop_count, tool_name: func_name, arguments: func_args, tool_result: tool_result, **tool_log # includes retrieved_tokens, chunks_found, etc. } trajectory.append(traj_entry) # Max loops reached - force final answer if self.verbose: print(fMax loops reached ({self.max_loops}), forcing answer...) final_answer, total_cost self._force_final_answer( messages, context, total_cost, Maximum loops exceeded ) return { answer: final_answer, trajectory: trajectory, total_cost: total_cost, loops: loop_count, max_loops_exceeded: True, **context.get_summary() }这份代码实现了一个典型的ReActReasoning and Acting循环架构是当前 Agent 开发的最底层逻辑。它通过一个for循环让模型在“思考”与“行动”之间往复核心控制力体现在对边界条件的严苛把控代码引入了tiktoken实时监测 Token 消耗并设定了max_loops硬性上限防止 Agent 在复杂任务中陷入无限死循环或高昂的成本黑洞。其运行精髓在于动态调度与兜底机制。在每一轮循环中模型根据当前上下文决定是直接输出答案还是调用ToolRegistry中的工具若触发工具调用系统会自动执行函数并将结果喂回上下文。最亮眼的设计是_force_final_answer方法——当循环或预算触顶时它会发送一条“最后通牒”式指令强迫模型停止折腾并基于现有碎片信息整合出最终结论确保了工程化应用中的系统稳定性与确定性。