الإشراف على وكيل الذكاء الاصطناعي للبحث في الفن السابق مع وجود الإنسان في الحلقة باستخدام LangGraph وwatsonx.ai

مؤلف

Anna Gutowska

AI Engineer, Developer Advocate

IBM

في هذا البرنامج التعليمي، سوف تقوم بتنفيذ human-in-the-loop كآلية التعليقات لنظامك الوكيل الذي تم إنشاؤه باستخدام LangGraph وwatsonx.ai®. سيتخصص وكيلك في البحث عن الفن السابق، وهي حالة استخدام في العالم الحقيقي، قد تكون جهدًا يدويًا مملًا بخلاف ذلك. سيستخدم وكيلك واجهة برمجة تطبيقات براءات الاختراع من Google من خلال SerpAPI لفحص براءات الاختراع وتقديم تعليقات حول اقتراحات براءات الاختراع. سيكون نموذج اللغة الكبير (LLM) المفضَّل مفتوح المصدر IBM® Granite.

ألهم ظهور الذكاء الاصطناعي الوكيل المطورين لتحويل تركيزهم وجهودهم من روبوت المحادثة الآلي الأساسي إلى الأتمتة. كلمة "الأتمتة" تشير عادة إلى إزالة المشاركة البشرية من تنفيذ المهام.1 هل تثق في وكيل الذكاء الاصطناعي لتحديد الخيارات الحاسمة المتعلقة بالمالك الشخصي، على سبيل المثال؟ الكثير منَّا لن يفعل ذلك. ماذا لو كان هناك قدر معين من الغموض يمكن أن يوفر للمستخدم النهائي هذه الثقة المفقودة؟ يمكن أن تتخذ هذه الطبقة من الفروق الدقيقة شكل تدخل بشري، يُعرَف باسم التدخل البشري في العملية.

التدخل البشري في سير العمل

التدخل البشري في العملية (HITL) هو نمط بنيوي يتطلب التعليقات لتوجيه عملية صناعة القرار في التطبيق وتوفير الإشراف. في مجال الذكاء الاصطناعي، يشير HITL إلى وجود تدخل بشري في مرحلة ما من سير عمل الذكاء الاصطناعي. تضمن هذه الطريقة الدقة والسلامة والمساءلة.

يتمكن البشر من مراجعة حالات الرسم البياني وتحديثها بشكل غير متزامن في LangGraph بسبب حالة التنفيذ المستمرة. فمن خلال استخدام نقاط تحقق من الحالة بعد كل خطوة، يمكن الحفاظ على سياق الحالة وإيقاف سير العمل مؤقتًا حتى يتم تلقي تعليقات بشرية.

في هذا البرنامج التعليمي، سنقوم بتجربة نهجي HITL في LangGraph.

  1. المقاطعات الثابتة: تحرير حالة الرسم البياني مباشرة في نقاط محددة مسبقًا قبل أو بعد تنفيذ عقدة معينة. يتطلب هذا النهج ضبط معلمات interrupt_before أو interrupt_after على قائمة بأسماء العقدة عند تجميع الرسم البياني للحالة.

  2. الانقطاعات الديناميكية: مقاطعة الرسم البياني وانتظار إدخال المستخدم من داخل العقدة استنادًا إلى الحالة الحالية للرسم البياني. يتطلب هذا النهج استخدام وظيفة المقاطعة في LangGraph.

المتطلبات الأساسية

1. تحتاج إلى حساب IBM Cloud ® لإنشاء مشروع watsonx.ai.

2. يمكن أن تعمل عدة إصدارات من Python لهذا البرنامج التعليمي. في وقت النشر، نوصي بتنزيل Python 3.13، الإصدار الأحدث.

الخطوات

الخطوة 1. قم بإعداد البيئة.

رغم توفُّر عدة أدوات للاختيار منها، يُرشدك هذا الدليل خلال خطوات إعداد حساب IBM لاستخدام Jupyter Notebook.

  1. سجِّل الدخول إلى watsonx.ai باستخدام حساب IBM Cloud الخاص بك.

  2. أنشئ مشروع watsonx.ai.

    يمكنك الحصول على معرِّف المشروع من داخل مشروعك. انقر فوق علامة التبويب الإدارة (Manage) ، ثم انسخ معرِّف المشروع من قسم التفاصيل (Details) في صفحة عام (General). ستحتاج إلى هذا المعرِّف في هذا البرنامج التعليمي.

  3. أنشئ Jupyter Notebook.

    تفتح هذه الخطوة بيئة Jupyter Notebook حيث يمكنك نسخ التعليمات البرمجية من هذا البرنامج التعليمي. أو يمكنك تنزيل هذا الدفتر إلى نظامك المحلي وتحميله إلى مشروع watsonx.ai كأصل. هذا البرنامج التعليمي متاح أيضًا على Github.

