برنامه نویسی

Langgraph + MCP + Ollama: کلید عامل قدرتمند AI

در این داستان ، من یک آموزش فوق العاده سریع دارم که به شما نشان می دهد که چگونه می توانید با استفاده از Langgraph ، MCP و Ollama یک چت بابات چند عامل ایجاد کنید تا یک chatbot عامل قدرتمند را برای استفاده یا استفاده شخصی خود بسازید.

چندی پیش ، من ویدئویی درباره پروتکل زمینه مدل ساختم. برخی از توسعه دهندگان آن را با “Zapier ساخته شده برای AI” مقایسه می کنند ، و معتقدند که این امر به سادگی اقدامات اضافی را برای استفاده API اضافه می کند.

جان راش گفت: “قبل از MCP ، توسعه دهندگان مجبور بودند از طریق API ها كد و ابزارهای AI را به سیستم های خارجی وصل كنند ، به این معنی كه هر ادغام لازم برای رمزگذاری در جلو است.”

اگرچه MCP سال گذشته منتشر شد ، اما اخیراً به طور ناگهانی محبوب شده است ، که همچنین بحث هایی راجع به دوام “دوره گل” آن ایجاد کرده است. Langchain همچنین در مورد X رأی داد:

نتایج نشان داد که 40.8 ٪ از مردم معتقدند MCP استاندارد آینده است ، 25.8 ٪ معتقد بودند که MCP فقط یک فلاش در تابه است و 33.4 ٪ باقی مانده تصمیم به انتظار و دیدن داشتند.

MCP هنوز جدید است (در نوامبر 2024 منتشر شد) ، اما در حال حاضر از بسیاری از خدمات مانند Github ، Slack و PostgreSQL پشتیبانی می کند. از آنجا که این یک استاندارد باز است ، جای تعجب دارد که می توان از آن با هر LLM (کلود ، اوپای ، جمینی و غیره) استفاده کرد.

بنابراین ، بگذارید یک نسخه ی نمایشی سریع از یک چت بابات زنده به شما بدهم تا منظور من را به شما نشان دهد.

YouTube را بررسی کنید

من از chatbot دو سؤال مختلف می پرسم: اولین مورد این است: “آیا می توانید گزارشی درباره آخرین LLM بنویسید؟” در صورت تمایل هرگونه سؤالی را که می خواهید بپرسید.

اگر به چگونگی تولید chatbot خروجی بپردازید ، خواهید دید که عامل برای پردازش ورودی از جریان ساختاری خود ، با استفاده از عملکرد Create_Chatbot استفاده می کند. این تابع دستورالعمل های سیستم ، پیام های کاربر و اجرای ابزار را در یک فرآیند تعامل صاف ادغام می کند. سپس تصمیم می گیرد که از کدام ابزار بر اساس پرس و جو استفاده شود.

این ابزار جستجوی Google را برای جستجوی آخرین اطلاعات و تولید گزارش فراخوانی می کند. برای سوال دوم ، “یک اسکریپت پایتون بنویسید که از Seaborn برای ایجاد یک طرح پراکندگی با خطوط رگرسیون استفاده می کند ،” Chatbot درخواست را پردازش می کند و آن را به ابزار مناسب مانند Python_Repl یا Data_visualization ، بسته به نحوه ساخت پرس و جو ، هدایت می کند. ASYNC_TOOL_EXTOROR به صورت پویا تماسهای ابزار را کنترل می کند ، و اطمینان می دهد که هم عملکردهای همزمان و هم ناهمزمان مانند تولید کد یا تجسم به درستی اجرا می شوند.

در طول این فرآیند ، chatbot stategraph حالت های مکالمه را مدیریت می کند ، بنابراین می تواند پاسخ های دقیق و متنی آگاهانه را به سؤالات پیگیری ارائه دهد. عملکرد get_tools تضمین می کند که فقط ابزارهای کاربردی در دسترس هستند و ثبات سیستم را حفظ می کنند. عملکرد اصلی همه چیز را به راحتی انجام می دهد ، پردازش ورودی های کاربر ، فراخوانی از ابزارهای صحیح و استفاده از خروجی ها در زمان واقعی.

