好的,这是一个非常棒的问题!AI、RAG、MCP、Agents 是当前人工智能领域,尤其是应用层最热门和关联最紧密的几个概念。它们之间不是相互割裂的,而是一种层层递进、相互增强的关系。

我们可以用一个简单的比喻来理解:

  • AI(大脑): 就像一个博学但记忆模糊、没有手脚的“天才”。它有能力思考和推理,但知识可能过时,也无法行动。

  • RAG(参考资料库 + 记忆增强): 给这个“天才”一个接入最新、准确、特定领域资料库的能力。当它回答问题前,会先去查资料,确保答案的准确性和时效性。

  • MCP(工具和技能包): 给这个“天才”配备了一套“瑞士军刀”或“技能工具箱”,让它能使用外部工具,比如计算器、搜索引擎、数据库、API等,从而执行具体任务。

  • Agent(具备自主性的个体): 将以上三者整合起来,形成一个可以自主感知、规划、决策和行动的“智能体”。它知道何时使用大脑(AI)思考,何时去查资料(RAG),何时调用工具(MCP)来达成一个复杂的目标。

Agents智能体知识体系

下面我们来详细拆解它们各自是什么,以及它们之间的关系。

1. 核心概念定义

  • AI: 这里通常指大语言模型,是整个技术栈的核心“引擎”。它提供了最基础的理解、生成、推理和对话能力。例如 GPT、Llama、Claude 等。

  • RAG: 检索增强生成。一种技术架构,用于解决大模型的“幻觉”、知识陈旧和缺乏领域知识的问题。其工作流程是:

    1. 检索: 当用户提出问题时,先从外部知识库(如公司文档、数据库、网页)中查找最相关的信息。

    2. 增强: 将这些检索到的相关信息作为上下文,和用户的问题一起提供给大模型。

    3. 生成: 大模型基于这些准确的上下文信息来生成最终答案。

  • MCP: 模型上下文协议。这是一个由 Anthropic 提出的开放协议,旨在标准化LLM与外部工具和数据的连接方式。你可以把它理解为LLM世界的 “USB-C标准” 。它定义了一套规范,让开发者可以轻松地为LLM创建和连接各种“工具”(如搜索、执行代码、访问数据库等),而无需关心底层模型是什么。

  • Agents: 智能体。一个能够感知环境、进行规划、并执行一系列动作来达成特定目标的系统。一个真正的Agent具备自主性工具使用能力。它的典型思考循环是:

    • 思考: 分析当前情况和目标。

    • 规划: 决定下一步该做什么,可能需要分解任务。

    • 行动: 执行一个动作,比如调用一个工具(RAG检索或MCP工具)。

    • 观察: 获取行动的结果,并基于此进行下一轮思考,直到任务完成。

2. 它们之间的关系

这四者共同构成了构建下一代AI应用的核心技术栈,关系如下图所示:

AI 是基础

一切的基础。没有强大的大语言模型,后续的RAG、MCP和Agents都无从谈起。它提供了最核心的认知能力。

RAG 和 MCP 是AI的“增强组件”

它们从不同维度扩展和增强了基础AI模型的能力:

  • RAG 增强的是“知识”和“记忆”。它让AI的回答更准确、更专业、更及时。

  • MCP 增强的是“行动”和“能力”。它让AI能够与世界互动,执行具体操作。

RAG 和 MCP 可以独立使用,也可以协同工作。 一个Agent可以先用RAG从公司知识库检索信息,再用MCP工具调用API将信息录入系统。

Agents 是集大成者的“终极形态”

Agent是一个更高层次的概念,它将AI的推理能力、RAG的知识获取能力和MCP的工具使用能力整合到一个自主的系统中

  • 一个简单的、只会回答问题的聊天机器人不是Agent。

  • 一个能够“思考”:“用户想订机票,我需要先通过RAG查询公司的差旅政策,然后用MCP工具搜索航班,最后再调用另一个MCP工具完成预订” 的系统,就是一个Agent

3. 实际应用场景示例