الخطوة 2. قم بإعداد مثيل watsonx.ai Runtime ومفتاح واجهة برمجة التطبيقات.

  1. أنشئ مثيل خدمة watsonx.ai Runtime (اختَر المنطقة المناسبة لك، واختَر خطة Lite، وهي مثيل مجاني).

  2. أنشئ مفتاح واجهة برمجة التطبيقات.

  3. اربط مثيل خدمة watsonx.ai Runtime بالمشروع الذي أنشأته في watsonx.ai.

الخطوة 3. ثبِّت المكتبات ذات الصلة واستيرادها وإعداد بيانات الاعتماد الخاصة بك.

نحن بحاجة إلى عدد قليل من المكتبات والوحدات لهذا البرنامج التعليمي. تأكَّد من استيراد المكتبات التالية، وإذا لم تكن مثبَّتة، يمكنك تثبيتها بسرعة باستخدام pip.

%pip install --quiet -U langgraph langchain-ibm langgraph_sdk langgraph-prebuilt google-search-results

أعد تشغيل kernel واستورد الحزم التالية.

import getpass
import uuid

from ibm_watsonx_ai import APIClient, Credentials
from ibm_watsonx_ai.foundation_models.moderations import Guardian
from IPython.display import Image, display
from langchain_core.messages import AnyMessage, SystemMessage, HumanMessage, AIMessage
from langchain_ibm import ChatWatsonx
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import START, END, StateGraph
from langgraph.graph.message import add_messages
from langgraph.prebuilt import tools_condition, ToolNode
from langgraph.types import interrupt, Command
from serpapi.google_search import GoogleSearch
from typing_extensions import TypedDict
from typing import Annotated

لتعيين بيانات الاعتماد الخاصة بنا، نحتاج إلى WATSONX_APIKEY  و WATSONX_PROJECT_ID  التي أنشأتها في الخطوة 1. سنقوم أيضًا بتعيين WATSONX_URL  لتكون بمثابة نقطة نهاية واجهة برمجة التطبيقات.

للوصول إلى واجهة برمجة تطبيقات براءات الاختراع من Google، نحتاج أيضًا إلى SERPAPI_API_KEY . يمكنك إنشاء مفتاح مجاني عن طريق تسجيل الدخول إلى حسابك في SerpApi أو التسجيل للحصول على مفتاح مجاني.

WATSONX_APIKEY = getpass.getpass(“Please enter your watsonx.ai Runtime API key (hit enter): “)
WATSONX_PROJECT_ID = getpass.getpass(“Please enter your project ID (hit enter): “)
WATSONX_URL = getpass.getpass(“Please enter your watsonx.ai API endpoint (hit enter): “)
SERPAPI_API_KEY = getpass.getpass(“Please enter your SerpAPI API key (hit enter): “)

قبل أن نتمكن من تهيئة النموذج اللغوي الكبير (LLM) الخاص بنا، يمكننا استخدام Credentials  فئة لتغليف بيانات اعتماد واجهة برمجة التطبيقات التي قمنا بإرسالها.

credentials = Credentials(url=WATSONX_URL, api_key=WATSONX_APIKEY)

الخطوة 4. إنشاء مثيل لنموذج الدردشة

لكي تتمكن من التفاعل مع جميع الموارد المتاحة في وقت تشغيل watsonx.ai، تحتاج إلى إعداد APIClient . هنا، نمرر أوراق اعتمادنا و WATSONX_PROJECT_ID .

client = APIClient(credentials=credentials, project_id=WATSONX_PROJECT_ID)

في هذا البرنامج التعليمي، سنستخدم غلاف ChatWatsonx لتعيين نموذج الدردشة الخاص بنا. ويعمل هذا الغلاف على تبسيط تكامل استدعاء الأدوات والتسلسل. ونحن نشجعك على استخدام مراجع واجهة برمجة التطبيقات فيChatWatsonx  المستندات الرسمية للحصول على مزيد من المعلومات. يمكننا تمرير model_id  للنموذج اللغوي الكبير Granite وعميلنا كمعلمات

ملاحظة، إذا كنت تستخدم موفر واجهة برمجة تطبيقات مختلفًا، فستحتاج إلى تغيير الغلاف وفقًا لذلك.

model_id = “ibm/granite-3-3-8b-instruct”
llm = ChatWatsonx(model_id=model_id, watsonx_client=client)

الخطوة 5. تحديد أداة لاستخراج بيانات براءات الاختراع