بنابراین ، در پایان این داستان ، شما تفاوت بین MCP و تماس با عملکرد را درک خواهید کرد ، چه موقع از تماس عملکرد و MCP استفاده کنید ، و اینکه چگونه می خواهیم از Langgraph ، MCP و OpenSource استفاده کنیم تا یک چت بابات قدرتمند ایجاد شود.

در تماس با عملکرد ، هوش مصنوعی مانند یک کارگر ماهر است که تحت یک اسکریپت سخت کار می کند – می تواند فرم ها را پر کرده و ابزارهای از پیش تعریف شده را صدا کند ، اما فقط مواردی که به دست آورده است ، و آنها را یکی یکی صدا می کند. در MCP ، هوش مصنوعی بیشتر شبیه یک عامل با یک ابزار ابزار است: می تواند در جعبه ابزار (کشف ابزارهای جدید) در اطراف خود شسته شود ، آنها را با هم ترکیب کنید ، کارهای بیشتری را انجام داده و استقلال بیشتری داشته باشید.

فراخوانی عملکرد کاملاً با پیشبرد مدل همراه است و به توسعه دهندگان نیاز دارد تا سفارش را مدیریت کنند ، که این امر آن را بسیار کنترل می کند اما تا حدی انعطاف پذیر است.

MCP از طریق پروتکل های باز به اتصال سست می رسد ، که باعث می شود بسیار انعطاف پذیر و گسترده باشد ، اما برای مدیریت پیچیدگی (و اطمینان از ایمنی) به طراحی قوی نیاز دارد. بخش بعدی به نحوه ایجاد یک عامل با MCP و نحوه مقابله با چالش های ناشی از این انعطاف پذیری شیرجه می زند.

انتخاب عملکرد تماس در مقابل MCP به مورد استفاده بستگی دارد:

هنگام استفاده از مجموعه کوچکی از اقدامات خوب تعریف شده یا نمایش داده شد ، از تماس با عملکرد استفاده کنید ، به خصوص اگر آنها عملیات تک مرحله ای هستند و می خواهید خروجی های بسیار ساختاری داشته باشید.

این مناسب برای کارهای قابل پیش بینی و ادغام های سبک است که در آن ممکن است سربار اضافه شده MCP بیش از حد باشد ، بنابراین هنگام ساختار ، کارهای باریک و سهولت ادغام با برنامه خود ، فراخوانی عملکرد را انتخاب کنید.

از MCP هنگامی که به انعطاف پذیری بیشتر ، یک ابزار همه کاره یا زمینه ای که در تعامل تکامل می یابد ، از MCP استفاده کنید. MCP برای گردش کار پیچیده و چند مرحله ای مناسب تر است ، یا هنگامی که هوش مصنوعی باید زمینه بلند مدت را حفظ کند و با انواع سیستم ها در تعامل باشد ، اگر عامل AI شما یک دستیار عمومی در سیستم های داخلی باشد که می تواند منابع مختلف داده را ترسیم کند.

توجه به این نکته حائز اهمیت است که این دو رویکرد متقابلاً منحصر به فرد نیستند – آنها می توانند یکدیگر را تکمیل کنند. به عنوان مثال ، تماس با عملکرد می تواند در داخل یک مشتری MCP برای پردازش خروجی ساختاری یک مدل استفاده شود.

از نظر مفهومی ، تماس با عملکرد برای ترجمه زبان طبیعی به اجرای عملکرد به روش کنترل شده طراحی شده است ، در حالی که MCP به گونه ای طراحی شده است که رابط وسیع تری برای هوش مصنوعی فراهم کند تا در یک محیط کاوش و کار کند.

اجازه دهید اکنون قدم به قدم کاوش کنیم و جواب نحوه ایجاد برنامه MCP را کشف کنیم. ما کتابخانه هایی را که از مدل پشتیبانی می کنند نصب خواهیم کرد. برای این کار ، ما نیاز به نصب PIP را انجام خواهیم داد