场景:公司内部的“智能财务助手Agent”

  1. 用户提问: “帮我为下周三去北京的商务旅行预订一张经济舱机票,预算不超过5000元。”

  2. Agent的思考与行动流程:

    • 步骤1(规划): Agent(利用AI进行推理)认为需要先确认公司差旅政策。

    • 步骤2(行动 - RAG): 调用RAG功能,在公司内部财务制度文档中检索“差旅标准”、“北京”、“机票”等相关规定。RAG返回信息:“前往北京的经济舱机票标准为5500元。”

    • 步骤3(规划): Agent判断用户预算(5000元)低于公司标准(5500元),需要寻找特价票。

    • 步骤4(行动 - MCP): 调用MCP工具集中的“航班搜索工具”,输入条件:目的地北京、下周三、经济舱。工具返回航班列表和价格。

    • 步骤5(规划与行动): Agent发现有一个4800元的航班符合要求。然后它调用另一个MCP工具——“预订工具”,并传入航班信息,完成预订。

    • 步骤6(回复): Agent向用户回复:“已根据您的预算(5000元内)和公司差旅标准,为您预订了XX航空下周三XX点的经济舱机票,价格4800元。预订详情已发送至您的邮箱。”

在这个例子中,AI是大脑,RAG提供了准确的内部知识,MCP提供了搜索和预订的工具,而Agent则是那个统筹一切、自主完成整个复杂任务的“助理”。

总结

  • AI 是发动机。

  • RAG 是导航和地图(提供信息)。

  • MCP 是工具箱和扩展接口(提供能力)。

  • Agent 是能够自己开车、看地图、用工具,最终把你从A点带到B点的自动驾驶汽车

它们共同构成了构建强大、可靠、实用的下一代人工智能应用的技术基石。

智能机票预订Agent DEMO 设计

下面我来为你设计一个完整的机票预订Agent Demo示例,展示如何整合AI、RAG、MCP来构建一个智能机票预订系统。

系统架构设计

1. 核心组件准备

A. RAG系统 - 公司差旅政策知识库

数据准备 (company_policy.json):

{
  "travel_policy": {
    "flight_standards": {
      "beijing": {"economy": 5500, "business": 12000},
      "shanghai": {"economy": 5000, "business": 11000},
      "guangzhou": {"economy": 4500, "business": 10000}
    },
    "approval_required": {
      "domestic": 10000,
      "international": 20000
    },
    "preferred_airlines": ["中国国航", "东方航空", "南方航空"],
    "advance_booking": "国内航班需提前3天预订"
  }
}

RAG实现代码:

import chromadb
from sentence_transformers import SentenceTransformer
import json

class TravelPolicyRAG:
    def __init__(self):
        self.client = chromadb.Client()
        self.collection = self.client.create_collection("travel_policy")
        self.embedder = SentenceTransformer('BAAI/bge-small-zh')
        
        # 初始化知识库
        self._initialize_knowledge_base()
    
    def _initialize_knowledge_base(self):
        with open('company_policy.json', 'r', encoding='utf-8') as f:
            policy = json.load(f)
        
        documents = []
        metadatas = []
        ids = []
        
        # 扁平化政策数据
        def flatten_dict(d, prefix=""):
            items = []
            for k, v in d.items():
                if isinstance(v, dict):
                    items.extend(flatten_dict(v, f"{prefix}{k}."))
                else:
                    items.append((f"{prefix}{k}", str(v)))
            return items
        
        flat_items = flatten_dict(policy)
        for i, (key, value) in enumerate(flat_items):
            documents.append(f"{key}: {value}")
            metadatas.append({"type": "policy", "key": key})
            ids.append(f"policy_{i}")
        
        # 添加嵌入到向量数据库
        embeddings = self.embedder.encode(documents).tolist()
        self.collection.add(
            embeddings=embeddings,
            documents=documents,
            metadatas=metadatas,
            ids=ids
        )
    
    def query_policy(self, question: str) -> str:
        """查询差旅政策"""
        query_embedding = self.embedder.encode([question]).tolist()[0]
        
        results = self.collection.query(
            query_embeddings=[query_embedding],
            n_results=3
        )
        
        if results['documents']:
            return "\n".join(results['documents'][0])
        return "未找到相关政策信息"
B. MCP工具 - 航班搜索和预订

MCP服务器实现 (flight_mcp_server.py):

import json
import asyncio
from mcp import MCPServer, types