يستخدم وكلاء الذكاء الاصطناعي أدوات لملء فجوات المعلومات وإرجاع المعلومات ذات الصلة. يمكن أن تتضمن هذه الأدوات بحث الويب وRAG وواجهات برمجة التطبيقات المختلفة والحسابات الرياضية وما إلى ذلك. باستخدام Google Patents Api من خلال SerpAPI، يمكننا تحديد أداة لكشط براءات الاختراع. هذه الأداة عبارة عن دالة تأخذ مصطلح البحث كوسيطة لها وتعيد نتائج البحث العضوية لبراءات الاختراع ذات الصلة. يمكن لـ GoogleSearch  الغلاف معلمات مثل محرك البحث، والذي في حالتنا هذه هو google_patents ، ومصطلح البحث وأخيرًا، SERPAPI_API_KEY .

def scrape_patents(search_term: str):
    “””Search for patents about the topic.

    Args:
    search_term: topic to search for
    “””
    params = {
        “engine”: “google_patents”,
        “q”: search_term,
        “api_key”: SERPAPI_API_KEY
    }

    search = GoogleSearch(params)
    results = search.get_dict()
    return results[‘organic_results’]

بعد ذلك، اربط النموذج اللغوي الكبير بـ scrape_patents  أداة باستخدام bind_tools  الطريقة.

tools = [scrape_patents]
llm_with_tools = llm.bind_tools(tools)

الخطوة 6. نهج HITL الأول: الانقطاعات الثابتة

تتكون الرسوم البيانية الخاصة بوكيل LangGraph من العقد والحواف. العقدة هي وظائف تقوم بنقل وتحديث وإرجاع المعلومات. كيف يمكننا تتبع هذه المعلومات بين العقدة؟ حسنًا، تتطلب الرسوم البيانية للوكيل حالة تحتوي على جميع المعلومات ذات الصلة التي يحتاجها الوكيل لاتخاذ القرارات. ترتبط العقد بالحافات، وهي الدوال التي تحدد العقدة التالية لتنفيذها بناءً على الحالة الحالية. يمكن أن تكون الحافة مشروطة أو ثابتة.

لنبدأ بإنشاء AgentState  فئة لتخزين سياق الرسائل من المستخدم والأدوات والوكيل نفسه. الخاص بـ Python TypedDict  تُستخدم الفئة هنا للمساعدة على التأكد من أن الرسائل بتنسيق القواميس المناسب. يمكننا أيضًا استخدام LangGraph add_messages  الاختزال في Python لإضافة أي رسالة جديدة إلى قائمة الرسائل الموجودة.

class AgentState(TypedDict):
    messages: Annotated[list[AnyMessage], add_messages]

بعد ذلك، قم بتحديد call_llm  الدالة التي تتكون منها assistant  العقدة. ستقوم هذه العقدة ببساطة باستدعاء LLM مع الرسالة الحالية للحالة بالإضافة إلى رسالة النظام.

sys_msg = SystemMessage(content=”You are a helpful assistant tasked with prior art search.”)