pip install -r requirements.txt
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مرحله بعدی معمول است که در آن کتابخانه های مربوطه را وارد خواهیم کرد ، که اهمیت آن با ادامه کار مشهود خواهد شد.

langchain_mcp_adapters: تبدیل ابزارهای MCP به ابزارهای Langchain
برای استفاده با نماینده Langgraph و اجرای مشتری را ارائه دهید
به کاربران اجازه می دهد تا از چندین سرور MCP به ابزارها وصل شوند و بارگذاری کنند

MCP: MCP یک پروتکل باز است که نحوه ارائه برنامه های کاربردی زمینه LLMS را استاندارد می کند.

Googlesearch-Python: بسته ای برای تسهیل در جستجوی Google.

# agent.py
from langchain_core.messages import AIMessage, ToolMessage, HumanMessage
from langgraph.graph import StateGraph, START, END, MessagesState
from nodes import create_chatbot
import asyncio
import os
import dotenv
from langchain_mcp_adapters.client import MultiServerMCPClient
# main.py
import streamlit as st
import asyncio
from agent import create_agent
from langchain_core.messages import HumanMessage
# nodes.py
from server import get_tools
from langgraph.graph import MessagesState
from langchain_openai import ChatOpenAI
from langchain_ollama import ChatOllama
from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
from datetime import datetime
import os

# server.py - unchanged except for removing search_google if it's not working
from mcp.server.fastmcp import FastMCP
from langchain_experimental.utilities import PythonREPL
import io
import base64
import matplotlib.pyplot as plt
from openai import OpenAI
from pydantic import BaseModel, Field
import os
from dotenv import load_dotenv
import asyncio
from googlesearch import search  
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

نماینده
من عملکرد CREATE_AGENT را به عنوان یک فرآیند ناهمزمان برای ساخت یک عامل AI طراحی کردم. من یک تابع ASYNC را تنظیم کردم که DOCS_INFO را به یک پارامتر اختیاری می رساند تا داده های مربوطه را به chatbot ارائه دهد.

من MultiserverMcpClient را در یک ASYNC با مدیر متن یکپارچه کردم ، و از برقراری ارتباط یکپارچه با یک سرور MCP http: // localhost: 8000/SSE با استفاده از رویدادهای سرور-سن (SSE) با یک زمان 30 ثانیه.

من یک تماس به client.get_tools () را بازیابی کردم تا ابزارهای لازم MCP را بازیابی کنم و عملکردهای پیشرفته را فعال کنم. برای مدیریت کشورهای مکالمه ، من یک حالت دولتی را با استفاده از MessagessTate ساختم.

سپس من یک گره chatbot withcreate_chatbot (docs_info) ایجاد کردم و به آن اجازه می دهم تا با مستندات ارائه شده پردازش و تعامل داشته باشد.

async def create_agent(docs_info=None):
    async with MultiServerMCPClient(
        {
            "server":{
                "url":"http://localhost:8000/sse",
                "transport":"sse",
                "timeout": 30
            }
        }
    ) as client:
        # Get MCP tools
        tools = client.get_tools()

        # Create the graph builder
        graph_builder = StateGraph(MessagesState)

        # Create nodes
        chatbot_node = create_chatbot(docs_info)
        graph_builder.add_node("chatbot", chatbot_node)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

من ASYNC_TOOL_EXTOUR را برای پردازش پویا ابزار با استفاده از حالت به عنوان ورودی طراحی کردم ، که شامل لیستی از پیام های رد و بدل شده در مکالمه است. من آخرین پیام را استخراج می کنم (پیام ها[-1]) برای بررسی تماس های ابزار ، بازیابی آنها از Tool_calls به طور مستقیم یا در داخل kwargs اضافی.

اگر هیچ تماس ابزاری پیدا نشود ، پیام ها را بدون تغییر برمی گردانم. برای پردازش تماس های ابزار ، من پیام ها را در New_Messages کپی می کنم و از طریق هر تماس ابزار ، استخراج ابزار_ name ، tool_args و tool_id ، پشتیبانی از هر دو فرهنگ لغت و شیء برای انعطاف پذیری را تکرار می کنم. من با تطبیق ابزار آن با ابزارهای موجود ، ابزار مربوطه را جستجو می کنم. در صورت یافتن ، من یک لیست پیام خطای را ایجاد می کنم.

