Python调用大型模型LLM实现mcp服务的实例代码展示

开启mcp服务,这里以网页抓取为例

npx -y supergateway –stdio "uvx mcp-server-fetch"

python代码

import asyncio

import os

from openai import AsyncOpenAI

from mcp.client.sse import sse_client

from mcp import ClientSession

from typing import Optional

from contextlib import AsyncExitStack

import json

class MCPAgent:

    def __init__(self):

        self.exit_stack = AsyncExitStack()

        self.session: Optional[ClientSession] = None

        self.llm = AsyncOpenAI(

            api_key="sk-xxx",

            base_url="https://api.siliconflow.cn/v1/"

        )

    async def connect_server(self, sse_endpoint: str):

        transport = await self.exit_stack.enter_async_context(

            sse_client(sse_endpoint)

        )

        self.session = await self.exit_stack.enter_async_context(

            ClientSession(*transport)

        )

        await self.session.initialize()

        print("可用工具:", [t.name for t in (await self.session.list_tools()).tools])

    async def execute_workflow(self, query: str) -> str:

        # 步骤1:获取工具描述

        tools = [{

            "type": "function",

            "function": {

                "name": t.name,

                "description": t.description,

                "parameters": t.inputSchema

            }

        } for t in (await self.session.list_tools()).tools]

        # 步骤2:LLM决策工具调用

        chat_completion = await self.llm.chat.completions.create(

            model="deepseek-ai/DeepSeek-V3", #deepseek-ai/DeepSeek-R1-Distill-Qwen-7B deepseek-ai/DeepSeek-R1-Distill-Qwen-7B deepseek-ai/DeepSeek-R1

            messages=[{"role": "user", "content": query}],

            tools=tools,

            tool_choice="auto"

        )

        # 步骤3:执行工具调用

        if tool_calls := chat_completion.choices[0].message.tool_calls:

            results = []

            for tool_call in tool_calls:

                args = json.loads(tool_call.function.arguments)

                result = await self.session.call_tool(

                    tool_call.function.name,

                    args

                )

                print(result.content[0].text)

                print("———")

                results.append(result.content[0].text)

            # 步骤4:结果整合

            final_response = await self.llm.chat.completions.create(

                model="deepseek-r1-distill-qwen", #deepseek-ai/DeepSeek-R1-Distill-Qwen-7B

                messages=[{

                    "role": "user",

                    "content": f"原始问题:{query}\n工具结果:{json.dumps(results)}"

                }]

            )

            return final_response.choices[0].message.content

        return chat_completion.choices[0].message.content

        # return json.dumps(results)

async def main():

    agent = MCPAgent()

    try:

        # 连接本地SSE服务

        await agent.connect_server("http://localhost:8000/sse")

        # 示例查询

        response = await agent.execute_workflow(

            "看下这个页面: https://blog.csdn.net/u010479989/article/details/147422815,并总结三个关键点"

        )

        print(f"\n最终响应:{response}")

    finally:

        await agent.exit_stack.aclose()

if __name__ == "__main__":

    asyncio.run(main())

执行结果

作者:代码先觉

物联沃分享整理
物联沃-IOTWORD物联网 » Python调用大型模型LLM实现mcp服务的实例代码展示

发表回复