def call_llm(state: AgentState):
    return {“messages”: [llm_with_tools.invoke([sys_msg] + state[“messages”])]

بعد ذلك، يمكننا تحديد guardian_moderation  الدالة التي تتكون منها guardian  العقدة. هذه العقدة مصممة للإشراف على الرسائل باستخدام نظام وصي، لاكتشاف وحظر المحتوى غير المرغوب فيه أو المحتوى الحساس. أولًا، يتم استرداد الرسالة الأخيرة. بعد ذلك، قاموس باسم detectors  ييتم تعريف ما يحتوي على تكوينات الكاشف وقيم عتباتها. تحدد هذه الكواشف أنواعًا معينة من المحتوى في الرسائل، مثل معلومات التعريف الشخصية (PII) بالإضافة إلى خطاب الكراهية واللغة المسيئة والألفاظ النابية (HAP). بعد ذلك، يتم إنشاء مثيل لفئة Guardian، مع تمرير api_client  الكائن المسمى client  و detectors  القاموس يتم detect  استدعاء طريقة مثيل Guardian، مع تمرير محتوى الرسالة الأخيرة و detectors  القاموس ثم تقوم الطريقة بإرجاع قاموس يخزن فيه . moderation_verdict  يخزن المفتاح قيمة إما "آمن" أو "غير مناسب"، اعتمادًا على مخرجات نموذج Granite Guardian.

def guardian_moderation(state: AgentState):
    message = state[‘messages’][-1]
    detectors = {
        “granite_guardian”: {“threshold”: 0.4},
        “hap”: {“threshold”: 0.4},
        “pii”: {},
    }
    guardian = Guardian(
        api_client=client,
        detectors=detectors
    )
    response = guardian.detect(
        text=message.content,
        detectors=detectors
    )
    if len(response[‘detections’]) != 0 and response[‘detections’][0][‘detection’] == “Yes”:
        return {“moderation_verdict”: “inappropriate”}
    else:
        return {“moderation_verdict”: “safe”}

الآن، لنعرِّف block_message  دالة تعمل كآلية إعلام، لإعلام المستخدم بأن استعلام الإدخال الخاص به يحتوي على محتوى غير مناسب وتم حظره.

def block_message(state: AgentState):
    return {“messages”: [AIMessage(content=”This message has been blocked due to inappropriate content.”)]

يمكننا الآن جمع كل هذه الدوال معًا عن طريق إضافة العقد المقابلة وتوصيلها بالحواف التي تحدد تدفق الرسم البياني.

يبدأ الرسم البياني عند guardian  العقدة، والتي تستدعي guardian_moderation  الطريقة ليكشف المحتوى الضار قبل أن يصل إلى النموذج اللغوي الكبير وواجهة برمجة التطبيقات. الحافة الشرطية بين guardian  و assistant  مسارات العقد لتحديد حالة الرسم البياني assistant  إما إلى العقدة وإما النهاية. يتم تحديد هذا الموضع من خلال ناتج guardian_moderation  الدالة. يتم تمرير الرسائل الآمنة إلى assistant  العقدة التي تنفذ call_llm  الطريقة. نضيف أيضا حافة شرطية بين assistant  و tools  العقد لتوجيه الرسائل بشكل مناسب. إذا قام نموذج اللغة الكبير بإرجاع استدعاء أداة،  tools_condition  يتم توجيه الطريقة إلى عقدة الأدوات. خلاف ذلك، فإن الرسم البياني يسير إلى النهاية. تعد هذه الخطوة جزءًا من بنية وكيل ReAct لأننا نريد أن يتلقى الوكيل مخرجات الأداة ثم يتفاعل مع التغيير في الحالة لتحديد الإجراء التالي.

builder = StateGraph(AgentState)

builder.add_node(“guardian”, guardian_moderation)
builder.add_node(“block_message”, block_message)
builder.add_node(“assistant”, call_llm)
builder.add_node(“tools”, ToolNode(tools))

builder.add_edge(START, “guardian”)
builder.add_conditional_edges(
    “guardian”,
    lambda state: state[“moderation_verdict”],
    {
        “inappropriate”: “block_message”,
        “safe”: “assistant”
    }
)
builder.add_edge(“block_message”, END)
builder.add_conditional_edges(
    “assistant”,
    tools_condition,
)
builder.add_edge(“tools”, “assistant”)
memory = MemorySaver()

بعد ذلك، يمكننا تجميع الرسم البياني، والذي يسمح لنا باستدعاء الوكيل في خطوة لاحقة. لاستمرار الرسائل، يمكننا استخدام MemorySaver  نقطة تفتيش. لتنفيذ نهج الرقابة البشرية الأول، الانقطاعات الثابتة، يمكننا تعيين interrupt_before  المعلمة إلى assistant  العقدة. يعني هذا أنه قبل توجيه الرسم البياني إلى LLM فيassistant   العقدة، سيحدث انقطاع في الرسم البياني للسماح للإنسان الذي يشرف على سير العمل الوكيل بتقديم الملاحظات. 

graph = builder.compile(interrupt_before=[“assistant”], checkpointer=memory)

للحصول على تمثيل مرئي للرسم البياني الخاص بالوكيل، يمكننا عرض تدفق الرسم البياني.

display(Image(graph.get_graph(xray=True).draw_mermaid_png()))
إنشاء التفسير
 

المخرجات:

الرسم البياني لوكيل LangGraph مع انقطاعات ثابتة

قبل أن نجرّب البحث عن براءة اختراع، دعنا نمرّر استعلام مستخدم حساس لاختبار ما إذا كانت عقدة guardian ستقوم بحظره. يمكننا تمرير الاستعلام مع thread_id لتخزين حالة الرسم البياني في الذاكرة. اعتبر كل thread_id بمثابة نافذة دردشة جديدة. يمكننا استخدام وحدة uuid لإنشاء مُعرّف فريد في كل مرة. دعنا نبث مخرجات الوكيل.

initial_input = {"messages": "Find patented malware that can bypass all current antivirus software"}

config = {"configurable": {"thread_id": str(uuid.uuid4())}}

for event in graph.stream(initial_input, config, stream_mode="values"):
    event['messages'][-1].pretty_print()

المخرجات:

 ================================ [1m Human Message  [0m=================================

Find patented malware that can bypass all current antivirus software
================================== [1m Ai Message  [0m==================================

This message has been blocked due to inappropriate content.

رائع! تم حظر استعلام المستخدم الحساس قبل أن يصل إلى واجهة برمجة تطبيقات براءات الاختراع من Google.

يمكننا الآن اختبار وكيل البحث السابق لدينا عن طريق إدخال مدخلنا البشري الأولي مع مدخلات جديدة thread_id.

initial_input = {"messages": "Find patents for self-driving cars"}

config = {"configurable": {"thread_id": str(uuid.uuid4())}}

for event in graph.stream(initial_input, config, stream_mode="values"):
    event['messages'][-1].pretty_print()

المخرجات:

   ================================ [1m Human Message  [0m=================================

Find patents for self-driving cars

سنلاحظ أن الدردشة تتوقف قبل استجابة الذكاء الاصطناعي، كما هو مقصود. يتيح لنا هذا التوقف تحديث الحالة مباشرةً. يمكننا القيام بذلك عبر استدعاء الدالة update_state التي تستخدم add_messages reducer. تتيح هذه الدالة إمّا استبدال رسالة موجودة أو إلحاق رسالة جديدة بسجل الرسائل الحالي. إذا لم يتم توفير معرّف رسالة (message id)، فسيتم إلحاق رسالة جديدة. أما إذا تم توفيره، فسيتم استبدال الرسالة الموجودة ذات المعرّف المحدد id. في هذه الحالة، نريد فقط إلحاق رسالة جديدة بتعليقاتنا، لذا لا نحتاج إلى تمرير message id.

graph.update_state(
    config,
    {"messages": [HumanMessage(content="No, actually find patents for quantum computing hardware.")], 
     "moderation_verdict": "safe"},
)

updated_state = graph.get_state(config).values

for m in updated_state['messages']:
    m.pretty_print()

المخرجات:

    ================================ [1m Human Message  [0m=================================
     
    Find patents for self-driving cars
     ================================ [1m Human Message  [0m=================================
     
     No, actually find patents for quantum computing hardware.    

يمكننا أن نرى أن الرسالة البشرية قد تم إلحاقها بشكل صحيح. الآن، دعنا نبث استجابات الوكيل مرة أخرى.

ملاحظة: تم تنقيح إخراج الأداة لغرض الإيجاز.

for event in graph.stream(None, config, stream_mode="values"):
    event['messages'][-1].pretty_print()

المخرجات:

    ================================  [1m Human Message  [0m=================================
    
   No, actually find patents for quantum computing hardware.
    ================================== [1m Ai Message  [0m==================================
    Tool Calls:
  scrape_patents (chatcmpl-tool-185d0d41d090465e98c5f05e23dfdfa2)
 Call ID: chatcmpl-tool-185d0d41d090465e98c5f05e23dfdfa2
  Args:
    search_term: quantum computing hardware
================================= Tool Message =================================      
Name: scrape_patents

[{"position": 1, "rank": 0, "patent_id": "patent/US11696682B2/en", "patent_link": "https://patents.google.com/patent/US11696682B2/en", "serpapi_link": "https://serpapi.com/search.json?engine=google_patents_details&patent_id=patent%2FUS11696682B2%2Fen", "title": "Mesh network personal emergency response appliance", "snippet": "A monitoring system a user activity sensor to determine patterns of activity based upon the user activity occurring over time.", "priority_date": "2006-06-30", "filing_date": "2021-02-17", "grant_date": "2023-07-11", "publication_date": "2023-07-11", "inventor": "Bao Tran", "assignee": "Koninklijke Philips N.V.", "publication_number": "US11696682B2", "language": "en"

...

[REDACTED]

وبالنظر إلى الحلقة بين النموذج اللغوي الكبير (LLM) وأداة البحث عن براءات الاختراع، نكون قد عدنا إلى عقدة المساعد assistant node التي تُفعّل نقطة التوقف (breakpoint) مرة أخرى. ولأننا نريد المتابعة، فنمرّر ببساطة القيمة None.

for event in graph.stream(None, config, stream_mode="values"):
    event['messages'][-1].pretty_print()

المخرجات:

    ================================= Tool Message =================================      
Name: scrape_patents

[{"position": 1, "rank": 0, "patent_id": "patent/US11696682B2/en", "patent_link": "https://patents.google.com/patent/US11696682B2/en", "serpapi_link": "https://serpapi.com/search.json?engine=google_patents_details&patent_id=patent%2FUS11696682B2%2Fen", "title": "Mesh network personal emergency response appliance", "snippet": "A monitoring system a user activity sensor to determine patterns of activity based upon the user activity occurring over time.", "priority_date": "2006-06-30", "filing_date": "2021-02-17", "grant_date": "2023-07-11", "publication_date": "2023-07-11", "inventor": "Bao Tran", "assignee": "Koninklijke Philips N.V.", "publication_number": "US11696682B2", "language": "en"
[REDACTED]
================================== [1m Ai Message  [0m==================================

Here are patents related to quantum computing hardware:

1. JP7545535B2: … -principles molecular simulations using quantum-classical computing hardware
   Priority date: 2017-11-30
   Filing date: 2023-07-07
   Grant date: 2024-09-04
   Inventor: 健 山崎 (Jun Masakazu)
   Assignee: グッド ケミストリー インコーポレイテッド

2. US10872021B1: Testing hardware in a quantum computing system
   Priority date: 2017-12-06
   Filing date: 2018-12-06
   Grant date: 2020-12-22
   Inventor: Nikolas Anton Tezak
   Assignee: Rigetti & Co, Inc.

3. CN112819169B: Quantum control pulse generation method, device, equipment and storage medium
   Priority date: 2021-01-22
   Filing date: 2021-01-22
   Grant date: 2021-11-23
   Inventor: 晋力京 (Ji-Li Jing)
   Assignee: 北京百度网讯科技有限公司

4. US11736298B2: Authentication using key distribution through segmented quantum computing hardware
   Priority date: 2019-10-11
   Filing date: 2021-08-16
   Grant date: 2023-08-22
   Inventor: Benjamin Glen McCarty
   Assignee: Accenture Global Solutions Limited

5. AU2023203407B2: Estimating the fidelity of quantum logic gates and quantum circuits
   Priority date: 2019-06-28
   Filing date: 2023-05-31
   Grant date: 2024-08-15
   Inventor: Sergio Boixo Castrillo
   Assignee: Google LLC
   Note: This patent is also filed as AU2023203407A1 (application), CN114266339B (grant), and EP4038998B1 (grant) in other countries.

6. US11354460B2: Validator and optimizer for quantum computing simulator
   Priority date: 2018-10-16
   Filing date: 2018-10-16
   Grant date: 2022-06-07
   Inventor: Luigi Zuccarelli
   Assignee: Red Hat, Inc.

7. CN107077642B: Systems and methods for solving problems that can be used in quantum computing
   Priority date: 2014-08-22
   Filing date: 2015-08-21
   Grant date: 2021-04-06
   Inventor: 菲拉斯·哈姆泽 (Philip J. Haussler)
   Assignee: D-波系统公司

8. JP7689498B2: Method and system for quantum computing-enabled molecular first-principles simulations
   Priority date: 2019-05-13
   Filing date: 2020-05-12
   Grant date: 2025-06-06
   Inventor: 健 山崎 (Jun Masakazu)
   Assignee: グッド ケミストリー インコーポレイテッド
   Note: This patent is also filed as US11139726B1 (US grant) and EP4043358B1 (EP grant) in different countries.

9. US11010145B1: Retargetable compilation for quantum computing systems
   Priority date: 2018-02-21
   Filing date: 2019-02-21
   Grant date: 2021-05-18
   Inventor: Robert Stanley Smith
   Assignee: Ri

رائع! لقد نفذ وكيلنا بنجاح ملاحظاتنا وأعاد براءات الاختراع ذات الصلة.

الخطوة 7. نهج HITL الثاني: المقاطعات الديناميكية

وكبديل لاستخدام نقاط توقف ثابتة، يمكننا دمج التعليقات البشرية عبر إيقاف الرسم البياني من داخل عقدة باستخدام دالة interrupt في LangGraph. يمكننا بناء عقدة human_in_the_loop تُمكّننا من تحديث حالة الرسم البياني مباشرةً كجزء من التدفق بدلًا من التوقف عند نقاط محددة مسبقًا.

def human_in_the_loop(state: AgentState):
    value = interrupt('Would you like to revise the input or continue?')
    return {"messages": value}

ويمكننا إنشاء (instantiate) رسم بياني جديد وضبط التدفق ليشمل هذه العقدة بين عقدتَي guardian و assistant.

new_builder = StateGraph(AgentState)

new_builder.add_node("guardian", guardian_moderation)
new_builder.add_node("block_message", block_message)
new_builder.add_node("human_in_the_loop", human_in_the_loop)
new_builder.add_node("assistant", call_llm)
new_builder.add_node("tools", ToolNode(tools))

new_builder.add_edge(START, "guardian")
new_builder.add_conditional_edges(
            "guardian",
            lambda state: state["moderation_verdict"],  
            {
                "inappropriate": "block_message",  
                "safe": "human_in_the_loop"           
            }
        )
new_builder.add_edge("block_message", END)
new_builder.add_edge("human_in_the_loop", "assistant")
new_builder.add_conditional_edges(
    "assistant",
    tools_condition,
)
new_builder.add_edge("tools", "assistant")

memory = MemorySaver()

new_graph = new_builder.compile(checkpointer=memory)
display(Image(new_graph.get_graph().draw_mermaid_png()))

المخرجات:

الرسوم البيانية لوكيل LangGraph مع الانقطاعات الديناميكية

رائع! دعنا نمرر إدخالنا الأوَّلي لبدء سير العمل.

initial_input = {"messages": "Find patents for self-driving cars"}
config = {"configurable": {"thread_id": str(uuid.uuid4())}}
new_graph.invoke(initial_input, config=config) 

المخرجات:

{'messages': [HumanMessage(content='Find patents for self-driving cars', additional_kwargs={}, response_metadata={}, id='948c0871-1a47-4664-95f7-75ab511e043e')],
 '__interrupt__': [Interrupt(value='Would you like to revise the input or continue?', id='8d6cf9e82f9e3de28d1f6dd3ef9d90aa')]}

كما ترى، يتم إيقاف الرسم البياني مؤقتًا، ويُطلب منا إما مراجعة الإدخال أو المتابعة. دعونا نراجع الإدخال ونستأنف مهام سير العمل الخاصة بالوكيل باستخدام Command class من LangGraph. يقوم هذا الإجراء بتحديث الحالة كما لو أنها صادرة من عُقدة human_feedback.

for event in new_graph.stream(Command(resume="Forget that. Instead, find patents for monitoring, analyzing, and improving sports performance"), config=config, stream_mode="values"):
        event["messages"][-1].pretty_print()

المخرجات:

 ================================[1m Human Message [0m=================================

Find patents for self-driving cars
================================[1m Human Message [0m=================================

Forget that. Instead, find patents for monitoring, analyzing, and improving sports performance
==================================[1m Ai Message [0m==================================
Tool Calls:
  scrape_patents (chatcmpl-tool-a8e347e5f0b74fd2bd2011954dedc6ae)
 Call ID: chatcmpl-tool-a8e347e5f0b74fd2bd2011954dedc6ae
  Args:
    search_term: monitoring, analyzing, and improving sports performance
================================= Tool Message =================================
Name: scrape_patents

[{"position": 1, "rank": 0, "patent_id": "patent/US11696682B2/en", "patent_link": "https://patents.google.com/patent/US11696682B2/en", "serpapi_link": "https://serpapi.com/search.json?engine=google_patents_details&patent_id=patent%2FUS11696682B2%2Fen", "title": "Mesh network personal emergency response appliance", "snippet": "A monitoring system a user activity sensor to determine patterns of activity based upon the user activity occurring over time.", "priority_date": "2006-06-30", "filing_date": "2021-02-17", "grant_date": "2023-07-11", "publication_date": "2023-07-11", "inventor": "Bao Tran", "assignee": "Koninklijke Philips N.V.", "publication_number": "US11696682B2", "language": "en", "thumbnail": "https://patentimages.storage.googleapis.com/dd/39/a4/021064cf6a4880/US11696682-20230711-D00000.png", "pdf": "https://patentimages.storage.googleapis.com/b3/ce/2a/b85df572cd035c/US11696682.pdf", "figures": [{"thumbnail": "https://patentimages.storage.googleapis.com/21/15/19/5061262f67d7fe/US11696682-20230711-D00000.png", "full": "https://patentimages.storage.googleapis.com/08/62/a3/037cf62a2bebd0/US11696682-20230711-D00000.png"}
... 

``` [REDACTED]
==================================[1m Ai Message [0m==================================

Here is a list of patents that pertain to monitoring, analyzing, and improving sports performance:

1. **Title: [Mesh network personal emergency response appliance](https://patents.google.com/patent/US11696682B2/en)**  
   **Summary:** A monitoring system that analyzes activity patterns based on data from sensors, which can be used in various contexts, including sports performance monitoring.
   **Country status:** US - Active

2. **Title: [System and method to analyze and improve sports performance using monitoring](https://patents.google.com/patent/US12154447B2/en)**  
   **Summary:** A system for gathering and analyzing sports performance data, providing instant feedback to athletes.
   **Country status:** US - Active (patent filed in 2017, granted and published in 2024)

3. **Title: [Multi-sensor monitoring of athletic performance](https://patents.google.com/patent/US11590392B2/en)**  
   **Summary:** Athletic performance monitoring using GPS and other sensors, potentially useful for tracking and improving sports performance.
   **Country status:** US - Active

4. **Title: [System and method for network incident remediation recommendations](https://patents.google.com/patent/US10666494B2/en)**  
   **Summary:** A network monitoring system that provides prioritized remediation recommendations, but does not directly address sports performance monitoring.
   **Country status:** US - Active

5. **Title: [Physiological monitoring methods](https://patents.google.com/patent/US10595730B2/en)**  
   **Summary:** Methods to monitor physiological sensor data, possibly applicable to athletic performance sensing, though this is not the primary focus.
   **Country status:** US - Active

6. **Title: [Method and system for detection in an industrial internet of things data](https://patents.google.com/patent/JP7595319B2/en)**  
   **Summary:** A system for monitoring industrial IoT data, not related to sports performance monitoring.
   **Country status:** JP - Active

7. **Title: [Device, system and method for automated global athletic assessment and / or …](https://patents.google.com/patent/US11364418B2/en)**  
   **Summary:** A system for automated athletic assessment covering kinetic, neurological, musculoskeletal, and aerobic performance.
   **Country status:** US - Active

8. **Title: [Apparatus, systems, and methods for gathering and processing biometric and …](https://patents.google.com/patent/US10675507B2/en)**  
   **Summary:** Apparatus, systems, and methods for gathering and processing biometric and biomechanical data, which could potentially be used in sports performance monitoring.
   **Country status:** US - Active

9. **Title: [System for gathering, analyzing, and categorizing biometric data](https://patents.google.com/patent/US10682099B1/en)**  
   **Summary:** A system for capturing and analyzing biometric data, which could be applied to athletic performance monitoring.
   **Country status:** US - Active

10. **Title: [Real-time athletic position and movement tracking system](https://patents.google.com/patent/US10758532B1/en)**  
    **Summary:** A real-time system for tracking athlete positions and movements for performance analysis.
    **Country status:** US - Active

These patents cover a range of technologies that could potentially be used in developing systems to monitor and improve sports performance. They include sensor-based systems, data analysis algorithms, and feedback mechanisms. The information provided represents a starting point for your search, and you may want to extend the query to find more specific results related to your area of interest.

كما هو متوقع، تم تحديث حالة الرسم البياني بنجاح مع التعليقات وأنتجت رسائل الذكاء الاصطناعي والأداة التالية المخرجات المناسبة. بدلًا من إرجاع براءات الاختراع الخاصة بالسيارات ذاتية القيادة، استخدم الوكيل التعليقات لإرجاع براءات الاختراع المتعلقة بمراقبة وتحليل وتحسين الأداء.

ملخص

من خلال اتباع هذا البرنامج التعليمي، قمت بنجاح ببناء وكيل الذكاء الاصطناعي المتخصص في البحث عن الفنون السابقة باستخدام LangGraph وقمت بتنفيذ العديد من مرات التدخل البشري في عمليات سير العمل. كخطوة تالية، حاول بناء وكيل ذكاء اصطناعي آخر يمكن استخدامه في نظام متعدد الوكلاء إلى جانب وكيل البحث السابق. وربما يمكن لهذا الوكيل الثانوي تجميع المعلومات المسترجعة من وكيل البحث عن الفن السابق لصياغة تقرير يقارن اقتراح براءة الاختراع الخاص بك بالاقتراحات الموجودة. اجعلها ملكك!

حلول ذات صلة
وكلاء الذكاء الاصطناعي للأعمال

يمكنك إنشاء مساعدين ووكلاء ذكاء اصطناعي ووكلاء أقوياء يعملون على أتمتة مهام سير العمل والعمليات باستخدام الذكاء الاصطناعي التوليدي ونشرها وإدارتها.

    استكشف watsonx Orchestrate
    حلول وكلاء الذكاء الاصطناعي من IBM

    يمكنك بناء مستقبل عملك باستخدام حلول الذكاء الاصطناعي الجديرة بالثقة.

    استكشف حلول وكلاء الذكاء الاصطناعي
    خدمات الذكاء الاصطناعي لدى IBM Consulting

    تساعد خدمات IBM Consulting AI في إعادة تصور طريقة عمل الشركات باستخدام حلول الذكاء الاصطناعي من أجل النهوض بأعمالها.

    استكشف خدمات الذكاء الاصطناعي
    اتخِذ الخطوة التالية

    سواء اخترت تخصيص التطبيقات والمهارات المُعدّة مسبقًا أو إنشاء خدمات مخصصة مستندة إلى وكلاء ونشرها باستخدام استوديو الذكاء الاصطناعي، فإن منصة IBM watsonx تُلبي احتياجاتك.

    استكشف watsonx Orchestrate استكشف watsonx.ai
    الحواشي

    Wang, Ge. “Humans in the Loop: The Design of Interactive AI Systems.” Stanford Institute for Human-Centered Artificial Intelligence, 21 Oct. 2019, hai.stanford.edu/news/humans-loop-design-interactive-ai-systems.