اگر ابزار وجود داشته باشد ، من تعیین می کنم که آیا این یک تابع async با استفاده از asyncio.iscoroutinefunction () است – اگر async باشد ، من آن را با استفاده از ابزار await.coroutine اجرا می کنم (Tool_Args) در غیر این صورت ، من به Tool.func می گویم (Tool_args) یا ابزار (** tool_args). من با گرفتن استثنائات و پیوستن به پیام های خطای دقیق به new_messages ، خطاها را برطرف می کنم.

# Custom async tool node to handle async MCP tools
        async def async_tool_executor(state):
            messages = state["messages"]
            last_message = messages[-1]

            # Check if there are tool calls
            tool_calls = None
            if hasattr(last_message, "tool_calls"):
                tool_calls = last_message.tool_calls
            elif hasattr(last_message, "additional_kwargs") and "tool_calls" in last_message.additional_kwargs:
                tool_calls = last_message.additional_kwargs["tool_calls"]

            if not tool_calls:
                return {"messages": messages}

            # Process each tool call
            new_messages = messages.copy()

            for tool_call in tool_calls:
                # Handle different formats of tool_call
                if isinstance(tool_call, dict):
                    tool_name = tool_call.get("name")
                    tool_args = tool_call.get("args", {})
                    tool_id = tool_call.get("id", "tool-call-id")
                else:
                    tool_name = tool_call.name
                    tool_args = tool_call.args if hasattr(tool_call, "args") else {}
                    tool_id = getattr(tool_call, "id", "tool-call-id")

                # Print debug info
                print(f"Executing tool: {tool_name}")
                print(f"Tool args: {tool_args}")

                # Find the matching tool
                tool = next((t for t in tools if t.name == tool_name), None)

                if not tool:
                    # Tool not found
                    tool_error = f"Error: {tool_name} is not a valid tool, try one of {[t.name for t in tools]}."
                    new_messages.append(AIMessage(content=tool_error))
                else:
                    try:
                        # Execute the async tool
                        if asyncio.iscoroutinefunction(tool.coroutine):
                            result = await tool.coroutine(**tool_args)
                        else:
                            # Fall back to sync execution if needed
                            result = tool.func(**tool_args) if hasattr(tool, 'func') else tool(**tool_args)

                        print(f"Tool result: {result}")

                        # Add tool result
                        new_messages.append(ToolMessage(
                            content=str(result),
                            tool_call_id=tool_id,
                            name=tool_name
                        ))
                    except Exception as e:
                        # Handle errors
                        error_msg = f"Error: {str(e)}\n Please fix your mistakes."
                        print(f"Tool error: {error_msg}")
                        new_messages.append(AIMessage(content=error_msg))

            return {"messages": new_messages}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

من با ادغام یک گره اجرایی ابزار ASYNC و یک عملکرد مسیریابی در نمودار Chatbot ، یک جریان مکالمه ساختاری را طراحی کردم. ابتدا ، من ASYNC_TOOL_EXTOUR را به عنوان گره ای به نام “ابزارها” اضافه کردم و به سیستم اجازه می دهد تا تماس های ابزار را به صورت پویا پردازش کند.

سپس ، من یک تابع روتر ایجاد کردم تا مرحله بعدی را بر اساس آخرین پیام در مکالمه تعیین کنم. روتر بازرسی می کند که آیا آخرین پیام ارسال شده توسط AI شامل تماس های ابزار است – اگر پیدا شود ، جریان را به “ابزارها” هدایت می کند ، در غیر این صورت ، مکالمه را پایان می دهد.

