Cline与大模型的交互协议(内涵Agent实现原理)

MCP协议

MCP只规定了MCP Host与MCP Server之间的沟通协议,并没有对大模型的输入和输出格式提出要求;因此不同的MCP Host就可能会用不同的格式来与大模型进行沟通;比如Cline就是用的xml。

MCP与大模型的沟通方式?

配置中转服务器

  1. 中转服务器代码

    python 复制代码
    import httpx
    from fastapi import FastAPI, Request
    from starlette.responses import StreamingResponse
    
    
    class AppLogger:
        def __init__(self, log_file="llm.log"):
            """Initialize the logger with a file that will cleard on startup."""
            self.log_file = log_file
            # Clear the log file on startup
            with open(self.log_file, "w", encoding="utf-8") as f:
                f.write("")
    
        def log(self, message: str):
            """Log a message to both file and console."""
    
            # Log to file
            with open(self.log_file, "a", encoding="utf-8") as f:
                f.write(message + "\n")
    
            # Log to console
            print(message)
    
    
    app = FastAPI()
    logger = AppLogger("llm.log")
    
    # DeepSeek API 配置
    DEEPSEEK_API_URL = "https://api.deepseek.com/v1/chat/completions"
    
    
    @app.post("/chat/completions")
    async def proxy_request(request: Request):
        
        body_bytes = await request.body()
        body_str = body_bytes.decode("utf-8")
        logger.log(f"模型请求:{body_str}")
        body = await request.json()
    
        logger.log("模型返回:\n")
    
        async def event_stream():
            async with httpx.AsyncClient() as client:
                async with client.stream(
                    "POST",
                    DEEPSEEK_API_URL,
                    json=body,
                    headers={
                        "Content-Type": "application/json",
                        "Accept": "text/event-stream",
                        "Authorization": request.headers.get("Authorization", ""),
                    },
                ) as response:
                    async for line in response.aiter_lines():
                        logger.log(line)
                        yield f"{line}\n"
    
        return StreamingResponse(event_stream(), media_type="text/event-stream")
    
    
    if __name__ == "__main__":
        import uvicorn
    
        uvicorn.run(app, host="0.0.0.0", port=8000)
  2. 中转服务器的cline配置

    • API Provider: OpenAI Compatible
    • Base URL: http://localhost:8000
    • OpenAI Compatible API Key: apikey
    • Model ID: deepseek-chat

解读简单场景下Cline发往模型的请求

  1. cline发送给大模型的工具中包含两种,一种是cline的内置工具:写入文件、替换文件内容、读取文件、运行终端命令;另一种是MCP工具:天气预告、气象预警等
  2. cline规定了工具调用请求必须要使用XML格式传递,外面是工具名称,里面是参数值
  3. 只要是模型按照Cline规定的这种XML格式返回,Cline就可以帮助模型调用各种他想要调用的工具
  4. use_mcp_tool: 请求连接使用MCP服务提供的工具,每个MCP服务器可以提供具有不同功能的多个工具,
    • server_name: MCP服务器的名称
    • tool_name: 要执行的工具名称
    • arguments: json对象,工具的参数
  5. 如果调用工具之后,模型拿到的结果不是想要的,还会继续调用其他工具,知道拿到满意的结果为止

解读简单场景下模型发往Cline的返回

  1. 模型采用的是SSE的方式逐量返回的,在SSE的返回结果里面,如果某一样以:开头返回结果的话,这一样就是注释,在SSE中注释的主要作用是保持连接,避免我们的客户端(中转服务器)因超时而断开连接

  2. 大模型返回的内容

    json 复制代码
    {"id":"7df94a6a-ef32-4db2-aca0-e71876a63d1a","object":"chat.completion.chunk","created":1775277255,"model":"deepseek-chat","system_fingerprint":"fp_eaab8d114b_prod0820_fp8_kvcache_new_kvcache","choices":[{"index":0,"delta":{"content":" the"},"logprobs":null,"finish_reason":null}],"usage":null}

    流式返回的响应中将content拼接到一起,就是模型整体返回给我们的内容。

  3. Cline调用一个MCP工具,查看日志记录

  • 第一部分是标签

  • 第二部分是:

    xml 复制代码
    <use_mcp_tool>
        <server_name></server_name>
        <tool_calls></tool_calls>
        <arguments>
            {
            	"latitude": 40.7128,
            	"longitude": -74.0060
            }
        </arguments>
    </use_mcp_tool>标签
  1. LLM大模型有没有记忆?
    • 模型本身没有记忆:大语言模型(LLM)本质上是无状态的函数,它每次处理你的请求时,都是独立计算的,不记得你刚才说的是什么
    • 你需要手动管理上下文:如果你希望Agent有"记忆",就必须每次调用模型时,把之前的对话历史、关键信息、任务状态等重新放进这次请求的消息列表里。

