尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于MCP协议构建AI智能体:标准化工具调用解决LLM幻觉问题

基于MCP协议构建AI智能体:标准化工具调用解决LLM幻觉问题 在实际 AI 应用开发中我们常常遇到一个棘手问题大语言模型LLM虽然能生成流畅、连贯的文本但其回答可能基于不存在的“记忆”或错误信息这种现象被称为“AI幻觉”。例如当你询问一个内部业务系统的具体数据时模型可能会编造一个看似合理但完全错误的答案。这种幻觉在需要高准确性的场景如金融分析、代码生成、知识问答中是致命的。解决幻觉的核心思路之一是让模型“开卷考”——即不依赖其内部参数化的“记忆”而是为它提供实时、准确的外部数据源作为参考依据让模型基于给定的“参考资料”来生成答案。这不仅能极大提升回答的准确性还能将模型的通用能力与特定领域的数据、工具相结合构建出真正可用的智能体Agent。本文将围绕如何为 AI 模型构建“开卷考”环境展开重点介绍一种新兴的、旨在标准化模型与工具交互的协议——模型上下文协议Model Context Protocol, MCP。我们将从概念入手解释为什么需要 MCP然后通过一个完整的实战案例演示如何利用 MCP 协议将一个真实的金融数据接口以新浪财经股票接口为例封装成 AI 模型可调用的工具从而构建一个能准确回答股票相关问题的智能体。整个过程将涵盖环境搭建、MCP 服务器开发、智能体集成、运行验证及常见问题排查。1. 理解“开卷考”与 MCP为何标准化工具调用是关键在传统的人机交互中程序调用一个 API 需要明确的函数签名、参数格式和返回数据结构。然而大语言模型是自然语言驱动的它无法直接理解我们代码中的get_stock_data(symbol)函数。早期的解决方案是使用提示词工程在系统提示中详细描述 API 的用法或者为特定模型如 OpenAI 的 GPT 系列编写专用的 Function Calling 描述。但这带来了几个问题耦合度高为每个模型、每个工具都要写一套适配逻辑代码难以复用。描述不一致不同开发者对同一个工具的描述可能千差万别导致模型理解混乱。动态性差工具列表难以在运行时动态增删每次更新都需要修改提示词并重新初始化模型会话。模型上下文协议MCP正是为了解决这些问题而设计的。它定义了一套标准化的协议用于声明工具Tools、提供资源Resources并与之交互。你可以把 MCP 想象成 AI 世界的“USB 协议”MCP 服务器Server相当于一个“外设”它封装了具体的功能比如查询数据库、调用天气 API、执行命令行命令。它向外界宣告“我这里有哪些工具可用每个工具怎么用。”MCP 客户端Client通常是 AI 应用框架或智能体平台如 Claude Desktop、Dify、Cline它负责连接一个或多个 MCP 服务器获取工具列表并在需要时代表模型去调用这些工具。协议Protocol规定了 Server 和 Client 之间通信的格式基于 JSON-RPC包括如何初始化、如何列出工具、如何调用工具、如何传递数据。采用 MCP 后智能体的构建变得清晰开发者将任意数据源或功能封装成一个独立的 MCP 服务器。智能体平台通过 MCP 协议发现并加载这些服务器提供的工具。当用户提问时平台将问题、上下文以及可用的工具描述一并发送给 LLM。LLM 判断是否需要调用工具并生成符合 MCP 格式的调用请求。平台执行工具调用将结果返回给 LLM。LLM 整合工具返回的结果生成最终回答给用户。这个过程实现了“开卷考”LLM 不再凭空编造而是学会了“查阅”我们提供的、实时更新的“资料”工具返回的数据。2. 环境准备与项目初始化我们的目标是构建一个能查询实时股票数据的智能体。为此我们需要搭建两部分环境一是用于提供股票数据工具的 MCP 服务器二是用于集成和测试该工具的智能体客户端。2.1 开发环境与工具选择编程语言Python 3.8。因其在数据处理和网络请求方面的丰富生态是构建 MCP 服务器的理想选择。MCP SDK我们将使用官方提供的mcpPython 库来简化服务器开发。它处理了协议底层的 JSON-RPC 通信。HTTP 客户端使用requests库来调用新浪财经的公开数据接口。智能体客户端测试用为了快速验证我们可以使用 Claude Desktop它内置了 MCP 客户端支持或者一个简单的、支持 MCP 的 Python 测试客户端。本文将以一个自建的简单测试客户端为例确保流程的透明和可复现。代码编辑器VS Code 或 PyCharm。2.2 创建项目目录与依赖安装首先创建一个新的项目目录并初始化虚拟环境。mkdir mcp-stock-agent cd mcp-stock-agent python -m venv venv # 激活虚拟环境 (Windows) venv\Scripts\activate # 激活虚拟环境 (macOS/Linux) source venv/bin/activate接下来安装核心依赖。我们创建两个requirements.txt文件分别用于服务器和客户端。server/requirements.txt:mcp1.0.0 requests2.28.0 pydantic2.0.0client/requirements.txt(用于我们的测试客户端):mcp1.0.0安装服务器依赖pip install -r server/requirements.txt2.3 了解新浪财经股票数据接口为了给模型提供准确的“资料”我们需要一个可靠的数据源。新浪财经提供了公开的股票数据接口虽然非官方但在许多场景下足够使用。我们需要理解其返回的数据含义以便正确解析并提供给模型。一个获取股票实时概要信息的接口示例http://hq.sinajs.cn/lists_{股票代码}例如查询贵州茅台sh600519http://hq.sinajs.cn/lists_sh600519返回的数据是一个字符串格式类似var hq_str_s_sh600519茅台, 1700.000, 1701.500, 1688.000, 1705.500, 1685.000, 1700.000, 1701.500, 1095500, 1861234567.890, 0, 0, 0, 2024-05-27, 15:00:00,00;这个字符串需要被解析。各字段以逗号分隔其典型含义如下表所示不同接口或时间字段顺序可能微调以下为常见顺序字段序号示例值含义说明0茅台股票名称11700.000今日开盘价21701.500昨日收盘价31688.000当前价格41705.500今日最高价51685.000今日最低价61700.000竞买价买一价71701.500竞卖价卖一价81095500成交股数单位股91861234567.890成交金额单位元100买一量股110买一价通常与字段6重复.........后续字段可能包括买二、买三等n-32024-05-27日期n-215:00:00时间n-100未知可能为状态码注意公开接口可能存在变动、限流或访问不稳定。生产环境应使用稳定、授权的金融数据服务并做好错误处理和缓存。此处仅用于演示 MCP 集成原理。3. 构建股票数据 MCP 服务器MCP 服务器的核心是向客户端声明可用的工具Tools。我们将创建一个工具get_stock_quote它接收股票代码作为参数调用新浪接口并返回结构化的股票信息。3.1 服务器代码实现在项目根目录下创建server/stock_server.py文件。#!/usr/bin/env python3 新浪财经股票数据 MCP 服务器。 为 AI 智能体提供查询实时股票数据的工具。 import asyncio import sys from typing import Any import requests from mcp import ClientSession, StdioServerParameters from mcp.server import Server from mcp.server.models import InitializationOptions import mcp.server.stdio from pydantic import BaseModel, Field # 定义工具输入参数的模型 class StockQueryInput(BaseModel): 查询股票行情所需的参数 symbol: str Field( ..., description股票代码例如sh600519上证sz000001深证bj430090北证。 ) # 创建 MCP 服务器实例 server Server(stock-data-server) server.list_tools() async def handle_list_tools() - list[dict[str, Any]]: 向客户端声明本服务器提供的工具列表 return [ { name: get_stock_quote, description: 根据股票代码获取实时股票行情数据包括名称、当前价、开盘价、最高最低价、成交量等。, inputSchema: { type: object, properties: { symbol: { type: string, description: 股票代码例如sh600519, sz000001 } }, required: [symbol] } } ] server.call_tool() async def handle_call_tool(name: str, arguments: dict[str, Any]) - list[dict[str, Any]]: 处理客户端发起的工具调用请求 if name get_stock_quote: # 验证参数 try: query StockQueryInput(**arguments) except Exception as e: return [{ type: text, text: f参数错误{e} }] # 调用新浪财经接口 stock_data await fetch_stock_data(query.symbol) return [{ type: text, text: stock_data }] else: # 未知工具名 return [{ type: text, text: f未知工具{name} }] async def fetch_stock_data(symbol: str) - str: 调用新浪财经接口获取股票数据并格式化为自然语言 url fhttp://hq.sinajs.cn/lists_{symbol} headers { Referer: http://finance.sina.com.cn, User-Agent: Mozilla/5.0 } try: response requests.get(url, headersheaders, timeout10) response.encoding gbk # 接口返回通常是 GBK 编码 raw_text response.text # 解析返回的字符串 # 格式var hq_str_s_sh600519数据...; if var hq_str_ in raw_text: data_str raw_text.split()[1].rstrip(;) data_parts data_str.split(,) if len(data_parts) 30: return f接口返回数据格式异常无法解析。原始内容{raw_text[:200]} # 根据已知字段顺序解析 stock_name data_parts[0] open_price data_parts[1] prev_close data_parts[2] current_price data_parts[3] high_price data_parts[4] low_price data_parts[5] volume int(data_parts[8]) # 成交股数 amount float(data_parts[9]) # 成交金额 date data_parts[-3] time data_parts[-2] # 计算涨跌幅和涨跌额 try: current float(current_price) prev float(prev_close) change current - prev change_percent (change / prev) * 100 if prev ! 0 else 0 except ValueError: change change_percent None # 构建结构化的自然语言描述 result_lines [ f股票{stock_name} ({symbol}), f时间{date} {time}, f当前价{current_price} 元, f开盘价{open_price} 元, f昨收价{prev_close} 元, f最高价{high_price} 元, f最低价{low_price} 元, ] if change is not None: result_lines.append(f涨跌额{change:.2f} 元) result_lines.append(f涨跌幅{change_percent:.2f}%) result_lines.append(f成交量{volume:,} 股) result_lines.append(f成交额{amount:,.2f} 元) return \n.join(result_lines) else: return f接口未返回预期数据。响应{raw_text[:500]} except requests.exceptions.Timeout: return 请求股票数据接口超时请稍后重试。 except requests.exceptions.RequestException as e: return f网络请求失败{e} except Exception as e: return f处理数据时发生未知错误{e} async def main(): 运行 MCP 服务器标准输入输出模式 # 配置服务器通过 stdio 与客户端通信 server_params StdioServerParameters( commandsys.executable, # Python 解释器 args[__file__], # 运行此脚本本身 ) async with mcp.server.stdio.stdio_server(server_params) as (read_stream, write_stream): async with ClientSession(read_stream, write_stream) as session: await session.initialize( protocol_version1.0, client_info{name: stock-test-client, version: 0.1.0}, initialization_optionsInitializationOptions(), ) # 服务器开始处理请求 await server.run(session) if __name__ __main__: asyncio.run(main())3.2 关键代码解析服务器定义与工具声明server Server(stock-data-server)创建了一个 MCP 服务器实例。server.list_tools()装饰器标记了handle_list_tools函数该函数返回一个工具描述列表。这是 MCP 协议中“广告”工具的关键步骤。工具描述中inputSchema字段非常重要它用 JSON Schema 定义了工具的参数。AI 客户端会利用这个模式来理解如何调用工具。工具调用处理server.call_tool()装饰器标记了handle_call_tool函数它处理所有工具调用请求。函数根据name参数路由到具体的工具逻辑这里只有get_stock_quote。使用 Pydantic 模型StockQueryInput来验证和解析客户端传入的arguments确保参数格式正确。数据获取与格式化fetch_stock_data函数是业务核心它封装了 HTTP 请求、数据解析和错误处理。返回格式是纯文本{type: text, text: ...}这是 MCP 协议规定的标准格式之一。也可以返回结构化数据如 JSON但文本格式对于当前大多数 LLM 来说兼容性更好。我们将原始的、难以理解的逗号分隔字符串转换成了结构清晰、包含关键指标的自然语言段落。这极大地帮助了 LLM 理解数据并生成回答。通信模式此服务器使用stdio标准输入输出模式运行。这是 MCP 中最简单、最常见的模式客户端通过启动一个子进程并与之通信。这对于本地工具集成非常方便。3.3 运行与测试服务器在运行智能体客户端之前我们可以先单独测试服务器是否能正常工作。创建一个简单的测试脚本test_server.py#!/usr/bin/env python3 import asyncio import json import subprocess import sys from mcp import ClientSession async def test_stock_server(): # 启动 MCP 服务器进程 process await asyncio.create_subprocess_exec( sys.executable, server/stock_server.py, stdinsubprocess.PIPE, stdoutsubprocess.PIPE, stderrsubprocess.PIPE ) # 创建 MCP 客户端会话连接到该进程 async with ClientSession(process.stdout, process.stdin) as session: # 初始化会话 await session.initialize( protocol_version1.0, client_info{name: test-client, version: 0.1.0}, ) # 1. 列出可用工具 tools await session.list_tools() print( 可用工具 ) print(json.dumps(tools, indent2, ensure_asciiFalse)) # 2. 调用工具 print(\n 调用 get_stock_quote ) result await session.call_tool( get_stock_quote, arguments{symbol: sh600519} # 贵州茅台 ) for content in result: if content.type text: print(content.text) else: print(f其他类型内容: {content}) # 3. 关闭会话 await session.finalize() # 等待进程结束 await process.wait() if __name__ __main__: asyncio.run(test_stock_server())运行测试python test_server.py如果一切正常你将看到类似以下输出 可用工具 [ { name: get_stock_quote, description: 根据股票代码获取实时股票行情数据..., inputSchema: {...} } ] 调用 get_stock_quote 股票茅台 (sh600519) 时间2024-05-27 15:00:00 当前价1700.00 元 开盘价1700.00 元 昨收价1701.50 元 最高价1705.50 元 最低价1685.00 元 涨跌额-1.50 元 涨跌幅-0.09% 成交量1,095,500 股 成交额1,861,234,567.89 元这表明我们的 MCP 服务器已经成功运行并能正确提供工具和数据。4. 集成 MCP 服务器到智能体客户端现在我们需要一个能够利用此工具的智能体。我们将构建一个简单的、基于 OpenAI API或兼容 API的智能体客户端它集成我们的 MCP 服务器并能根据用户问题自动决定是否调用股票查询工具。4.1 智能体客户端实现创建client/agent_client.py文件。这个客户端将做以下几件事启动股票 MCP 服务器进程。连接到 OpenAI或类似的聊天补全 API。将 MCP 服务器的工具列表作为“函数”描述发送给模型。根据模型的回复决定是否执行工具调用并将结果返回给模型循环直至模型生成最终回答。#!/usr/bin/env python3 简单的智能体客户端集成股票 MCP 服务器。 import asyncio import json import subprocess import sys from typing import List, Dict, Any import openai # 或使用其他兼容库如 litellm from mcp import ClientSession, StdioServerParameters from mcp.client import stdio # 配置 OpenAI 客户端 (请替换为你的 API Key 和 Base URL) client openai.AsyncOpenAI( api_keyyour-api-key-here, # 请替换 base_urlhttps://api.openai.com/v1 # 或你的兼容 API 地址 ) async def run_mcp_server(): 启动并连接股票 MCP 服务器 # 配置服务器进程参数 server_params StdioServerParameters( commandsys.executable, args[../server/stock_server.py], # 指向服务器脚本 ) # 使用 stdio 模块建立连接 stdio_transport await stdio.create_stdio_connection(server_params) read_stream, write_stream stdio_transport session ClientSession(read_stream, write_stream) await session.initialize( protocol_version1.0, client_info{name: stock-agent-client, version: 0.1.0}, ) return session async def chat_with_agent(user_query: str, session: ClientSession) - str: 与集成了工具的 AI 模型进行对话 messages [ {role: system, content: 你是一个专业的股票分析助手。你可以使用工具来获取实时股票数据。请根据用户问题判断是否需要查询数据。如果需要请精确地调用工具。在给出最终答案时请结合工具返回的数据进行解释。}, {role: user, content: user_query} ] # 第一步从 MCP 服务器获取可用工具列表 tools_response await session.list_tools() # 将 MCP 工具格式转换为 OpenAI 函数调用格式 openai_tools [] for tool in tools_response.tools: openai_tools.append({ type: function, function: { name: tool.name, description: tool.description, parameters: tool.inputSchema } }) max_iterations 5 # 防止无限循环 for i in range(max_iterations): # 调用聊天补全 API传入工具描述 response await client.chat.completions.create( modelgpt-3.5-turbo, # 或 gpt-4, gpt-4-turbo 等 messagesmessages, toolsopenai_tools if openai_tools else None, tool_choiceauto, # 让模型决定是否调用工具 ) message response.choices[0].message messages.append(message) # 将模型的回复加入对话历史 # 检查模型是否想调用工具 if message.tool_calls: print(f[Agent] 决定调用工具: {[tc.function.name for tc in message.tool_calls]}) for tool_call in message.tool_calls: # 执行工具调用 tool_name tool_call.function.name tool_args json.loads(tool_call.function.arguments) print(f[Agent] 调用 {tool_name}参数: {tool_args}) result await session.call_tool(tool_name, tool_args) # 将工具执行结果作为一条新消息加入历史供模型参考 result_text \n.join([c.text for c in result if c.type text]) messages.append({ role: tool, tool_call_id: tool_call.id, content: result_text, }) print(f[Tool Result] {result_text[:200]}...) # 打印部分结果 # 继续循环让模型基于工具结果生成回答 else: # 模型生成了最终的文字回答 final_answer message.content print(f[Agent Final Answer] {final_answer}) return final_answer return 对话轮次过多可能陷入循环。 async def main(): 主函数启动服务器并与用户交互 print(正在启动股票数据 MCP 服务器并连接 AI 模型...) try: session await run_mcp_server() print(服务器连接成功。) # 示例对话 test_queries [ 贵州茅台现在的股价是多少, 告诉我 sh600519 今天的开盘价和成交量。, 比亚迪的股票代码是什么它的最新行情怎么样, # 这个可能无法直接回答因为我们工具需要代码 ] for query in test_queries: print(f\n{*50}) print(f[User] {query}) answer await chat_with_agent(query, session) print(f[Agent] {answer}) # 交互模式 (可选) # while True: # try: # user_input input(\n你: ) # if user_input.lower() in [exit, quit]: # break # answer await chat_with_agent(user_input, session) # print(f助手: {answer}) # except KeyboardInterrupt: # break await session.finalize() print(\n会话结束。) except Exception as e: print(f启动或运行过程中出错: {e}) import traceback traceback.print_exc() if __name__ __main__: # 注意需要先设置环境变量 OPENAI_API_KEY或在上方代码中配置 asyncio.run(main())4.2 客户端配置与运行安装 OpenAI 库pip install openai配置 API 密钥在代码中替换your-api-key-here为你的有效 API 密钥。如果你使用 Azure OpenAI 或其他兼容服务还需调整base_url和model参数。运行智能体客户端cd client python agent_client.py如果配置正确你将看到类似以下的输出展示了智能体思考、调用工具、整合结果并回答的过程正在启动股票数据 MCP 服务器并连接 AI 模型... 服务器连接成功。 [User] 贵州茅台现在的股价是多少 [Agent] 决定调用工具: [get_stock_quote] [Agent] 调用 get_stock_quote参数: {symbol: sh600519} [Tool Result] 股票茅台 (sh600519) 时间2024-05-27 15:00:00 当前价1700.00 元... [Agent Final Answer] 根据实时数据贵州茅台股票代码 sh600519的当前股价为 1700.00 元。数据更新时间为 2024-05-27 15:00:00。对于第三个问题“比亚迪的股票代码是什么”由于我们的工具get_stock_quote需要股票代码作为输入而模型自身知识库中可能知道比亚迪的代码是sz002594一个更高级的智能体可能会结合其他工具如搜索来先获取代码再查询行情。这展示了智能体编排多个工具的潜力。5. 常见问题排查与优化实践将 MCP 服务器集成到生产级智能体时会遇到各种问题。以下是典型问题的排查路径和优化建议。5.1 服务器启动与连接失败问题现象可能原因检查方式处理建议ModuleNotFoundError: No module named mcpPython 环境未安装mcp库或虚拟环境未激活。在终端执行 pip listgrep mcp。客户端报错Failed to initialize session服务器脚本路径错误或服务器进程启动失败。检查StdioServerParameters中的command和args路径。单独运行服务器脚本python stock_server.py看是否有语法错误。确保路径正确服务器脚本可独立运行无报错。连接超时或无响应服务器进程已启动但未按 MCP 协议输出初始化信息。查看服务器进程的 stderr 输出。在服务器代码开头添加日志print(Server starting..., filesys.stderr)。确保服务器使用了正确的mcp.server.stdio运行方式并且async def main()被正确调用。5.2 工具调用异常问题现象可能原因检查方式处理建议模型不调用工具1. 工具描述 (description,inputSchema) 不清晰。2. 系统提示词未引导模型使用工具。3. 模型能力不足。1. 检查list_tools返回的描述是否准确说明了工具功能和参数。2. 检查系统提示词是否包含“你可以使用工具”。3. 尝试更换更强大的模型如 GPT-4。优化工具描述使其更贴近自然语言问题。在系统提示中明确鼓励使用工具。工具调用参数错误模型生成的参数不符合inputSchema。在handle_call_tool中打印arguments查看模型实际传递了什么。确保inputSchema定义清晰特别是description字段要说明参数格式如sh600519。可以在提示词中举例。工具返回结果后模型回答不佳工具返回的数据格式混乱模型难以理解。检查fetch_stock_data返回的文本是否清晰、结构化。将原始 API 数据转换为更友好、带明确标签的文本或 JSON。避免返回冗长、未解析的原始字符串。5.3 性能与稳定性优化增加缓存股票数据在短时间内变化不大频繁调用外部 API 可能导致限流。可以在 MCP 服务器内为fetch_stock_data函数增加一个内存缓存如functools.lru_cache缓存 10-30 秒。from functools import lru_cache import asyncio from datetime import datetime, timedelta class DataCache: def __init__(self, ttl_seconds30): self.ttl ttl_seconds self.cache {} self.timestamps {} async def get(self, key, fetch_func): now datetime.now() if key in self.cache and (now - self.timestamps[key]).seconds self.ttl: return self.cache[key] data await fetch_func(key) self.cache[key] data self.timestamps[key] now return data cache DataCache(ttl_seconds30) # 在 handle_call_tool 中调用data await cache.get(symbol, fetch_stock_data)完善错误处理当前示例已包含基础网络超时和解析错误处理。生产环境需要更细粒度的错误码和重试机制并将友好的错误信息返回给模型例如“网络暂时不可用请稍后再试”或“股票代码不存在”。超时控制在handle_call_tool中使用asyncio.wait_for为工具调用设置超时防止某个工具挂起导致整个智能体阻塞。try: result await asyncio.wait_for(call_tool_function(arguments), timeout15.0) except asyncio.TimeoutError: return [{type: text, text: 工具调用超时请稍后重试。}]日志记录添加详细的日志记录如使用logging模块记录工具调用请求、参数、响应时间、错误信息等便于后期监控和调试。6. 扩展方向与最佳实践6.1 扩展更多工具一个成熟的智能体需要多种工具。你可以遵循相同的模式创建更多的 MCP 服务器新闻搜索服务器调用新闻 API返回与查询相关的新闻摘要。数据库查询服务器连接公司内部数据库查询销售数据、用户信息等。代码执行服务器在安全沙箱中执行 Python 代码片段用于计算或数据分析。文件操作服务器读取指定目录下的文档如 PDF、Markdown为模型提供项目上下文。6.2 使用现有 MCP 服务器生态无需从零开始构建所有工具。社区已经有许多开源的 MCP 服务器文件系统modelcontextprotocol/server-filesystemGitmodelcontextprotocol/server-gitSQL 数据库modelcontextprotocol/server-sqlite网络搜索modelcontextprotocol/server-duckduckgo你可以直接运行这些服务器并通过 Claude Desktop 等客户端加载快速扩展智能体的能力。6.3 生产环境部署建议安全性工具权限隔离不同的 MCP 服务器应运行在具有最小必要权限的用户或容器中。文件系统服务器不应有权限访问敏感目录。输入验证与净化对所有来自模型调用的参数进行严格验证防止注入攻击如 SQL 注入、命令注入。访问控制在客户端层面可以根据用户角色动态加载不同的 MCP 服务器集合。可观测性为每个工具调用记录详细的审计日志谁、何时、调用什么、参数、结果、耗时。集成监控和告警当工具调用失败率或延迟超过阈值时发出通知。性能对于耗时的工具如复杂数据查询考虑实现异步调用或提供进度反馈。使用连接池管理数据库或外部服务连接。对结果进行适当的压缩或摘要以减少返回给模型的令牌数降低成本并提高速度。提示词工程系统提示词需要精心设计明确说明可用工具的用途和限制引导模型在不确定时主动询问用户澄清而不是猜测。对于返回大量数据的工具可以指导模型“先总结关键点再根据用户要求提供细节”。通过 MCP 协议我们为 AI 模型构建了一个可扩展、标准化的“开卷考”环境。它将模型强大的推理和语言能力与外部系统准确、实时、动态的数据和能力结合起来有效抑制了幻觉并开启了构建复杂、可靠智能体应用的大门。从简单的股票查询到复杂的企业工作流自动化MCP 提供了一条清晰、模块化的路径。开始构建你的第一个 MCP 服务器是迈向生产级 AI 应用的关键一步。
返回列表