برای ایجاد جریان ، من لبه ها را به نمودار اضافه کردم: شروع از “chatbot” ، مسیریابی مشروط به “ابزارها” یا “پایان” و حلقه “ابزارهای” به “چت بابات” برای فعال کردن چندین تعامل ابزار.

 # Add the async tool executor node
        graph_builder.add_node("tools", async_tool_executor)

        # Define router function to handle tool calls
        def router(state):
            messages = state["messages"]
            last_message = messages[-1]

            has_tool_calls = False
            if isinstance(last_message, AIMessage):
                if hasattr(last_message, "tool_calls") and last_message.tool_calls:
                    has_tool_calls = True
                elif hasattr(last_message, "additional_kwargs") and last_message.additional_kwargs.get("tool_calls"):
                    has_tool_calls = True

            return "tools" if has_tool_calls else "end"

        # Add edges
        graph_builder.add_edge(START, "chatbot")
        graph_builder.add_conditional_edges(
            "chatbot",
            router,
            {
                "tools": "tools",
                "end": END
            }
        )
        graph_builder.add_edge("tools", "chatbot")

        # Compile the graph
        graph = graph_builder.compile()
        return graph, client  # Return client to keep it alive
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

فهرست مطالب

node.py

من یک تابع را طراحی کردم ، get_system_prompt به صورت پویا یک سیستم سریع برای دستیار هوش مصنوعی ایجاد می کند ، و اطمینان حاصل می کند که با دستورالعمل های واضح و آگاهی متنی عمل می کند. اول ، من تاریخ فعلی را با استفاده از dateTime.Now (). strftime (“٪ y- ٪ m- ٪ d”) فرمت کردم و آن را در سریع برای مرجع در زمان واقعی تعبیه کردم.

سپس ، من نقش و توانایی های دستیار را تعریف کردم ، سه ابزار اصلی را ذکر کردم: GETERATE_IMAGE (DALL-E برای ایجاد تصویر) ، Data_Visualization (Matplotlib برای تولید نمودار) و Python_repl (یک محیط اجرای پایتون).

def get_system_prompt(docs_info=None):
    system_prompt = f"""
    Today is {datetime.now().strftime("%Y-%m-%d")}
    You are a helpful AI Assistant that can use these tools:
    - generate_image: Generate an image using DALL-E based on a prompt
    - data_visualization: Create charts with Python and matplotlib
    - python_repl: Execute Python code

    When you call image generation or data visualization tool, only answer the fact that you generated, not base64 code or url.
    Once you generated image by a tool, then do not call it again in one answer.
    """
    if docs_info:
        docs_context = "\n\nYou have access to these documents:\n"
        for doc in docs_info:
            docs_context += f"- {doc['name']}: {doc['type']}\n"
        system_prompt += docs_context

    system_prompt += "\nYou should always answer in same language as user's ask."
    return system_prompt
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

من عملکرد Create_Chatbot را برای رسیدگی به ورودی های کاربر و تولید پاسخ های AI توسعه دادم. از یک تکنیک ، chatprompttemplate ، برای ترکیب دستورالعمل های سیستم با پیام های کاربر استفاده می کند. دستورالعمل های سیستم از get_system_prompt (docs_info) آمده است.

من (|) سریع را به LLM لوله کردم تا یک زنجیره پردازش یکپارچه ایجاد کنم. این تابع با تبدیل رشته ها به اشیاء انسانی ، سازگاری قالب پیام را تضمین می کند. Chatbot با پیام های کاربر LLM را فراخوانی می کند و پاسخ را ضمیمه می کند.

این یک تاریخ مکالمه ساختاری را حفظ می کند. دستیار ضمن تطبیق با نمایش داده ها ، از قوانین از پیش تعریف شده پیروی می کند. این ابزار-آگنوستیک باقی مانده و امکان انعطاف پذیری در پاسخ ها را فراهم می کند. این تنظیم یک تجربه تعاملی و پویا Chatbot را تضمین می کند. 🚀