解构本质:Cline的XML协议与ReAct的关系

  1. 模型整个思考调用过程

  2. 什么事ReAct: 思考-行动-观察(Thought、Action、Observation)

  3. 什么是Agent: 持续思考、持续调用外部工具、直至解决用户问题的一个程序

  4. Cline本质上就是一个Agent,也是根据ReAct的思想来构建他的Agent的流程的

  5. 提问,ReAct也是Cline这种XML格式来与模型沟通的嘛?

    当然不是了,XML知识数据传输的一个格式而已,ReAct呢,是一个思想,它并不跟某个格式绑定,ReAct的精髓在于我们前面提到的Thought、Action、Observation

  6. ReAct(Reasoning + Acting)思想由普林斯顿大学和谷歌研究院 的研究团队在 2022 年合作提出,核心思想:通过让语言模型交替生成推理轨迹(Thought)和任务特定操作(Action),在接收外部反馈(Observation),形成一个"思考-行动-观察"的闭环,从而协同发挥模型的推理能力与外部交互的能力。

  7. 这也是现在很多AI Agent(如:LangChain、AutoGPT等)底层范式的重要理论基础

  8. ReaCt当初在论文刚被提出时,是通过文本进行交互的,Thought、Action、Observation

  9. 如果想与模型以这种文本格式进行交互,我们需要给提供一个System Prompt提示词。

    text 复制代码
    你需要解决一个任务。为此,你需要将任务分解为多个步骤。对于每个步骤,首先使用 Thought: 思考要做什么,然后使用可用工具之一决定一个 Action:。接着,你将根据你的行动从环境/工具中收到一个 Observation:。持续这个思考和行动的过程,直到你有足够的信息来提供 FinalAnswer:。
    
    这里有一些例子:
    
    示例 1:
    
    Question: 埃菲尔铁塔有多高? Thought: 我需要找到埃菲尔铁塔的高度。可以使用搜索工具。 Action: get_height("埃菲尔铁塔") Observation: 埃菲尔铁塔的高度约为330米(包含天线)。 Thought: 搜索结果显示了高度。我已经得到答案了。 FinalAnswer: 埃菲尔铁塔的高度约为330米。
    
    示例 2:
    
    Question: 帮我找一个简单的番茄炒蛋食谱,并看看家里的冰箱里有没有西红柿。 Thought: 这个任务分两步。第一步,找到番茄炒蛋的食谱。第二步,检查冰箱里是否有西红柿。我先用 find_recipe 工具找食谱。 Action: find_recipe(dish="番茄炒蛋") Observation: 简单的番茄炒蛋食谱:将2个鸡蛋打散,2个番茄切块。热油,先炒鸡蛋,盛出。再热油,炒番茄至软烂,加入鸡蛋,放盐调味即可。 Thought: 好的,我已经有食谱了。食谱需要西红柿。现在我需要用 check_fridge 工具看看冰箱里有没有西红柿。 Action: check_fridge(item="西红柿") Observation: 冰箱检查结果:有3个西红柿。 Thought: 我找到了食谱,并且确认了冰箱里有西红柿。可以回答问题了。 FinalAnswer: 简单的番茄炒蛋食谱是:鸡蛋打散,番茄切块。先炒鸡蛋,再炒番茄,混合后加盐调味。冰箱里有3个西红柿。
    
    请严格遵守:
    
    输出Action后立即停止生成
    等待返回真实的Observation
    擅自生成Observation将导致错误
    本次任务可用工具:
    
    get_forecast(latitude, longitude): 获取指定坐标的天气预报。返回包含预报信息的字符串。
    write_to_file(filename, content): 将指定内容写入指定文件。成功时返回 "写入成功"。
  10. 自己写Agent时,与模型的交互格式可以自定义,如Thought-Action-Observation、XML、JSON等,只要这个格式本质上使用的是ReAct的模式,那都是可以的

  11. 所以做一个类似Cline这样的Agent需要什么呢?

    • 首先我们要告诉模型需要返回结果的格式
    • 其次我们需要告诉模型可用的工具列表
    • 最后我们要告诉模型,一定要使用ReAct模式

    把这些要求写到System Prompt里面 + 用户问(Question)作为触发,真个Agent就可以跑起来了。

相关推荐
Old Uncle Tom5 小时前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
深海鱼在掘金5 小时前
深入浅出 LangChain —— 第三章:模型抽象层
人工智能·langchain·agent
KaneLogger6 小时前
三省六部 Agent 这条路不通
agent·ai编程
薛定谔的猫3697 小时前
LLM Agents: 从大语言模型到自主智能体的演进与架构解析
ai·llm·agent·machine learning·architecture
Cder12 小时前
用 React + Ink 在终端里「优雅搜索」:开源 CLI 设计与非交互模式实践
前端·agent
熊猫钓鱼>_>12 小时前
当“虾”遇上“马”:QClaw 融合 Hermes 背后的智能体进化论
人工智能·ai·腾讯云·agent·openclaw·qclaw·hermes
DigitalOcean13 小时前
DigitalOcean 打造 AI 原生云,帮助 AI 应用大幅降低成本与运维复杂度
llm·agent
后端小肥肠13 小时前
我把AI童装带货做成了一个Skill,一句话就能出视频
人工智能·aigc·agent
熊猫钓鱼>_>14 小时前
大型复杂远程AI Agent应用:从架构困局到进化突围
人工智能·ai·架构·开源·大模型·llm·agent
想ai抽16 小时前
Agent记忆架构设计剖析系列:原理、权衡与场景适配(claude code设计原理)
agent·claudecode·harness