LLM函数调用演示

一个通过LLM函数调用机制自动触发MCP的小型演示项目,用于展示如何通过OpenAI模型与Petstore API交互。

  • by elifbeyzatok00
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 elifbeyzatok00/mcp-openapi-demo

使用说明

mcp openapi演示

模型上下文协议

通过“LLM函数调用”机制自动触发MCP的小演示。

📂 项目目录

mcp-openapi-demo/
│
├── server.js          # Node.js tarafı → MCP Server (Petstore API)
├── package.json       # Node bağımlılıkları
├── .env               # Ortam değişkenleri (API anahtarı vs.)
└── python-client/
    ├── client.py      # Python tarafı → MCP Client (OpenAI entegrasyonu ile)

项目如何运作

👉 只需“查找可用宠物”。 👉 模型会自行调用函数。 👉 Python代码将捕获此函数调用,将其重定向到MCP服务器,然后得到响应。 👉 将结果返回到模型并打印最终答案。


🚀 步骤1:启动MCP服务器

首先打开Node.js页面并在终端:

cd mcp-openapi-demo
node server.js

如果是真的:

🚀 MCP Server running on http://localhost:4000

你必须看到你的留言✅


🚀 步骤2:设置Python环境

转到 Python 客户端文件夹:

cd python-client
python -m venv venv
source venv/bin/activate   # Windows: venv\Scripts\activate
pip install requests openai

🚀 步骤3:设置OpenAI API密钥

API 密钥 .env 你可以写文件:

OPENAI_API_KEY=senin_api_key

在Python代码中获取密钥 python-dotenv 包装时:

pip install python-dotenv

have的常用口语形式 client.py 添加如下:

from dotenv import load_dotenv
load_dotenv()

现在的钥匙是自动的。 .env 将从档案中提取。


🚀 步骤4:启动Python客户端

python client.py

预期结果:

  1. 首先 来自Petstore API的JSON “可用宠物”列表。
  2. 然后 OpenAI模型的自然语言摘要 → “有20种宠物可供选择,大多数是狗和猫……”吉比。

📌 总结:

  • 由 Node.js 开发 → Petstore MCP Server
  • Python 方面 → 从 MCP 获取数据,并向 OpenAI 模型提供评论

LLM函数调用机制是如何工作的?

👉 模型 "find_available_pets" 调用函数 你写的 prompt + 你给的 tools 由于定义 正在发生。所以这个电话 作为对API调用的响应,在模型的输出中 正在发生。

📍 在哪里?

OpenAI 的 chat.completions.create 会在答案。 例如在Python中:

from openai import OpenAI

client = OpenAI()

tools = [
    {
        "type": "function",
        "function": {
            "name": "find_available_pets",
            "description": "Find pets in the Petstore API by status",
            "parameters": {
                "type": "object",
                "properties": {
                    "status": {
                        "type": "string",
                        "enum": ["available", "pending", "sold"]
                    }
                },
                "required": ["status"],
            },
        }
    }
]

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "user", "content": "Can you show me all available pets?"}
    ],
    tools=tools
)

print(response.choices[0].message)

📍 模特的反应如何?

模型不会返回纯文本, 函数调用döner:

{
  "role": "assistant",
  "tool_calls": [
    {
      "id": "call_1",
      "type": "function",
      "function": {
        "name": "find_available_pets",
        "arguments": "{ \"status\": \"available\" }"
      }
    }
  ]
}

📍 你在做什么?

  1. 这里 function.name have的常用口语形式 arguments 你会得到它的价值。

  2. 将此信息发送到MCP服务器 JSON-RPC请求 发送(pet/findByStatus).

  3. 返回的答案再次给模型

    client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "user", "content": "Can you show me all available pets?"},
            response.choices[0].message,  # function call çıktısı
            {
              "role": "tool",
              "tool_call_id": response.choices[0].message.tool_calls[0].id,
              "content": json.dumps(mcp_result)
            }
        ]
    )
    

✅ 调用“find_available_pets” 这不是你的代码,而是模型的输出。 你只需要抓住这个函数调用。 你真的在运行 (发送到MCP)

完整字符串 :

用户 → LLM → 函数调用 → MCP → 结果 → 再次 LLM

工具定义中的描述是否会影响过程?

没错✅ — 工具定义 描述 这是过程中最关键的部分之一。

LLM接收用户的消息,然后你给他 工具模式是的。 工具'un 名称, 参数 尤其是 描述 部分允许模型决定在什么情况下调用该工具。

🔎 具体影响因素:

  1. 工具名称(name)

    • 模型的“关键词”。
    • 但是,单靠它是不够的,因为用户可能不总是说“找到宠物”。
    • 例如:用户 “让我看看所有可供收养的狗” 课程 → 查看模型描述并匹配“此工具为采用带来了可用的宠物”。
  2. Description(描述)

    • 这是模型决策过程中最强的信号。

    • 你在这里写的描述越清晰,任务定义越好,模型就会做出更准确的决定。

    • Örn:

      "description": "Find pets that are currently available in the Petstore API. Use this function if the user asks about pets, animals, or available pets."
      

      如果你这样写,模型会更准确地触发。

    • 如果描述较弱,模型可能选择了错误的工具,或者根本没有调用工具。

  3. 参数(图)

    • 允许模型生成正确的参数。
    • Mesela枚举 ["available", "pending", "sold"] 如果是这样,模型将选择这三个值之一。
    • 这将使您免受不必要的验证。

📌 摘要 :

  • 是的,描述直接影响。
  • 描述对于模型理解“哪个工具起作用”至关重要。
  • 写得好 description → 选择正确的工具和正确的参数。