ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MCP 对抗性多智能体推理:用共享工具集的辩论模式提升 AI 输出可靠性

MCP 对抗性多智能体推理:用共享工具集的辩论模式提升 AI 输出可靠性 教程文档人工智能【免费下载链接】mcp-for-beginnersThis open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for developers, it focuses on practical techniques for building modular, scalable, and secure AI workflows from session setup to service orchestration.项目地址https://gitcode.com/GitHub_Trending/mc/mcp-for-beginners点击查看免费下载本文基于 mcp-for-beginners 仓库中的「Adversarial Multi-Agent Reasoning」课程系统讲解如何用两个持有对立立场的 AI 智能体共享同一套 MCP 工具通过结构化辩论Debate暴露单智能体流水线容易遗漏的错误——包括幻觉检测、威胁建模、事实核验与设计评审——并引入裁判智能体Judge Agent输出带置信度评分的最终裁决。读完本文你将掌握共享 MCP 工具服务器的搭建、正反双方系统提示词的设计、多轮辩论编排器的实现Python / TypeScript / C#以及生产环境下对抗式智能体的安全边界。为什么需要对抗式多智能体模式单个智能体的推理链路通常是「提示词 → 模型 → 输出」缺少对自身结论的证伪机制。对抗式多智能体模式通过引入两个立场相反的智能体强制它们就同一命题互相质询、用工具取证并回应对方论点从而产生比单个智能体更可靠、校准更良好的输出。该模式在以下场景尤其有价值幻觉检测Hallucination detection第二智能体专门挑战第一智能体提出的缺乏证据支撑的主张威胁建模与安全评审Threat modeling / security reviews一方论证系统是安全的另一方专门寻找可利用的漏洞API 或需求设计API / requirements design一方捍卫既定设计另一方提出反对意见事实核验Factual verification双方独立查询同一组 MCP 工具交叉验证彼此的结论。模式的核心前提是双方共享同一套 MCP 工具集处于相同的信息环境。这意味着双方产生的任何分歧反映的是真正的推理差异而非信息不对称——如果一方能访问额外数据而另一方不能辩论就失去了公平性。学习目标完成本课程后你将能够解释为何对抗式多智能体模式能捕捉到单智能体流水线遗漏的错误设计一个双方共享同一套 MCP 工具集的辩论架构编写引导各自立场正方/反方的系统提示词加入裁判智能体或人工审核步骤将辩论综合为最终裁决理解 MCP 工具在并发智能体之间共享的工作方式。架构总览从命题到裁决的完整流程对抗式模式的高层数据流如下本仓库课程文档 mcp-adversarial-agents/README.md 中的架构图关键设计决策决策理由双方共享同一个 MCP 服务器消除信息不对称——分歧反映的是推理差异而非数据访问差异双方持有对立的系统提示词迫使每个智能体对另一方的立场进行压力测试裁判智能体综合辩论结果产出单一可执行输出无需人工介入每个决策多轮辩论允许每个智能体回应对方基于工具的取证实现四步搭建对抗式辩论流水线课程实现分为四个步骤共享 MCP 工具服务器 → 双方系统提示词 → 辩论编排器 → 将 MCP 工具接入智能体。第一步共享 MCP 工具服务器先暴露双方智能体都会调用的工具。下面是一个基于 FastMCP 的最小化 Python MCP 服务器提供web_search联网取证与run_python代码验证定量主张两个工具# shared_tools_server.py from mcp.server.fastmcp import FastMCP import httpx mcp FastMCP(debate-tools) mcp.tool() async def web_search(query: str) - str: Search the web and return a short summary of the top results. # Replace with your preferred search API (e.g., SerpAPI, Brave Search). async with httpx.AsyncClient() as client: response await client.get( https://api.search.example.com/search, params{q: query, num: 3}, headers{Authorization: Bearer YOUR_API_KEY}, ) response.raise_for_status() results response.json().get(results, []) snippets \n.join(r[snippet] for r in results) return fSearch results for {query}:\n{snippets} mcp.tool() async def run_python(code: str) - str: Execute a Python snippet and return stdout stderr. WARNING: This is an unsafe placeholder that runs code directly on the host. In production, replace with a sandboxed execution environment (e.g., a container with no network access, strict resource limits, and no access to the host filesystem). import subprocess, sys, textwrap result subprocess.run( [sys.executable, -c, textwrap.dedent(code)], capture_outputTrue, textTrue, timeout10 ) return result.stdout result.stderr if __name__ __main__: mcp.run(transportstdio)运行方式python shared_tools_server.pyTypeScript 版本基于modelcontextprotocol/sdk的McpServer与StdioServerTransport构建工具参数用 zod 校验run_python通过execFileAsync(python3, [-c, code])直传参数执行避免 shell 调用带来的命令注入风险// shared-tools-server.ts import { McpServer } from modelcontextprotocol/sdk/server/mcp.js; import { StdioServerTransport } from modelcontextprotocol/sdk/server/stdio.js; import { z } from zod; import { execFile } from child_process; import { promisify } from util; const execFileAsync promisify(execFile); const server new McpServer({ name: debate-tools, version: 1.0.0 }); server.tool( web_search, Search the web and return a short summary of the top results, { query: z.string() }, async ({ query }) { // Replace with your preferred search API. const url https://api.search.example.com/search?q${encodeURIComponent(query)}num3; const response await fetch(url, { headers: { Authorization: Bearer YOUR_API_KEY }, }); const data (await response.json()) as { results: { snippet: string }[] }; const snippets data.results.map((r) r.snippet).join(\n); return { content: [{ type: text, text: Search results for ${query}:\n${snippets} }], }; } ); server.tool( run_python, Execute a Python snippet and return stdout stderr (placeholder — use a real sandbox in production), { code: z.string() }, async ({ code }) { // WARNING: This executes LLM-controlled code directly on the host process. // In production, always run inside an isolated sandbox (e.g., a container // with no network access and strict resource limits). // See the Security Considerations section for details. try { // Pass code as a direct argument to python3 — no shell invocation, // no string interpolation, no command-injection risk. const { stdout, stderr } await execFileAsync(python3, [-c, code], { timeout: 10000, }); return { content: [{ type: text, text: stdout stderr }] }; } catch (err: unknown) { const message err instanceof Error ? err.message : String(err); return { content: [{ type: text, text: Error: ${message} }] }; } } ); const transport new StdioServerTransport(); await server.connect(transport);运行方式npx ts-node shared-tools-server.ts仓库中 05-AdvancedTopics/web-search-mcp/README.md 提供了基于 SerpAPI 的真实联网搜索服务器示例含general_search、news_search、product_search、qna四个工具可作为web_search占位实现的生产化参考。第二步设计正反双方的系统提示词每个智能体收到一条把立场「锁死」的系统提示词。关键点在于双方都明确知道自己在参与辩论并且必须用工具为自己的主张背书。# prompts.py FOR_SYSTEM_PROMPT You are Agent A in a structured debate. Your role is to argue *in favour* of the proposition given to you. Rules: - Support your position with evidence gathered from the available MCP tools. - Call the web_search tool to find real supporting data. - Call the run_python tool to verify quantitative claims with code. - When your opponent makes a claim, challenge it specifically and with evidence. - Do not concede your position unless your opponent provides irrefutable evidence. - Keep each turn concise (≤ 200 words). AGAINST_SYSTEM_PROMPT You are Agent B in a structured debate. Your role is to argue *against* the proposition given to you. Rules: - Challenge the opposing agents arguments with evidence from the available MCP tools. - Call the web_search tool to find counter-evidence. - Call the run_python tool to verify or disprove quantitative claims with code. - Point out logical fallacies, missing context, or unsupported assertions. - Do not concede your position unless the evidence is irrefutable. - Keep each turn concise (≤ 200 words). JUDGE_SYSTEM_PROMPT You are an impartial judge evaluating a structured debate. Your task: 1. Read the full debate transcript. 2. Identify the strongest evidence-backed arguments on each side. 3. Note any claims that were left unchallenged. 4. Deliver a balanced verdict that states: - Which side presented the more compelling case and why. - Key caveats or nuances that neither side addressed adequately. - A confidence score (0–100) for the winning position.提示词设计要点正方Agent A强调「取证」与「不轻易认输」鼓励调用web_search寻找真实支持数据、调用run_python用代码核验定量主张反方Agent B强调「证伪」与「指出逻辑谬误」鼓励寻找反证、用代码证伪对方的定量声明裁判Judge明确要求输出「哪一方更有说服力及原因」「双方都未充分覆盖的注意事项」「0–100 的置信度评分」三要素保证裁决可量化、可追溯。第三步辩论编排器Debate Orchestrator编排器负责创建双方智能体、管理辩论轮次最后把完整辩论记录交给裁判。Python 完整实现# debate_orchestrator.py import asyncio from anthropic import AsyncAnthropic from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client from prompts import FOR_SYSTEM_PROMPT, AGAINST_SYSTEM_PROMPT, JUDGE_SYSTEM_PROMPT client AsyncAnthropic() NUM_ROUNDS 3 # Number of back-and-forth exchange rounds async def run_agent_turn( conversation_history: list[dict], system_prompt: str, session: ClientSession, ) - str: Run one agent turn with MCP tool support. Lists tools from the shared MCP session, passes them to the LLM, and handles tool_use blocks in a loop until the model returns a final text reply. # Fetch the current tool list from the shared MCP server. tools_result await session.list_tools() tools [ { name: t.name, description: t.description or , input_schema: t.inputSchema, } for t in tools_result.tools ] messages list(conversation_history) while True: response await client.messages.create( modelclaude-opus-4-5, max_tokens512, systemsystem_prompt, messagesmessages, toolstools, ) # Collect any text the model produced. text_blocks [b for b in response.content if b.type text] # If the model is done (no tool calls), return its text reply. tool_uses [b for b in response.content if b.type tool_use] if not tool_uses: return text_blocks[0].text if text_blocks else # Record the assistant turn (may mix text tool_use blocks). messages.append({role: assistant, content: response.content}) # Execute each tool call and collect results. tool_results [] for tool_use in tool_uses: result await session.call_tool(tool_use.name, tool_use.input) tool_results.append( { type: tool_result, tool_use_id: tool_use.id, content: result.content[0].text if result.content else , } ) # Feed the tool results back to the model. messages.append({role: user, content: tool_results}) async def run_debate(proposition: str) - dict: Run a full adversarial debate on a proposition. Both agents share a single MCP session so they operate in the same tool environment. Returns a dictionary with the transcript and verdict. server_params StdioServerParameters( commandpython, args[shared_tools_server.py] ) async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() transcript: list[dict] [] # Seed the debate with the proposition. opening_message {role: user, content: fProposition: {proposition}} for_history: list[dict] [opening_message] against_history: list[dict] [opening_message] for round_num in range(1, NUM_ROUNDS 1): print(f\n--- Round {round_num} ---) # Agent A argues FOR. for_response await run_agent_turn(for_history, FOR_SYSTEM_PROMPT, session) print(fAgent A (FOR): {for_response}) transcript.append({round: round_num, agent: FOR, text: for_response}) # Share Agent As argument with Agent B. for_history.append({role: assistant, content: for_response}) against_history.append({role: user, content: fOpponent argued: {for_response}}) # Agent B argues AGAINST. against_response await run_agent_turn( against_history, AGAINST_SYSTEM_PROMPT, session ) print(fAgent B (AGAINST): {against_response}) transcript.append({round: round_num, agent: AGAINST, text: against_response}) # Share Agent Bs argument with Agent A for the next round. against_history.append({role: assistant, content: against_response}) for_history.append({role: user, content: fOpponent argued: {against_response}}) # Build the transcript summary for the judge. transcript_text \n\n.join( fRound {t[round]} – {t[agent]}:\n{t[text]} for t in transcript ) judge_input [ { role: user, content: fProposition: {proposition}\n\nDebate transcript:\n{transcript_text}, } ] # Judge evaluates the debate. verdict await run_agent_turn(judge_input, JUDGE_SYSTEM_PROMPT, session) print(f\n Judge Verdict \n{verdict}) return {transcript: transcript, verdict: verdict} if __name__ __main__: proposition ( Large language models will eliminate the need for junior software developers within five years. ) result asyncio.run(run_debate(proposition))TypeScript 版本使用anthropic-ai/sdk通过client.messages.create直接完成多轮调用代码结构同样遵循「正方发言 → 转交反方 → 反方发言 → 转交正方」的回合循环// debate-orchestrator.ts import Anthropic from anthropic-ai/sdk; const client new Anthropic(); const FOR_SYSTEM_PROMPT You are Agent A in a structured debate. Your role is to argue *in favour* of the proposition given to you. Rules: - Support your position with evidence gathered from the available MCP tools. - Call the web_search tool to find real supporting data. - When your opponent makes a claim, challenge it specifically and with evidence. - Keep each turn concise (≤ 200 words).; const AGAINST_SYSTEM_PROMPT You are Agent B in a structured debate. Your role is to argue *against* the proposition given to you. Rules: - Challenge the opposing agents arguments with evidence from the available MCP tools. - Call the web_search tool to find counter-evidence. - Point out logical fallacies, missing context, or unsupported assertions. - Keep each turn concise (≤ 200 words).; const JUDGE_SYSTEM_PROMPT You are an impartial judge evaluating a structured debate. Deliver a verdict with: 1. Which side presented the more compelling case and why. 2. Key caveats or nuances that neither side addressed. 3. A confidence score (0–100) for the winning position.; type Message { role: user | assistant; content: string }; type DebateTurn { round: number; agent: FOR | AGAINST; text: string }; async function runAgentTurn(history: Message[], systemPrompt: string): Promisestring { const response await client.messages.create({ model: claude-opus-4-5, max_tokens: 512, system: systemPrompt, messages: history, }); const text response.content .filter((block) block.type text) .map((block) block.text) .join(\n) .trim(); if (!text) { const blockTypes response.content.map((block) block.type).join(, ); throw new Error( Expected at least one text response block, but received: ${blockTypes || none} ); } return text; } async function runDebate( proposition: string, numRounds 3 ): Promise{ transcript: DebateTurn[]; verdict: string } { const transcript: DebateTurn[] []; const openingMessage: Message { role: user, content: Proposition: ${proposition} }; const forHistory: Message[] [openingMessage]; const againstHistory: Message[] [openingMessage]; for (let round 1; round numRounds; round) { console.log(\n--- Round ${round} ---); // Agent A (FOR) const forResponse await runAgentTurn(forHistory, FOR_SYSTEM_PROMPT); console.log(Agent A (FOR): ${forResponse}); transcript.push({ round, agent: FOR, text: forResponse }); forHistory.push({ role: assistant, content: forResponse }); againstHistory.push({ role: user, content: Opponent argued: ${forResponse} }); // Agent B (AGAINST) const againstResponse await runAgentTurn(againstHistory, AGAINST_SYSTEM_PROMPT); console.log(Agent B (AGAINST): ${againstResponse}); transcript.push({ round, agent: AGAINST, text: againstResponse }); againstHistory.push({ role: assistant, content: againstResponse }); forHistory.push({ role: user, content: Opponent argued: ${againstResponse} }); } // Judge const transcriptText transcript .map((t) Round ${t.round} – ${t.agent}:\n${t.text}) .join(\n\n); const judgeHistory: Message[] [ { role: user, content: Proposition: ${proposition}\n\nDebate transcript:\n${transcriptText}, }, ]; const verdict await runAgentTurn(judgeHistory, JUDGE_SYSTEM_PROMPT); console.log(\n Judge Verdict \n${verdict}); return { transcript, verdict }; } // Run const proposition Large language models will eliminate the need for junior software developers within five years.; runDebate(proposition).catch(console.error);C# 版本基于Anthropic.SDK的AnthropicClient.Messages.GetClaudeMessageAsync用record DebateTurn记录轮次结构与 Python/TypeScript 完全同构// DebateOrchestrator.cs using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Anthropic.SDK; using Anthropic.SDK.Messaging; public class DebateOrchestrator { private const string Model claude-opus-4-5; private readonly AnthropicClient _client new(); private const string ForSystemPrompt You are Agent A in a structured debate. Your role is to argue *in favour* of the proposition given to you. Rules: - Support your position with evidence. - Challenge your opponents claims specifically. - Keep each turn concise (≤ 200 words).; private const string AgainstSystemPrompt You are Agent B in a structured debate. Your role is to argue *against* the proposition given to you. Rules: - Challenge the opposing agents arguments with evidence. - Point out logical fallacies or unsupported assertions. - Keep each turn concise (≤ 200 words).; private const string JudgeSystemPrompt You are an impartial judge evaluating a structured debate. Deliver a verdict with: 1. Which side presented the more compelling case and why. 2. Key caveats neither side addressed. 3. A confidence score (0–100) for the winning position.; private record DebateTurn(int Round, string Agent, string Text); private async Taskstring RunAgentTurnAsync( ListMessage history, string systemPrompt) { var request new MessageParameters { Model Model, MaxTokens 512, System [new SystemMessage(systemPrompt)], Messages history }; var response await _client.Messages.GetClaudeMessageAsync(request); return response.Content.OfTypeTextContent().FirstOrDefault()?.Text ?? string.Empty; } public async Task(ListDebateTurn Transcript, string Verdict) RunDebateAsync( string proposition, int numRounds 3) { var transcript new ListDebateTurn(); var opening new Message { Role RoleType.User, Content $Proposition: {proposition} }; var forHistory new ListMessage { opening }; var againstHistory new ListMessage { opening }; for (int round 1; round numRounds; round) { Console.WriteLine($\n--- Round {round} ---); // Agent A (FOR) var forResponse await RunAgentTurnAsync(forHistory, ForSystemPrompt); Console.WriteLine($Agent A (FOR): {forResponse}); transcript.Add(new DebateTurn(round, FOR, forResponse)); forHistory.Add(new Message { Role RoleType.Assistant, Content forResponse }); againstHistory.Add(new Message { Role RoleType.User, Content $Opponent argued: {forResponse} }); // Agent B (AGAINST) var againstResponse await RunAgentTurnAsync(againstHistory, AgainstSystemPrompt); Console.WriteLine($Agent B (AGAINST): {againstResponse}); transcript.Add(new DebateTurn(round, AGAINST, againstResponse)); againstHistory.Add(new Message { Role RoleType.Assistant, Content againstResponse }); forHistory.Add(new Message { Role RoleType.User, Content $Opponent argued: {againstResponse} }); } // Judge var transcriptText string.Join(\n\n, transcript.Select(t $Round {t.Round} – {t.Agent}:\n{t.Text})); var judgeHistory new ListMessage { new() { Role RoleType.User, Content $Proposition: {proposition}\n\nDebate transcript:\n{transcriptText} } }; var verdict await RunAgentTurnAsync(judgeHistory, JudgeSystemPrompt); Console.WriteLine($\n Judge Verdict \n{verdict}); return (transcript, verdict); } public static async Task Main() { var orchestrator new DebateOrchestrator(); const string proposition Large language models will eliminate the need for junior software developers within five years.; await orchestrator.RunDebateAsync(proposition); } }三个语言版本的编排逻辑完全对齐NUM_ROUNDS 3轮正反交锋每轮双方各发言一次且把对方上一轮发言以「Opponent argued: …」的形式注入己方历史确保后续反驳是基于对方真实论点的针对性回应。第四步将 MCP 工具接入智能体关键模式Python 编排器已展示完整的 MCP 接入实现其核心模式有三点单一共享会话One shared sessionrun_debate只打开一个ClientSession并将其传给每一次run_agent_turn调用因此双方智能体与裁判都运行在同一个工具环境中每轮动态列举工具Tool listing per turnrun_agent_turn调用session.list_tools()获取当前工具定义并以tools参数转发给 LLM工具调用循环Tool-use loop当模型返回tool_use块时run_agent_turn对每个工具调用执行session.call_tool()把结果回传给模型循环往复直到模型产出最终文本回复。这套模式与仓库中 03-GettingStarted/02-client/solution 提供的各语言完整 MCP 客户端实现一脉相承——例如 Python 客户端在 client.py 中同样通过stdio_client建立会话、session.initialize()握手、session.list_tools()发现能力、session.call_tool()调用工具TypeScript 客户端则用ClientStdioClientTransport完成相同流程。对照阅读可以更直观地理解session.list_tools()与session.call_tool()在真实客户端中的用法。实战用例矩阵用例正方智能体FOR反方智能体AGAINST裁判输出威胁建模Threat modeling此 API 端点是安全的这里有五个攻击向量按优先级排序的风险清单API 设计评审API design review此设计是最优的这些权衡取舍有问题附注意事项的推荐设计事实核验Factual verification主张 X 有证据支持证据 Y 与主张 X 矛盾带置信度评级的裁决技术选型Technology selection选择框架 A框架 B 因以下原因更优附推荐的决策矩阵安全注意事项生产环境必读将对抗式智能体投入生产时必须守住以下安全边界沙箱化代码执行Sandbox code executionrun_python工具必须在隔离环境中执行例如无网络访问、带资源限制的容器。绝不允许在宿主机上直接运行不受信任的 LLM 生成代码工具调用校验Tool call validation执行前校验所有工具输入。由于双方共享同一工具服务器注入到辩论中的恶意提示词可能试图滥用工具速率限制Rate limiting对每个智能体的工具调用实施独立的速率限制防止失控的循环调用审计日志Audit logging记录每一次工具调用及其结果以便事后审查每个智能体依据什么证据得出结论人工介入Human-in-the-loop对高风险决策裁判的裁决应先经人工复核再执行。更系统的安全控制可参考仓库中的 02-Security 章节含 mcp-security-best-practices.md、mcp-security-controls.md以及高级主题中的 mcp-security/README.md——后者基于 MCP Specification2026-07-28详细讨论了提示注入prompt injection、工具投毒tool poisoning、会话劫持session hijacking、confused deputy 问题与 token passthrough 漏洞等对抗式场景直接相关的威胁。练习设计你自己的对抗式 MCP 流水线为以下场景之一设计对抗式 MCP 流水线代码评审Code review智能体 A 为某个 Pull Request 辩护智能体 B 寻找 Bug、安全问题与风格缺陷裁判汇总最重要的问题架构决策Architecture decision智能体 A 提议微服务架构智能体 B 主张单体架构裁判产出决策矩阵内容审核Content moderation智能体 A 论证某内容可安全发布智能体 B 寻找违规点裁判给出风险评分。每个场景需要完成定义双方智能体与裁判的系统提示词确定每个智能体需要哪些 MCP 工具画出消息流转草图开场论证 → 反驳 → 再反驳 → 裁决描述如何在执行裁决前对裁判结论进行验证。核心要点对抗式多智能体模式用对立的系统提示词迫使智能体互相压力测试对方的推理共享单一 MCP 工具服务器确保双方基于相同信息工作——分歧来自推理而非数据访问裁判智能体将辩论综合为可执行的裁决无需每个决策都经过人工瓶颈该模式在幻觉检测、威胁建模、事实核验与设计评审中尤为强大在生产环境运行对抗式智能体安全的工具执行与完善的日志记录必不可少。延伸阅读继续深入学习相关高级主题5.1 MCP IntegrationMCP 与 Azure 集成5.8 SecurityMCP 安全5.5 RoutingMCP 路由赞分享教程文档人工智能【免费下载链接】mcp-for-beginnersThis open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for developers, it focuses on practical techniques for building modular, scalable, and secure AI workflows from session setup to service orchestration.项目地址https://gitcode.com/GitHub_Trending/mc/mcp-for-beginners点击查看免费下载相关推荐10分钟上手rrtools从0到1创建R研究项目的快速教程10分钟上手rrtools从0到1创建R研究项目的快速教程 rrtools是一款专为R语言研究者设计的 可复现研究工具包 能够帮助你在10分钟内搭建起标准化Hello-Agents多智能体协作模式分工、合作、辩论的完美实现在人工智能快速发展的今天 多智能体协作 已成为提升AI系统能力的关键技术。Datawhale推出的hello agents项目通过精心设计的协作框架实现了智教程人工智能大模型AI Agent如何通过消息队列集成提升agno多智能体系统通信可靠性如何通过消息队列集成提升agno多智能体系统通信可靠性 在构建高性能多智能体系统时通信可靠性是确保系统稳定运行的核心挑战。agno作为专注于多智能体系统的高性人工智能大模型AI AgentAgent 框架多智能体工具调用RAGAgent 工作流Agent 记忆上一篇rclone分布式文件同步工具技术深度解析架构设计与企业级应用指南下一篇LinearDesign终极指南5步掌握mRNA序列优化生物信息学工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表