class FlightMCPServer:
    def __init__(self):
        self.server = MCPServer("flight-tools")
        
        # 模拟航班数据
        self.flight_data = {
            "北京": [
                {"flight_no": "CA1234", "airline": "中国国航", "departure": "09:00", 
                 "price": 4800, "seats": 5, "class": "economy"},
                {"flight_no": "MU5678", "airline": "东方航空", "departure": "14:30",
                 "price": 5200, "seats": 3, "class": "economy"}
            ],
            "上海": [
                {"flight_no": "CZ9012", "airline": "南方航空", "departure": "10:15",
                 "price": 4500, "seats": 8, "class": "economy"}
            ]
        }
        
        self._register_tools()
    
    def _register_tools(self):
        @self.server.tool()
        async def search_flights(destination: str, date: str, max_price: int = None) -> str:
            """搜索航班信息
            
            Args:
                destination: 目的地城市
                date: 出行日期 (YYYY-MM-DD)
                max_price: 最高价格限制
            """
            if destination not in self.flight_data:
                return f"未找到到{destination}的航班"
            
            flights = self.flight_data[destination]
            if max_price:
                flights = [f for f in flights if f['price'] <= max_price]
            
            if not flights:
                return "没有符合条件的航班"
            
            result = [f"找到 {len(flights)} 个到{destination}的航班:"]
            for flight in flights:
                result.append(
                    f"- {flight['flight_no']} {flight['airline']} "
                    f"{flight['departure']} ¥{flight['price']} "
                    f"余票:{flight['seats']}"
                )
            
            return "\n".join(result)
        
        @self.server.tool()
        async def book_flight(flight_no: str, passenger_name: str, passenger_id: str) -> str:
            """预订航班
            
            Args:
                flight_no: 航班号
                passenger_name: 乘客姓名
                passenger_id: 身份证号
            """
            # 在实际系统中这里会调用航空公司API
            for city_flights in self.flight_data.values():
                for flight in city_flights:
                    if flight['flight_no'] == flight_no:
                        if flight['seats'] > 0:
                            flight['seats'] -= 1
                            booking_ref = f"BK{flight_no}{passenger_id[-4:]}"
                            return (f"预订成功! 航班: {flight_no}\n"
                                   f"乘客: {passenger_name}\n"
                                   f"预订号: {booking_ref}\n"
                                   f"状态: 已确认")
                        else:
                            return "抱歉,该航班已无余票"
            
            return "未找到指定航班"
        
        @self.server.tool()
        async def get_weather(destination: str, date: str) -> str:
            """获取目的地天气信息"""
            # 模拟天气数据
            weather_data = {
                "北京": "晴朗,15-25°C,适宜出行",
                "上海": "多云,18-28°C,适宜出行", 
                "广州": "阵雨,22-30°C,建议带伞"
            }
            return weather_data.get(destination, "天气信息暂不可用")

    async def run(self):
        await self.server.run()
C. AI Agent - 智能决策核心

Agent实现 (flight_agent.py):

from openai import OpenAI
import json
import re

class FlightBookingAgent:
    def __init__(self, api_key: str):
        self.client = OpenAI(api_key=api_key)
        self.rag = TravelPolicyRAG()
        self.available_tools = {
            "search_flights": "搜索航班信息",
            "book_flight": "预订指定航班", 
            "get_weather": "获取目的地天气",
            "query_policy": "查询公司差旅政策"
        }
    
    def _extract_tool_call(self, response: str) -> dict:
        """从AI响应中提取工具调用信息"""
        tool_pattern = r'【(\w+)】:\s*(.+)'
        match = re.search(tool_pattern, response)
        if match:
            return {"tool": match.group(1), "params": match.group(2)}
        return None
    
    def _parse_tool_params(self, tool_name: str, params_str: str) -> dict:
        """解析工具参数"""
        if tool_name == "search_flights":
            # 解析 "北京, 2024-01-15, 5000" 这样的参数
            parts = [p.strip() for p in params_str.split(",")]
            return {
                "destination": parts[0],
                "date": parts[1] if len(parts) > 1 else None,
                "max_price": int(parts[2]) if len(parts) > 2 else None
            }
        elif tool_name == "book_flight":
            parts = [p.strip() for p in params_str.split(",")]
            return {
                "flight_no": parts[0],
                "passenger_name": parts[1] if len(parts) > 1 else "张三",
                "passenger_id": parts[2] if len(parts) > 2 else "110101199001011234"
            }
        elif tool_name == "get_weather":
            parts = [p.strip() for p in params_str.split(",")]
            return {
                "destination": parts[0],
                "date": parts[1] if len(parts) > 1 else None
            }
        return {"query": params_str}
    
    def process_request(self, user_request: str) -> str:
        """处理用户请求"""
        print(f"用户请求: {user_request}")
        
        # 步骤1: 规划决策
        planning_prompt = f"""
        你是一个机票预订助手。用户请求: {user_request}
        
        可用工具:
        - query_policy: 查询公司差旅政策
        - search_flights: 搜索航班 (参数: 目的地,日期,最高价格)
        - book_flight: 预订航班 (参数: 航班号,乘客姓名,身份证号)  
        - get_weather: 获取天气信息 (参数: 目的地,日期)
        
        请分析需要按什么顺序调用哪些工具,用【工具名】: 参数 的格式回答。
        示例: 【query_policy】: 北京差旅标准
        """
        
        planning_response = self.client.chat.completions.create(
            model="gpt-4",
            messages=[{"role": "user", "content": planning_prompt}],
            temperature=0
        )
        
        plan = planning_response.choices[0].message.content
        print(f"执行计划: {plan}")
        
        # 步骤2: 执行工具调用
        final_result = []
        lines = plan.split('\n')
        
        for line in lines:
            tool_call = self._extract_tool_call(line)
            if tool_call:
                tool_name = tool_call["tool"]
                params = self._parse_tool_params(tool_name, tool_call["params"])
                
                print(f"执行工具: {tool_name} 参数: {params}")
                
                # 执行相应的工具
                if tool_name == "query_policy":
                    result = self.rag.query_policy(params.get("query", ""))
                elif tool_name in ["search_flights", "book_flight", "get_weather"]:
                    # 这里应该调用MCP客户端来执行工具
                    result = self._call_mcp_tool(tool_name, params)
                else:
                    result = f"未知工具: {tool_name}"
                
                final_result.append(f"{tool_name}结果: {result}")
                print(f"工具结果: {result}")
        
        # 步骤3: 生成最终回复
        if final_result:
            summary_prompt = f"""
            用户原始请求: {user_request}
            
            执行结果:
            {chr(10).join(final_result)}
            
            请根据以上信息给用户一个完整、友好的回复。
            """
            
            summary_response = self.client.chat.completions.create(
                model="gpt-4",
                messages=[{"role": "user", "content": summary_prompt}],
                temperature=0.7
            )
            
            return summary_response.choices[0].message.content
        else:
            return "未能处理您的请求"
    
    def _call_mcp_tool(self, tool_name: str, params: dict) -> str:
        """模拟调用MCP工具"""
        # 在实际实现中,这里会通过MCP客户端调用远程工具
        if tool_name == "search_flights":
            return f"模拟搜索: 到{params['destination']}的航班 (实际会调用MCP)"
        elif tool_name == "book_flight":
            return f"模拟预订: 航班{params['flight_no']} (实际会调用MCP)"
        elif tool_name == "get_weather":
            return f"模拟天气: {params['destination']}天气良好"
        return "工具调用失败"

2. 完整工作流演示

# 主程序
def main():
    # 初始化Agent (需要设置你的OpenAI API Key)
    agent = FlightBookingAgent(api_key="your-openai-api-key")
    
    # 示例用户请求
    user_requests = [
        "帮我预订下周三去北京的经济舱机票,预算不超过5000元",
        "查询一下公司去上海的差旅政策,然后看看有没有明天下午的航班",
        "我要去广州出差,先看看政策标准,再查查天气和航班"
    ]
    
    for request in user_requests:
        print("\n" + "="*50)
        print(f"处理请求: {request}")
        print("="*50)
        
        result = agent.process_request(request)
        print(f"\n最终回复:\n{result}")

if __name__ == "__main__":
    main()

3. 预期执行流程对于请求"帮我预订下周三去北京的经济舱机票,预算不超过5000元":

  • Agent规划:

  • 工具执行:

    • RAG返回: flight_standards.beijing.economy: 5500

    • MCP搜索返回航班列表

    • MCP返回天气信息

  • 最终回复:

4. 进阶功能扩展

多步骤对话Agent:

class ConversationalFlightAgent(FlightBookingAgent):
    def __init__(self, api_key: str):
        super().__init__(api_key)
        self.conversation_history = []
    
    def chat(self, user_message: str) -> str:
        self.conversation_history.append({"role": "user", "content": user_message})
        
        # 基于对话历史进行决策
        response = self.process_request_with_history(user_message)
        
        self.conversation_history.append({"role": "assistant", "content": response})
        return response

这个Demo展示了如何将:

  • AI (GPT-4) 作为决策大脑

  • RAG (公司政策查询) 提供专业知识

  • MCP (航班搜索/预订工具) 执行具体操作

  • Agent 整合所有组件,实现智能工作流

在实际部署时,你需要:

  1. 配置真实的OpenAI API密钥

  2. 部署MCP服务器并建立客户端连接

  3. 使用真实的航班API替换模拟数据

  4. 添加错误处理和重试机制

  5. 实现用户会话管理

这个架构具有很强的扩展性,可以轻松添加酒店预订、报销申请等其他商务旅行相关功能。

5. 完整可运行示例

# requirements.txt
# openai
# chromadb
# python-dotenv

import openai
import chromadb
import json
import os
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

class TravelPolicyRAG:
    def __init__(self):
        self.client = chromadb.Client()
        self.collection = self.client.create_collection("travel_policy")
        openai.api_key = os.getenv("OPENAI_API_KEY")
        
        self._initialize_knowledge_base()
    
    def _get_embedding(self, text: str) -> list:
        """使用OpenAI API获取文本嵌入"""
        try:
            response = openai.embeddings.create(
                input=text,
                model="text-embedding-3-small"
            )
            return response.data[0].embedding
        except Exception as e:
            print(f"获取嵌入时出错: {e}")
            return [0.1] * 1536  # text-embedding-3-small的维度
    
    def _initialize_knowledge_base(self):
        # 创建示例政策数据
        policy = {
            "travel_policy": {
                "flight_standards": {
                    "beijing": {"economy": 5500, "business": 12000},
                    "shanghai": {"economy": 5000, "business": 11000},
                    "guangzhou": {"economy": 4500, "business": 10000}
                },
                "approval_required": {
                    "domestic": 10000,
                    "international": 20000
                },
                "preferred_airlines": ["中国国航", "东方航空", "南方航空"],
                "advance_booking": "国内航班需提前3天预订"
            }
        }
        
        documents = []
        metadatas = []
        ids = []
        
        def flatten_dict(d, prefix=""):
            items = []
            for k, v in d.items():
                if isinstance(v, dict):
                    items.extend(flatten_dict(v, f"{prefix}{k}."))
                else:
                    items.append((f"{prefix}{k}", str(v)))
            return items
        
        flat_items = flatten_dict(policy)
        for i, (key, value) in enumerate(flat_items):
            doc_text = f"{key}: {value}"
            documents.append(doc_text)
            metadatas.append({"type": "policy", "key": key})
            ids.append(f"policy_{i}")
        
        # 批量获取嵌入
        embeddings = []
        for doc in documents:
            embedding = self._get_embedding(doc)
            embeddings.append(embedding)
        
        # 添加到向量数据库
        self.collection.add(
            embeddings=embeddings,
            documents=documents,
            metadatas=metadatas,
            ids=ids
        )
        print("知识库初始化完成!")
    
    def query_policy(self, question: str) -> str:
        """查询差旅政策"""
        query_embedding = self._get_embedding(question)
        
        results = self.collection.query(
            query_embeddings=[query_embedding],
            n_results=3
        )
        
        if results['documents']:
            return "\n".join(results['documents'][0])
        return "未找到相关政策信息"

# 测试
if __name__ == "__main__":
    # 确保设置了 OPENAI_API_KEY 环境变量
    rag = TravelPolicyRAG()
    
    test_questions = [
        "去北京的差旅标准是多少?",
        "经济舱的报销标准",
        "需要提前多久预订机票?"
    ]
    
    for question in test_questions:
        print(f"问题: {question}")
        answer = rag.query_policy(question)
        print(f"回答: {answer}\n")

环境配置

创建 .env 文件:

env

OPENAI_API_KEY=你的OpenAI_API密钥

安装依赖:

bash

pip install openai chromadb python-dotenv

推荐使用方案(OpenAI API),因为它:

  • 最稳定可靠

  • 无需处理本地模型依赖

  • 性能优秀

  • 适合Demo和原型开发

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