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就可以跑起来了。

相关推荐
冬奇Lab5 小时前
5种来自谷歌的Agent Skill设计模式:减少Token浪费,精准触发正确行为
人工智能·agent
竹之却8 小时前
【Agent-阿程】OpenClaw 2026.4.1 版本更新与使用体验
agent·openclaw
View121389 小时前
在 .NET 中使用 Moonshot Kimi + AgentFramework:从 SDK 到 Agent 的完整实践
c#·agent·kimi
flytam9 小时前
Claude Agent SDK 深度入门指南
前端·aigc·agent
jerrywus10 小时前
AI 写代码总翻车?我用 Harness:developer 把它管成“右侧打工人”
前端·agent·claude
行者无疆_ty11 小时前
小龙虾(OpenClaw)安装教程
人工智能·agent·openclaw·小龙虾
HIT_Weston12 小时前
39、【Agent】【OpenCode】本地代理分析(三)
人工智能·agent·opencode
LucaJu12 小时前
一、先了解:MCP 公开服务市场
agent·智能体·spring ai·mcp·spring ai alibaba
张永清12 小时前
深度解析Claude Code 51万行源码背后的设计实现
ai·大模型·agent·claude code