def create_chatbot(docs_info=None):
    prompt = ChatPromptTemplate.from_messages([
        SystemMessagePromptTemplate.from_template(get_system_prompt(docs_info)),
        HumanMessagePromptTemplate.from_template("{input}")
    ])

    # Use the LLM without binding tools
    chain = prompt | llm

    def chatbot(state: MessagesState):
        # Ensure messages are in the right format
        if isinstance(state["messages"], str):
            from langchain_core.messages import HumanMessage
            messages = [HumanMessage(content=state["messages"])]
        else:
            messages = state["messages"]

        response = chain.invoke(messages)
        return {"messages": messages + [response]}

    return chatbot
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

سرور

من مجموعه ای از ابزارها را برای تولید تصاویر ، تجسم داده ها و اجرای کد پایتون در یک سیستم چند ابزار ایجاد کردم. ابزار Generate_Image از DALL-E برای تولید تصاویر بر اساس سریع استفاده می کند. تضمین می کند که سریع سریع معتبر است و سپس یک تماس ناهمزمان به API OpenAI برای تولید تصویر برقرار می کند. در صورت موفقیت ، یک URL را به تصویر تولید شده بازگرداند. اگر خطایی رخ دهد ، پیام خطا را ارائه می دهد.

ابزار Data_Visualization کد پایتون را با استفاده از MATPLOTLIB برای ایجاد نمودارها اجرا می کند و نتیجه را به عنوان یک تصویر PNG رمزگذاری شده BASE64 ذخیره می کند. ابزار Python_Repl کد پایتون را با استفاده از یک محیط جایگزین اجرا می کند و اجرای پویا ورودی کاربر را ارائه می دهد. هر ابزار برای رسیدگی به خطاها و بازگشت پاسخ های معنی دار به کاربر طراحی شده است.

@mcp.tool()
async def generate_image(prompt: str) -> str:
    """
    Generate an image using DALL-E based on the given prompt.
    """
    if not isinstance(prompt, str) or not prompt.strip():
        raise ValueError("Invalid prompt")

    try:
        # Since this is an async function, we need to handle the synchronous OpenAI call properly
        loop = asyncio.get_event_loop()
        response = await loop.run_in_executor(
            None, 
            lambda: client.images.generate(
                model="dall-e-3",
                prompt=prompt,
                size="1024x1024",
                quality="standard",
                n=1
            )
        )

        # Return both success message and URL
        return f"Successfully generated an image of {prompt}! Here's the URL: {response.data[0].url}"
    except Exception as e:
        return f"Error generating image: {str(e)}"

repl = PythonREPL()

@mcp.tool()
def data_visualization(code: str):
    """Execute Python code. Use matplotlib for visualization."""
    try:
        repl.run(code)
        buf = io.BytesIO()
        plt.savefig(buf, format="png")
        buf.seek(0)
        img_str = base64.b64encode(buf.getvalue()).decode()
        return f"data:image/png;base64,{img_str}"
    except Exception as e:
        return f"Error creating chart: {str(e)}"

@mcp.tool()
def python_repl(code: str):
    """Execute Python code."""
    return repl.run(code)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

من عملکرد get_tools را ایجاد کردم تا لیستی از ابزارهایی را که برای استفاده در دسترس هستند ، برگردانم و اطمینان حاصل کنم که تنها ابزارهای کاربردی گنجانده شده اند. این تابع با مجموعه ای از ابزارها شروع می شود: GETERATE_IMAGE ، PYTHON_REPL و DATA_VISUALIZATION. اگر یک retriever_tool اضافی ارائه شود ، به لیست ابزارها اضافه می شود. سپس این تابع لیست کاملی از ابزارهای موجود را برمی گرداند.

سرانجام ، اسکریپت با فراخوانی MCP.Run (Transport = “SSE”) سرور MCP را با استفاده از رویدادهای سرور SENT (SSE) به عنوان روش حمل و نقل اجرا می کند. این تنظیم تضمین می کند که ابزارها هنگام اجرای برنامه آماده استفاده در برنامه هستند.

def get_tools(retriever_tool=None):
    # Only include tools that are working
    base_tools = [generate_image, python_repl, data_visualization]

    if retriever_tool:
        base_tools.append(retriever_tool)

    return base_tools

if __name__ == "__main__":
    mcp.run(transport="sse")
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

