Model Context Protocol (MCP)

پیاده‌سازی MCP بر روی gRPC: یک جایگزین با کارایی بالا برای HTTP در یکپارچه‌سازی‌های AI از راه دور

پروتکل زمینه مدل (MCP) به سرعت به عنوان یک استاندارد برای اتصال مدل‌های هوش مصنوعی به منابع داده و ابزارهای خارجی ظهور کرده است. در حالی که پیاده‌سازی مرجع از HTTP استاندارد و JSON-RPC بر روی WebSockets استفاده می‌کند، بسیاری از محیط‌های تولید به تأخیر کمتر، تایپ سخت‌گیرانه‌تر و سریال‌سازی داده‌های کارآمدتر نیاز دارند. اینجاست که gRPC، چارچوب فراخوانی رویه از راه دور با کارایی بالا و متن‌باز گوگل، وارد بحث می‌شود. با پیاده‌سازی MCP بر روی gRPC، توسعه‌دهندگان می‌توانند مزایای عملکردی قابل توجهی را آزاد کنند، به ویژه هنگام کار با جریان‌های داده با پهنای باند بالا یا دارایی‌های باینری.

چرا gRPC را برای MCP در نظر بگیرید؟

پیاده‌سازی‌های سنتی HTTP/JSON، اگرچه برای دیباگ کردن آسان هستند، در محیط‌های AI حساس از چندین محدودیت رنج می‌برند:

  • حجم زیاد: JSON پرحرف است. برای بارهای بزرگ، مانند داده‌های تصویری یا زمینه‌های کد گسترده، سربار قابل توجهی است.
  • هزینه‌های تجزیه: تجزیه JSON در مقایسه با فرمت‌های باینری از نظر محاسباتی پرهزینه است.
  • کارایی پخش (Streaming): در حالی که رویدادهای ارسال‌شده از سمت سرور (SSE) وجود دارند، پخش دوطرفه بومی gRPC مدیریت فشار باز (backpressure) و کارایی برتری ارائه می‌دهد.

gRPC از Protocol Buffers (protobuf) استفاده می‌کند، یک فرمت سریال‌سازی باینری که هم فشرده است و هم سریع تجزیه می‌شود. علاوه بر این، تایپ قوی gRPC اطمینان می‌دهد که رابط بین کلاینت AI و سرور زمینه به طور دقیق در زمان کامپایل تعریف شده است، که منجر به کاهش خطاهای زمان اجرا می‌شود.

تعریف سرویس با Protocol Buffers

گام اول تعریف رابط MCP در فایل‌های .proto است. به جای اشیاء JSON عمومی، ما پیام‌های مشخصی برای منابع، پرامپت‌ها و ابزارها تعریف می‌کنیم.

syntax = "proto3";

package mcp.v1;

service ModelContextService {
  // Retrieve a specific resource
  rpc ReadResource(ReadResourceRequest) returns (Resource);

  // List available tools
  rpc ListTools(ListToolsRequest) returns (ListToolsResponse);

  // Execute a tool and stream results back
  rpc CallTool(CallToolRequest) returns (stream ToolResultChunk);
}

message ReadResourceRequest {
  string uri = 1;
}

message Resource {
  string uri = 1;
  string mime_type = 2;
  bytes content = 3; // Efficiently handles binary data like images
}

message ListToolsRequest {
  string client_id = 1;
}

message ListToolsResponse {
  repeated Tool tool = 1;
}

message Tool {
  string name = 1;
  string description = 2;
  string input_schema_json = 3; // Keep schema as JSON string for flexibility
}

message CallToolRequest {
  string tool_name = 1;
  string arguments_json = 2;
}

message ToolResultChunk {
  bool is_final = 1;
  string text_chunk = 2;
  bytes binary_chunk = 3;
  bool is_error = 4;
  string error_message = 5;
}

پیاده‌سازی سمت سرور

پیاده‌سازی سرور شامل تولید استاب‌های کلاینت و سرور از فایل .proto است. برای مثال در Python، می‌توانید از بسته grpcio-tools برای تولید کد استفاده کنید.

import grpc
from concurrent import futures
import mcp_pb2
import mcp_pb2_grpc

class ModelContextServicer(mcp_pb2_grpc.ModelContextServiceServicer):
    def ReadResource(self, request, context):
        # Logic to fetch resource from database or file system
        data = b"Binary image data here"
        return mcp_pb2.Resource(
            uri=request.uri,
            mime_type="image/png",
            content=data
        )

    def CallTool(self, request, context):
        # Simulate streaming a large response
        chunks = ["Processing step 1...", "Processing step 2...", "Done!"]
        for i, text in enumerate(chunks):
            yield mcp_pb2.ToolResultChunk(
                is_final=(i == len(chunks) - 1),
                text_chunk=text
            )

def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    mcp_pb2_grpc.add_ModelContextServiceServicer_to_server(ModelContextServicer(), server)
    server.add_insecure_port("[::]:50051")
    server.start()
    print("gRPC MCP Server running on port 50051")
    server.wait_for_termination()

if __name__ == '__main__':
    serve()

یکپارچه‌سازی کلاینت: پل زدن بر شکاف

در سمت کلاینت، جایی که LLM مستقر است، لایه یکپارچه‌سازی نیت مدل را به فراخوانی‌های gRPC تبدیل می‌کند. مزیت کلیدی در اینجا توانایی مدیریت بی‌درنگ جریان‌های ناهمگام است. وقتی LLM درخواست اجرای ابزاری را می‌دهد، کلاینت می‌تواند نتایج جزئی را به زمینه مدل پخش کند بدون اینکه منتظر تکمیل کل عملیات بماند.

برای توسعه‌دهندگانی که از کتابخانه‌های استاندارد MCP استفاده می‌کنند، ممکن است نیاز باشد یک لایه انتقال سفارشی بنویسند. این لایه درخواست‌های JSON-RPC استاندارد را متوقف کرده و آن‌ها را به متدهای gRPC متناظر تعریف شده در فایل .proto شما نگاشت می‌کند. این انتزاع به شما امکان می‌دهد تا منطق اصلی برنامه AI خود را تمیز نگه دارید، در حالی که از کارایی gRPC در زیرساخت بهره می‌برید.

ملاحظات عملکردی

در بنچمارک‌ها، تغییر از HTTP/JSON به gRPC/Protobuf معمولاً منجر به موارد زیر می‌شود:

  • کاهش 30-50 درصدی در اندازه بار شبکه برای داده‌های ساختاریافته.
  • سرعت تجزیه 20 درصدی سریع‌تر به دلیل سریال‌سازی مجدد باینری.
  • مصرف CPU کمتر در سرورهای با ترافیک بالا.

نتیجه‌گیری

در حالی که پیاده‌سازی‌های MCP مبتنی بر HTTP استاندارد برای بسیاری از سناریوهای توسعه و تست کافی هستند، حرکت به سمت gRPC یک انتخاب راهبردی برای سیستم‌های AI مقیاس تولید است. این روش استحکام، تایپ و کارایی مورد نیاز را هنگام یکپارچه‌سازی ابزارهای خارجی پیچیده و پرمحتوای داده‌ای با مدل‌های زبانی بزرگ ارائه می‌دهد. با بلوغ اکوسیستم MCP، انتظار می‌رود حمایت استانداردسازی شده بیشتری برای روش‌های انتقال جایگزین مشاهده شود، که پیاده‌سازی‌های gRPC با کارایی بالا را آسان‌تر می‌کند.

Share: