
R2R Agentic RAG 实战指南多步推理、动态工具调用与 Research 深度研究模式【免费下载链接】R2RSoTA production-ready AI retrieval system. Agentic Retrieval-Augmented Generation (RAG) with a RESTful API.项目地址: https://gitcode.com/GitHub_Trending/r2/R2R本篇技术指南以 R2R 的 Agentic RAG又称 Deep Research功能为主线讲解如何通过client.retrieval.agent让大模型结合向量检索、全文检索、知识图谱与网络搜索等工具进行多步推理并围绕仓库中的源码与配置展开实现原理分析。读完本文你将掌握 RAG 模式与 Research 模式的差异、五类检索工具与四类研究工具的选型、流式事件thinking / tool_call / citation / final_answer的处理方式以及如何通过conversation_id、search_settings与生成参数定制自己的问答与研究型应用。前置说明Agentic RAG 是 R2R 基础检索能力的扩展。如果你是 R2R 新手建议先阅读 Search RAG 指南 掌握/retrieval/search、/retrieval/rag与search_settings的基础用法再回到本文学习智能体编排层。核心能力Agentic RAG 解决了什么问题Agentic RAG 将一次检索 一次生成升级为多轮工具调用 持续推理的闭环智能体可以链式执行多个动作例如先搜索文档、再抓取网页、必要时引用对话历史然后才生成最终回答检索侧完整接入 R2R 的向量、全文与混合检索能力通过在每个请求中携带conversation_id维持跨轮次的对话记忆并在运行时动态决定调用哪些工具、从哪些来源收集与分析信息。这四个特性对应仓库源码中的具体设计多步推理AgentConfig.max_iterations默认值为 10见 py/core/base/agent/agent.py即智能体最多进行 10 次迭代工具调用后必须收敛出结论Research 类智能体在初始化时会把上限提升到 15见 py/core/agent/research.py。检索增强工具通过ToolRegistry注册检索行为由注入的knowledge_search_method、content_method、file_search_method三个回调函数驱动见 py/core/agent/rag.py 中的RAGAgentMixin。对话上下文/v3/retrieval/agent端点会按conversation_id拉取历史消息并与新消息拼接后交给智能体见 py/core/main/services/retrieval_service.py。动态工具使用请求中的rag_tools/research_tools会驱动工具注册LLM 在每轮迭代中按需发起工具调用智能体通过execute_tool执行并回填结果见 py/core/base/agent/agent.py。两种工作模式RAG 模式与 Research 模式client.retrieval.agent(..., mode...)提供两个主要运行模式mode默认值为rag。RAG 模式默认面向基于知识库回答问题的标准检索增强生成场景能力包括语义搜索与混合hybrid搜索文档级与 chunk 级内容检索可选接入 Serper 与 Firecrawl 的网页搜索来源引用citation与基于证据的回答。从实现看RAG 模式由 py/core/agent/rag.py 中的R2RRAGAgent/R2RStreamingRAGAgent/R2RXMLToolsRAGAgent/R2RXMLToolsStreamingRAGAgent四种智能体承载分别对应非流式 / 流式 / XML 工具协议 / XML 工具协议 流式四种组合。Research 模式在 RAG 模式全部能力之上追加面向复杂问题的深度分析、推理与计算能力专门的推理系统reasoning用于复杂问题求解批判性分析critique用于识别推理中的潜在偏见或逻辑谬误Python 执行python_executor用于计算型分析多步推理以深入探索主题。Research 模式由 py/core/agent/research.py 中的R2RResearchAgent、R2RStreamingResearchAgent等实现其ResearchAgentMixin继承自RAGAgentMixin因此天然拥有全部 RAG 检索能力再叠加四个研究专用工具。模式如何影响模型选择在 py/core/main/api/v3/retrieval_router.py 的agent_app中当请求未显式指定model时moderag时使用配置中的quality_llm默认openai/gpt-5-2025-08-07moderesearch时使用planning_llm默认anthropic/claude-3-7-sonnet-20250219而reasoning_llm默认openai/o3-mini则作为reasoning工具的底层模型。以上默认值可在 py/r2r/r2r.toml 的[app]段中修改。可用工具全景RAG 工具工具名说明依赖search_file_knowledge使用 R2R 检索能力对已入库文档做语义/混合搜索无search_file_descriptions在文件级元数据标题、文档级描述上搜索无get_file_content拉取完整文档或 chunk 结构做深入分析无web_search调用外部搜索 API 获取实时信息需要SERPER_API_KEY环境变量web_scrape抓取并抽取指定网页内容需要FIRECRAWL_API_KEY环境变量Research 工具工具名说明依赖rag复用底层 RAG 智能体完成信息检索与综合无reasoning调用专用模型进行复杂分析推理无critique分析对话历史识别缺陷、偏见与替代方案无python_executor执行 Python 代码做复杂计算与分析无源码视角工具如何被注册与调度从源码结构看工具体系的运转分为三层注册层py/core/base/agent/tools/registry.py 中的ToolRegistry会自动扫描built_in目录下的全部Tool子类并按其name建立索引同时支持通过R2R_USER_TOOLS_PATH环境变量加载用户自定义工具目录_discover_user_tools。create_tool_instance负责为每个工具实例注入llm_format_function结果格式化函数与context智能体上下文。装配层RAGAgentMixin._register_tools见 py/core/agent/rag.py遍历config.rag_tools对每个工具名向注册表请求实例ResearchAgentMixin._register_research_tools见 py/core/agent/research.py则按名称构造rag/reasoning/critique/python_executor四个研究工具。工具的默认配置定义在 py/core/base/agent/agent.py 的RAGAgentConfig中RAG 默认启用search_file_descriptions、search_file_knowledge、get_file_content网页工具默认关闭Research 默认启用rag、reasoning、critique、python_executor。执行层智能体在每轮迭代中解析 LLM 返回的 function/tool 调用通过handle_function_or_tool_call执行并把结果以tool角色消息写回对话Anthropic 开启extended_thinking时还会附加Continue...续写消息以兼容其思考 工具调用协议见 py/core/base/agent/agent.py。三个检索类工具的底层实现分别对应 search_file_knowledge.py调用context.knowledge_search_method、search_file_descriptions.py调用context.file_search_method与 get_file_content.py以document_id过滤后调用context.content_method执行结果都会写入智能体的search_results_collector为最终回答的引用citation收集素材。快速开始基本用法下面分别给出单轮查询与多轮对话的调用示例。所有示例假定你已完成 R2R 部署并导入了相关 SDK若开启了认证请先执行client.users.login(...)。Python SDKRAG 模式 流式事件处理from r2r import R2RClient from r2r import ( ThinkingEvent, ToolCallEvent, ToolResultEvent, CitationEvent, MessageEvent, FinalAnswerEvent, ) # when using auth, do client.users.login(...) # Basic RAG mode with streaming response client.retrieval.agent( message{ role: user, content: What does DeepSeek R1 imply for the future of AI? }, rag_generation_config{ model: anthropic/claude-3-7-sonnet-20250219, extended_thinking: True, thinking_budget: 4096, temperature: 1, top_p: None, max_tokens_to_sample: 16000, stream: True }, rag_tools[search_file_knowledge, get_file_content], moderag ) # Improved streaming event handling current_event_type None for event in response: # Check if the event type has changed event_type type(event) if event_type ! current_event_type: current_event_type event_type print() # Add newline before new event type # Print emoji based on the new event type if isinstance(event, ThinkingEvent): print(f\n Thinking: , end, flushTrue) elif isinstance(event, ToolCallEvent): print(f\n Tool call: , end, flushTrue) elif isinstance(event, ToolResultEvent): print(f\n Tool result: , end, flushTrue) elif isinstance(event, CitationEvent): print(f\n Citation: , end, flushTrue) elif isinstance(event, MessageEvent): print(f\n Message: , end, flushTrue) elif isinstance(event, FinalAnswerEvent): print(f\n✅ Final answer: , end, flushTrue) # Print the content without the emoji if isinstance(event, ThinkingEvent): print(f{event.data.delta.content[0].payload.value}, end, flushTrue) elif isinstance(event, ToolCallEvent): print(f{event.data.name}({event.data.arguments})) elif isinstance(event, ToolResultEvent): print(f{event.data.content[:60]}...) elif isinstance(event, CitationEvent): print(f{event.data}) elif isinstance(event, MessageEvent): print(f{event.data.delta.content[0].payload.value}, end, flushTrue) elif isinstance(event, FinalAnswerEvent): print(f{event.data.generated_answer[:100]}...) print(f Citations: {len(event.data.citations)} sources referenced)流式响应中会出现 6 类事件其含义与后端实现一一对应后端将事件封装为 SSE 流见 py/core/main/api/v3/retrieval_router.py 的agent_app流式分支thinking模型逐步推理的思考过程extended_thinkingtrue时出现XML 变体智能体会把think/Thought块映射为该事件tool_call智能体发起工具调用tool_result工具执行结果citation回答中出现引用来源message面向用户的增量文本 tokenfinal_answer携带完整回答与结构化引用的最终事件。JavaScript SDKconst { r2rClient } require(r2r-js); const client new r2rClient(); // when using auth, do client.users.login(...) async function main() { // Basic RAG mode with streaming const streamingResponse await client.retrieval.agent({ message: { role: user, content: What does DeepSeek R1 imply for the future of AI? }, ragTools: [search_file_knowledge, get_file_content], ragGenerationConfig: { model: anthropic/claude-3-7-sonnet-20250219, extendedThinking: true, thinkingBudget: 4096, temperature: 1, maxTokens: 16000, stream: true } }); // Improved streaming event handling if (Symbol.asyncIterator in streamingResponse) { let currentEventType null; for await (const event of streamingResponse) { // Check if event type has changed const eventType event.event; if (eventType ! currentEventType) { currentEventType eventType; console.log(); // Add newline before new event type // Print emoji based on the new event type switch(eventType) { case thinking: process.stdout.write( Thinking: ); break; case tool_call: process.stdout.write( Tool call: ); break; case tool_result: process.stdout.write( Tool result: ); break; case citation: process.stdout.write( Citation: ); break; case message: process.stdout.write( Message: ); break; case final_answer: process.stdout.write(✅ Final answer: ); break; } } // Print content based on event type switch(eventType) { case thinking: process.stdout.write(${event.data.delta.content[0].payload.value}); break; case tool_call: console.log(${event.data.name}(${JSON.stringify(event.data.arguments)})); break; case tool_result: console.log(${event.data.content.substring(0, 60)}...); break; case citation: console.log(${event.data}); break; case message: process.stdout.write(${event.data.delta.content[0].payload.value}); break; case final_answer: console.log(${event.data.generated_answer.substring(0, 100)}...); console.log( Citations: ${event.data.citations.length} sources referenced); break; } } } } main();curl直接调用 REST APIcurl -X POST https://api.sciphi.ai/v3/retrieval/agent \ -H Content-Type: application/json \ -H Authorization: Bearer YOUR_API_KEY \ -d { message: { role: user, content: What does DeepSeek R1 imply for the future of AI? }, rag_tools: [search_file_knowledge, get_file_content], rag_generation_config: { model: anthropic/claude-3-7-sonnet-20250219, extended_thinking: true, thinking_budget: 4096, temperature: 1, max_tokens_to_sample: 16000, stream: true }, mode: rag }/v3/retrieval/agent端点的完整请求参数message、search_settings、rag_generation_config、research_generation_config、rag_tools、research_tools、mode、conversation_id、max_tool_context_length等可参考 py/core/main/api/v3/retrieval_router.py 中agent_app的 OpenAPI 定义。使用 Research 模式Research 模式适合需要深度推理、多来源综合与计算的复杂问题。完整研究工具集示例# Research mode with all available tools response client.retrieval.agent( message{ role: user, content: Analyze the philosophical implications of DeepSeek R1 for the future of AI reasoning }, research_generation_config{ model: anthropic/claude-3-opus-20240229, extended_thinking: True, thinking_budget: 8192, temperature: 0.2, max_tokens_to_sample: 32000, stream: True }, research_tools[rag, reasoning, critique, python_executor], moderesearch ) # Process streaming events as shown in the previous example # ... # Research mode with computational focus # This example solves a mathematical problem using the python_executor tool compute_response client.retrieval.agent( message{ role: user, content: Calculate the factorial of 15 multiplied by 32. Show your work. }, research_generation_config{ model: anthropic/claude-3-opus-20240229, max_tokens_to_sample: 1000, stream: False }, research_tools[python_executor], moderesearch ) print(fFinal answer: {compute_response.results.messages[-1].content})JavaScript 版本// Research mode with all available tools const researchStream await client.retrieval.agent({ message: { role: user, content: Analyze the philosophical implications of DeepSeek R1 for the future of AI reasoning }, researchGenerationConfig: { model: anthropic/claude-3-opus-20240229, extendedThinking: true, thinkingBudget: 8192, temperature: 0.2, maxTokens: 32000, stream: true }, researchTools: [rag, reasoning, critique, python_executor], mode: research }); // Process streaming events as shown in the previous example // ... // Research mode with computational focus const computeResponse await client.retrieval.agent({ message: { role: user, content: Calculate the factorial of 15 multiplied by 32. Show your work. }, researchGenerationConfig: { model: anthropic/claude-3-opus-20240229, maxTokens: 1000, stream: false }, researchTools: [python_executor], mode: research }); console.log(Final answer: ${computeResponse.results.messages[computeResponse.results.messages.length - 1].content});源码级原理四个研究工具的内部实现从 py/core/agent/research.py 可以看到rag工具_rag以当前配置复制一份RAGAgentConfig强制混入web_search、web_scrape与用户配置的 RAG 工具创建一个独立R2RRAGAgent执行查询并把返回内容中的引用citation从该 RAG 智能体的search_results_collector转移给外层研究智能体保证最终回答的引用链条完整。reasoning工具_reason读取对话历史用app_config.reasoning_llm默认openai/o3-mini、temperature0.1、max_tokens_to_sample64000、reasoning_efforthigh的专用配置调用底层 LLM完成独立于主对话的深度推理。critique工具_critique把对话历史组装成包含逻辑谬误 / 认知偏差 / 被忽略的问题 / 替代方案 / 严谨性改进五段式结构的批判提示词再交给reasoning工具处理实现第二意见。python_executor工具_execute_python_with_process_timeout把代码写入临时.py文件后在独立子进程中执行默认 10 秒超时避免卡死主流程支持 numpy、pandas、sympy、scipy 等常见科学计算库返回 stdout / stderr / 超时状态并以 Markdown 格式回填给 LLM。仓库中research.py对该工具的描述与_format_python_results的输出格式均可直接复用。此外Research 模式加载的是 static_research_agent.yaml 提示词它要求智能体区分宽泛定性问题与窄范围学术问题分别采用多论点研究与聚焦战略分析并强制使用行内引用如[c910e2e]保证可追溯。定制智能体工具选择按需裁剪工具可以减少无效调用、加快响应# RAG mode with web capabilities response client.retrieval.agent( message{role: user, content: What are the latest developments in AI safety?}, rag_tools[search_file_knowledge, get_file_content, web_search, web_scrape], moderag ) # Research mode with limited tools response client.retrieval.agent( message{role: user, content: Analyze the complexity of this algorithm}, research_tools[reasoning, python_executor], # Only reasoning and code execution moderesearch )注意服务端会校验工具名——RAG 工具仅接受web_search、web_scrape、search_file_descriptions、search_file_knowledge、get_file_contentResearch 工具仅接受rag、reasoning、critique、python_executor见 retrieval_router.py 中Literal[...]类型约束。若在moderag下传了research_tools服务端会记录警告并忽略它们见 retrieval_service.py。搜索设置透传传给智能体的search_settings会原样透传给下游的每一次搜索包括限制文档来源的过滤器filters返回结果数量上限limit混合搜索配置use_hybrid_search与hybrid_settings集合collection限制。# Using search settings with the agent response client.retrieval.agent( message{role: user, content: Summarize our Q1 financial results}, search_settings{ use_semantic_search: True, filters: {collection_ids: {$overlap: [e43864f5-...]}}, limit: 25 }, rag_tools[search_file_knowledge, get_file_content], moderag )从实现看search_settings由路由层经_prepare_search_settings归一化search_mode为basic/advanced时以模式默认值为基底再做字段级合并custom模式直接使用传入对象随后注入到智能体的RAGAgentMixin.search_settings最终由search_file_knowledge工具以knowledge_search_method(query, search_settingscontext.search_settings)的方式消费见 search_file_knowledge.py。filters支持的运算符$eq、$neq、$gt、$gte、$lt、$lte、$like、$ilike、$in、$nin以及$and/$or组合与 Search RAG 指南 中的高级过滤规则一致。模型选择与生成参数# Using a specific model with custom parameters response client.retrieval.agent( message{role: user, content: Write a concise summary of DeepSeek R1s capabilities}, rag_generation_config{ model: anthropic/claude-3-haiku-20240307, # Faster model for simpler tasks temperature: 0.3, # Lower temperature for more deterministic output max_tokens_to_sample: 500, # Limit response length stream: False # Non-streaming for simpler use cases }, moderag )常用生成参数一览后端GenerationConfigmodelLLM 标识如anthropic/claude-3-7-sonnet-20250219、openai/gpt-5-2025-08-07未指定时按模式回退到quality_llm/planning_llmstream布尔值默认false置为true时返回 SSE 事件流temperature、top_p、max_tokens_to_sample标准采样与长度控制extended_thinking/thinking_budgetAnthropic 系列模型启用扩展思考及其 token 预算需要模型支持。多轮对话与会话保持通过conversation_id让智能体记住之前的交互并在后续回答中延续上下文。首次调用后请保存返回的conversation_id并在后续请求中带上它若会话还没有名称系统会自动分配一个见 retrieval_router.py 的needs_initial_conversation_name参数。# Create a new conversation conversation client.conversations.create() conversation_id conversation.results.id # First turn first_response client.retrieval.agent( message{role: user, content: What does DeepSeek R1 imply for the future of AI?}, rag_generation_config{ model: anthropic/claude-3-7-sonnet-20250219, temperature: 0.7, max_tokens_to_sample: 1000, stream: False }, conversation_idconversation_id, moderag ) print(fFirst response: {first_response.results.messages[-1].content[:100]}...) # Follow-up query in the same conversation follow_up_response client.retrieval.agent( message{role: user, content: How does it compare to other reasoning models?}, rag_generation_config{ model: anthropic/claude-3-7-sonnet-20250219, temperature: 0.7, max_tokens_to_sample: 1000, stream: False }, conversation_idconversation_id, moderag ) print(fFollow-up response: {follow_up_response.results.messages[-1].content[:100]}...) # The agent maintains context, so it knows it refers to DeepSeek R1JavaScript 版本// Create a new conversation const conversation await client.conversations.create(); const conversationId conversation.results.id; // First turn const firstResponse await client.retrieval.agent({ message: { role: user, content: What does DeepSeek R1 imply for the future of AI? }, ragGenerationConfig: { model: anthropic/claude-3-7-sonnet-20250219, temperature: 0.7, maxTokens: 1000, stream: false }, conversationId: conversationId, mode: rag }); console.log(First response: ${firstResponse.results.messages[firstResponse.results.messages.length - 1].content.substring(0, 100)}...); // Follow-up query in the same conversation const followUpResponse await client.retrieval.agent({ message: { role: user, content: How does it compare to other reasoning models? }, ragGenerationConfig: { model: anthropic/claude-3-7-sonnet-20250219, temperature: 0.7, maxTokens: 1000, stream: false }, conversationId: conversationId, mode: rag }); console.log(Follow-up response: ${followUpResponse.results.messages[followUpResponse.results.messages.length - 1].content.substring(0, 100)}...); // The agent maintains context, so it knows it refers to DeepSeek R1会话记忆的存储与检索由服务端完成retrieval_service.agent在收到conversation_id后会从conversations_handler.get_conversation拉取历史消息、追加本轮message并把parent_id串成消息链见 retrieval_service.py。性能考量根据仓库集成测试的观察优化智能体用法时可以从响应时间与大上下文两个维度入手。响应时间管理响应时间受查询复杂度、使用工具数量与请求输出长度共同影响# For time-sensitive applications, consider: # 1. Using a smaller max_tokens value # 2. Selecting faster models like claude-3-haiku # 3. Avoiding unnecessary tools fast_response client.retrieval.agent( message{role: user, content: Give me a quick overview of DeepSeek R1}, rag_generation_config{ model: anthropic/claude-3-haiku-20240307, # Faster model max_tokens_to_sample: 200, # Limited output stream: True # Stream for perceived responsiveness }, rag_tools[search_file_knowledge], # Minimal tools moderag )仓库的集成测试 test_agent.py 中test_agent_respects_max_tokens、test_agent_response_timing即分别验证了max_tokens对输出长度的约束效果与响应时间行为test_agent_rag_tool_usage/test_agent_rag_tool_usage2验证了search_file_knowledge、get_file_content等工具的实际调用路径。此外RAGAgentMixin中的max_tool_context_length路由层默认 32_768会按 token 占比截断工具返回的检索上下文避免工具结果撑爆上下文窗口见 py/core/agent/rag.py 的format_search_results_for_llm。处理大上下文面对大型文档集合应使用过滤器精准缩小检索范围并限制返回 chunk 数量# When working with large document collections, use filters to narrow results filtered_response client.retrieval.agent( message{role: user, content: Summarize key points from our AI ethics documentation}, search_settings{ filters: { $and: [ {document_type: {$eq: pdf}}, {metadata.category: {$eq: ethics}}, {metadata.year: {$gt: 2023}} ] }, limit: 10 # Limit number of chunks returned }, rag_generation_config{ max_tokens_to_sample: 500, stream: True }, moderag )底层原理工具是如何工作的RAG 模式工具search_file_knowledge基于语义与混合检索从已入库文档中查找相关文本 chunk 与知识图谱数据实体、关系、社区摘要是智能体获取内容级上下文的主力工具。search_file_descriptions只检索文件级元数据标题、文档级描述不触碰 chunk 内容与图谱关系适合这份语料里有哪些相关文档式的宽泛定位。get_file_content当 agent 需要更完整的上下文时按document_id拉取整篇文档或其 chunk 结构。web_search调用 Serper 等外部搜索 API 获取实时信息需要SERPER_API_KEY。web_scrape借助 Firecrawl 抽取指定网页正文做深度分析需要FIRECRAWL_API_KEY。Research 模式工具rag复用底层 RAG 智能体在你的数据源上做完整检索与综合并将引用结果上抛给外层研究智能体。reasoning把复杂推理任务外包给专用推理模型reasoning_llm是外部专家模块式的分析引擎。critique基于对话历史找出推理缺陷、偏见与替代方案提升研究严谨性。python_executor在隔离子进程中执行 Python 代码赋予智能体计算、统计与算法实现能力。整体上Agentic RAG 智能体由工具注册中心ToolRegistry 检索回调注入RAGAgentMixin 研究工具集ResearchAgentMixin 流式事件封装构成它根据查询需求自主决定调用哪些工具、在推理过程中动态发起调用最终输出带引用来源的完整回答。值得留意的是critique与python_executor在RAGAgentConfig的默认research_tools列表中存在但源码注释将其标记为DISABLED by default实际是否启用取决于你在请求research_tools或部署配置中的显式声明见 py/r2r/r2r.toml 中research_tools [rag, reasoning, critique, python_executor]。配置参考默认行为均可在 py/r2r/r2r.toml 的[app]与[agent]段调整[app] # LLM used for user-facing output, like RAG replies quality_llm openai/gpt-5-2025-08-07 # Reasoning model, used for research agent reasoning_llm openai/o3-mini # Planning model, used for research agent planning_llm anthropic/claude-3-7-sonnet-20250219 [agent] rag_agent_static_prompt static_rag_agent rag_agent_dynamic_prompt dynamic_rag_agent # The following tools are available to the rag agent rag_tools [search_file_descriptions, search_file_knowledge, get_file_content] # can add web_search | web_scrape # The following tools are available to the research agent research_tools [rag, reasoning, critique, python_executor]其中planning_llm是 Research 模式主生成模型即未显式指定model时 Research 模式的默认模型reasoning_llm是reasoning/critique工具的底层模型。提示词模板位于 py/core/providers/database/prompts 目录static_rag_agent.yaml、dynamic_rag_agent.yaml、dynamic_rag_agent_xml_tooling.yaml服务于 RAG 智能体static_research_agent.yaml服务于研究智能体可结合 提示词文档 进行自定义。总结Agentic RAG 为检索增强生成提供了一套检索 推理 工具 记忆的组合方案RAG 模式负责基于知识库的快速、可引用问答Research 模式在其之上叠加reasoning、critique、python_executor与内部rag工具形成面向复杂课题的深度研究链路。结合流式事件处理、search_settings透传、conversation_id会话保持与工具级裁剪你可以在 R2R 已入库数据之上构建从单轮知识问答到多步深度调研的完整应用。【免费下载链接】R2RSoTA production-ready AI retrieval system. Agentic Retrieval-Augmented Generation (RAG) with a RESTful API.项目地址: https://gitcode.com/GitHub_Trending/r2/R2R创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考