main.py

من عملکرد اصلی را برای اجرای یک عامل ناهمزمان طراحی کردم که ورودی کاربر را پردازش می کند و با ابزارهایی به صورت پویا تعامل دارد. عملکرد با ایجاد یک نماینده و مشتری با Await Create_Agent () شروع می شود. سپس کاربر را از طریق خط فرمان برای ورود به شما سوق می دهد و با درخواست کاربر پیام اولیه (HumanMessage) را ایجاد می کند.

این عملکرد با استناد به عامل غیر همزمان با استفاده از Agent.Ainvoke () ، پردازش درخواست و پاسخگویی به پاسخ ها ادامه می یابد. اگر پاسخ از یک کاربر باشد ، ورودی کاربر را چاپ می کند. اگر از ابزاری باشد ، نتیجه را چاپ می کند و بررسی می کند که آیا این یک تولید تصویر است و URL تصویر را استخراج می کند. هرگونه استثنا در هنگام پردازش گرفتار و چاپ می شود.

سرانجام ، مشتری برای اطمینان از ادامه عملیات زنده می ماند. این اسکریپت به طور غیر همزمان با Ansyncio.run (اصلی ()) اجرا می شود.

async def main():
    # Create the agent
    agent, client = await create_agent()

    # Get user input from command line
    user_input = input("What would you like to ask? ")

    # Create a proper initial message
    initial_message = HumanMessage(content=user_input)

    try:
        # Use the agent asynchronously
        print("Processing your request...")
        result = await agent.ainvoke({"messages": [initial_message]})

        # Print the results
        for message in result["messages"]:
            if hasattr(message, "type") and message.type == "human":
                print(f"User: {message.content}")
            elif hasattr(message, "type") and message.type == "tool":
                print(f"Tool Result: {message.content}")
                # If it's an image generation result, extract URL
                if "image" in message.content.lower() and "url" in message.content.lower():
                    print("Image Generated Successfully!")
            else:
                print(f"AI: {message.content}")
    except Exception as e:
        print(f"Error: {str(e)}")

    # Keep the client alive until all operations are done
    # In a real application, you'd keep the client active as long as needed

if __name__ == "__main__":
    asyncio.run(main())
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

نتیجه گیری:
MCP فقط یک ابزار ساده به روز شده است که پروتکل را فراخوانی می کند ، بلکه یک به روزرسانی بزرگ پارادایم است.

MCP یک استاندارد متداول و باز را ارائه می دهد که سیستم های AI را قادر می سازد به انواع مختلفی از منابع ، ابزارها و خدمات به روشی استاندارد متصل شوند ، که نیاز به ایجاد اتصالات جداگانه برای هر منبع داده را کاهش می دهد و فرآیند ادغام AI را ساده می کند.

خدمات غیر هوشمند فعلی می توانند عملکردهای خود را به عنوان “ابزاری” از طریق MCP برای LLM (مدل زبان بزرگ) در معرض تماس قرار دهند ، که LLM را قادر می سازد با سیستم های موجود تعامل داشته و بدون تغییر عمده در سیستم های موجود انجام شود.

یادگیری یک فرایند است و تا زمانی که یاد بگیرید ، چالش هایی وجود خواهد داشت. خدا به سخت کوشی پاداش می دهد ، و هرچه کار می کنید سخت تر می شوید ، بهتر خواهید شد

🧙‍♂ من یک متخصص مولد هوش مصنوعی هستم! اگر می خواهید در مورد یک پروژه همکاری کنید ، از اینجا سؤال کنید یا یک تماس مشاوره 1 بر 1 را با من رزرو کنید.

من اگر شما بسیار قدردانی می کنم

❣ به پاترون من بپیوندید: https://www.patreon.com/gaodalie_ai

قرار ملاقات با من: https: //topmate.io/gaodalie_ai

از محتوا پشتیبانی کنید (هر دلار به فیلم برمی گردد): https: //buymeacoffee.com/gaodalie98d

در خبرنامه به صورت رایگان مشترک شوید: https: //substack.com/@gaodalie

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا