Mengawasi pencarian invensi yang sudah ada oleh agen AI dengan keterlibatan manusia menggunakan LangGraph dan watsonx.ai

Penulis

Anna Gutowska

AI Engineer, Developer Advocate

IBM

Dalam tutorial ini, Anda akan menerapkan keterlibatan manusia sebagai mekanisme masukan untuk sistem agen Anda yang dibangun dengan LangGraph dan watsonx.ai. Agen Anda akan memiliki spesialisasi dalam pencarian invensi yang sudah ada, sebuah contoh penggunaan dunia nyata yang bisa menjadi upaya manual yang membosankan. Agen Anda akan menggunakan API Paten Google melalui SerpApi untuk memeriksa paten dan memberikan masukan tentang saran paten. Model bahasa besar (LLM) pilihan adalah IBM Granite sumber terbuka.

Munculnya AI agen telah mengilhami pengembang untuk mengalihkan fokus dan upaya mereka dari chatbot LLM dasar ke otomatisasi. Kata "otomatisasi" biasanya menyiratkan penghilangan keterlibatan manusia dari pelaksanaan tugas.1 Akankah Anda mempercayai agen AI untuk memutuskan pilihan penting dalam hidup yang berkaitan dengan keuangan pribadi Anda, misalnya? Kebanyakan kita enggan melakukannya. Bagaimana jika sejumlah ambiguitas dapat memberi pengguna akhir kepercayaan yang hilang ini? Lapisan nuansa ini dapat berbentuk intervensi manusia, yang dikenal sebagai keterlibatan manusia.

Keterlibatan manusia

Keterlibatan manusia (HITL) adalah pola arsitektur di mana masukan manusia diperlukan untuk memandu pengambilan keputusan aplikasi LLM dan memberikan pengawasan. Dalam ranah kecerdasan buatan, HITL menandakan adanya campur tangan manusia pada tahap tertentu dalam alur kerja AI. Metode ini menjamin ketepatan, keamanan, dan akuntabilitas.

Manusia dapat meninjau dan memperbarui status grafik secara asinkron di LangGraph karena status eksekusi yang persisten. Dengan menggunakan titik pemeriksaan status setelah setiap langkah, konteks status dapat dipertahankan dan alur kerja dapat dijeda sampai masukan manusia diterima.

Dalam tutorial ini, kita akan bereksperimen dengan dua pendekatan HITL di LangGraph.

  1. Interupsi statis: Mengedit status grafik secara langsung pada titik yang telah ditentukan sebelum atau sesudah node tertentu dieksekusi. Pendekatan ini membutuhkan parameter interrupt_before atau interrupt_after yang harus diatur ke daftar nama node saat menyusun grafik status.

  2. Interupsi dinamis: Menginterupsi grafik dan menunggu input pengguna dari dalam sebuah node berdasarkan kondisi grafik saat ini. Pendekatan ini membutuhkan penggunaan fungsi interupsi LangGraph.

Prasyarat

1. Anda memerlukan akun IBM Cloud untuk membuat proyek watsonx.ai.

2. Beberapa versi Python dapat berfungsi untuk tutorial ini. Pada saat penerbitan, kami sarankan untuk mengunduh Python 3.13 versi terbaru.

Langkah-langkah

Langkah 1. Siapkan lingkungan Anda.

Meskipun terdapat pilihan beberapa alat, tutorial ini akan memandu Anda untuk menyiapkan akun IBM menggunakan Jupyter Notebook.

  1. Masuk ke watsonx.ai dengan menggunakan akun IBM Cloud Anda.

  2. Buat proyek watsonx.ai.

    Anda bisa mendapatkan ID proyek dari dalam proyek Anda. Klik tab Kelola . Kemudian, salin ID proyek dari bagian Detail di halaman Umum . Anda memerlukan ID ini untuk tutorial ini.

  3. Buat Jupyter Notebook.

    Langkah ini akan membuka lingkungan Jupyter Notebook tempat Anda dapat menyalin kode dari tutorial ini. Sebagai alternatif, Anda dapat mengunduh notebook ini ke sistem lokal Anda dan mengunggahnya ke proyek watsonx.ai Anda sebagai aset. Tutorial ini juga tersedia di Github.

Langkah 2. Siapkan instance waktu proses watsonx.ai dan kunci API.

  1. Buat instans layanan Waktu proses watsonx.ai (pilih wilayah yang sesuai dan pilih paket Lite, yang merupakan instans gratis).

  2. Buat Kunci API.

  3. Kaitkan instans layanan waktu proses watsonx.ai ke proyek yang Anda buat di watsonx.ai.

Langkah 3. Instal dan impor pustaka yang relevan dan atur kredensial Anda.

Kita membutuhkan beberapa pustaka dan modul untuk tutorial ini. Pastikan untuk mengimpor yang berikut ini dan jika tidak diinstal, instalasi pip cepat akan menyelesaikan masalah.

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

Mulai ulang kernel dan impor paket berikut.

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

Untuk mengatur kredensial, kita memerlukan WATSONX_APIKEY  dan WATSONX_PROJECT_ID  yang Anda buat di Langkah 1. Kita juga akan mengatur WATSONX_URL  yang akan berfungsi sebagai titik akhir API.

Untuk mengakses API Paten Google, kita juga memerlukan SERPAPI_API_KEY . Anda dapat membuat kunci gratis dengan pencatatan ke akun SerpApi Anda atau mendaftar.

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): “)

Sebelum dapat mengawali LLM, kita dapat menggunakan kelas Credentials  untuk merangkum kredensial API yang kita teruskan.

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

Langkah 4. Buat instans model obrolan

Untuk dapat berinteraksi dengan semua sumber daya yang tersedia di waktu proses watsonx.ai, Anda perlu mengatur APIClient . Di sini, kita meneruskan kredensial dan WATSONX_PROJECT_ID .

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

Untuk tutorial ini, kita akan menggunakan pembungkus ChatWatsonX untuk mengatur model obrolan kita. Pembungkus ini menyederhanakan integrasi pemanggilan dan penghubungan alat. Kami sarankan untuk menggunakan referensi API diChatWatsonx  dokumen resmi untuk informasi lebih lanjut. Kita bisa melewati kita model_id  untuk Granite LLM dan klien kita sebagai parameter.

Catatan, jika Anda menggunakan penyedia API berbeda, Anda perlu mengubah dengan pembungkus yang sesuai.

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

Langkah 5. Tentukan alat pengekstrak paten

Agen AI menggunakan alat untuk mengisi kesenjangan informasi dan memberikan informasi yang relevan. Semua alat ini dapat mencakup pencarian web, RAG, berbagai API, komputasi matematika, dan sebagainya. Dengan menggunakan API Paten Google melalui SerpApi, kita dapat menentukan alat untuk mengekstrak paten. Alat ini adalah fungsi yang mengambil istilah pencarian sebagai argumennya dan menampilkan hasil pencarian organik untuk paten terkait. Pembungkus GoogleSearch  membutuhkan parameter seperti mesin pencari yang dalam kasus kita adalah google_patents , istilah pencarian, dan terakhir,  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’]

Selanjutnya, mari kita ikat LLM ke scrape_patents alat menggunakan bind_tools metode .

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

Langkah 6. Pendekatan HITL pertama: Interupsi statis

Grafik agen LangGraph terdiri dari node dan tepi. Node adalah fungsi yang menyampaikan, memperbarui, dan menghasilkan informasi. Bagaimana kita melacak informasi ini di antara berbagai node? Nah, grafik agen memerlukan status yang menyimpan semua informasi relevan yang dibutuhkan agen untuk membuat keputusan. Node terhubung oleh tepi yang merupakan fungsi yang memilih node berikutnya untuk dijalankan berdasarkan status saat ini. Bagian tepi dapat bersifat bersyarat atau tetap.

Mari kita mulai dengan membuat sebuah AgentState  kelas untuk menyimpan konteks pesan dari pengguna, alat, dan agen itu sendiri. Python TypedDict  kelas digunakan di sini untuk membantu memastikan pesan berada dalam format kamus yang sesuai. Kita juga bisa menggunakan LangGraph add_messages fungsi peredam untuk menambahkan pesan baru ke daftar pesan yang ada.

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

Selanjutnya, tentukan fungsi call_llm  yang menyusun node assistant node . Node ini hanya akan memanggil LLM dengan pesan status saat ini serta pesan sistem.

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”])]

Selanjutnya, kita dapat menetapkan fungsi guardian_moderation  yang menyusun node guardian node . Node ini dirancang untuk memoderasi pesan dengan menggunakan sistem penjaga, untuk deteksi dan memblokir konten yang tidak diinginkan atau sensitif. Pertama, pesan terakhir diambil. Selanjutnya, sebuah kamus bernama detectors  ditetapkan yang berisi konfigurasi detektor dan nilai ambang batasnya. Detektor ini mengidentifikasi jenis konten tertentu dalam pesan, seperti informasi identifikasi pribadi (PII) serta ujaran kebencian, bahasa yang menghina, dan kata-kata kotor (HAP). Selanjutnya, contoh kelas Guardian dibuat, meneruskan objek api_client  bernama client  dan detectors kamus . Metode detect  dari instans Guardian dipanggil, meneruskan isi pesan terakhir dan kamus detectors  . Metode ini kemudian menghasilkan kamus di mana kunci moderation_verdict  kunci menyimpan nilai “aman” atau “tidak pantas,” tergantung pada output model 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”}

Sekarang, mari kita definisikan block_message  yang berfungsi sebagai mekanisme notifikasi, menginformasikan kepada pengguna bahwa kueri input mereka mengandung konten yang tidak pantas dan telah diblokir.

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

Sekarang kita dapat menggabungkan semua fungsi ini dengan menambahkan node yang sesuai dan menghubungkannya dengan tepi yang menetapkan aliran grafik.

Grafik dimulai di node guardian  yang memanggil metode guardian_moderation metode untuk mendeteksi konten berbahaya sebelum mencapai LLM dan API. Tepi bersyarat antara guardian  dan assistant  mengarahkan status grafik ke node assistant  atau bagian akhir. Posisi ini ditentukan oleh output fungsi guardian_moderation  . Pesan aman diteruskan ke node assistant  yang mengeksekusi metode call_llm  . Kami juga menambahkan tepi bersyarat antara node assistant  dan tools  untuk mengarahkan pesan dengan tepat. Jika LLM menghasilkan pemanggilan alat, metode tools_condition  akan mengarahkan ke node alat. Jika tidak, grafik akan mengarahkan ke bagian akhir. Langkah ini merupakan bagian dari arsitektur agen ReAct karena kami ingin agen menerima output alat kemudian bereaksi terhadap perubahan status untuk menentukan tindakan selanjutnya.

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()

Selanjutnya, kita dapat menyusun grafik yang memungkinkan kita untuk memanggil agen dalam langkah selanjutnya. Untuk mempertahankan pesan, kita dapat menggunakan MemorySaver titik pemeriksa . Untuk menerapkan pendekatan pengawasan manusia pertama, interupsi statis, kita dapat mengatur interrupt_before parameter ke node assistant  . Ini berarti bahwa sebelum grafik mengarahkan ke LLM di node assistant  , interupsi akan terjadi pada grafik yang memungkinkan manusia mengawasi alur kerja agen untuk memberikan masukan.

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

Untuk mendapatkan representasi visual dari grafik agen, kita dapat menampilkan aliran grafik.

display(Image(graph.get_graph(xray=True).draw_mermaid_png()))
Menghasilkan penjelasan
 

Output:

Grafik Agen LangGraph dengan Interupsi Statis

Sebelum kita mencoba pencarian paten, mari kita lewati permintaan pengguna yang sensitif untuk menguji apakah node penjaga akan memblokirnya. Kita dapat meneruskan kueri bersama dengan thread_id untuk menyimpan status grafik dalam memori. Bayangkan setiap thread_id sebagai mewakili jendela obrolan baru. Kita dapat menggunakan modul uuid untuk menghasilkan ID unik setiap kali. Mari kita streaming output agen.

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()

Output:

 ================================ [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.

Hebat! Kueri pengguna sensitif diblokir sebelum mencapai API Paten Google.

Kita sekarang dapat menguji agen pencarian seni sebelumnya dengan memberikan input manusia awal kita bersama dengan thread_ id baru.

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()

Output:

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

Find patents for self-driving cars

Kita dapat melihat bahwa obrolan terputus sebelum respons AI, sebagaimana dimaksud. Gangguan ini memungkinkan kami untuk memperbarui status secara langsung. Kita dapat melakukannya dengan memanggil fungsi update_state yang menggunakan reducer add_messages. Fungsi reducer ini memungkinkan kita untuk menimpa atau menambahkan pesan baru ke pesan yang sudah ada. Jika tidak ada id pesan yang diberikan, maka pesan baru ditambahkan. Jika tidak, pesan yang ada dengan id tertentu akan diganti. Dalam hal ini, kami hanya ingin menambahkan pesan baru dengan masukan kami, jadi kami tidak perlu menambahkan id pesan.

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()

Output:

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

Kita dapat melihat bahwa pesan manusia ditambahkan dengan benar. Sekarang, mari kita tampilkan respons agen sekali lagi.

Catatan: Output alat telah disunting untuk singkatnya.

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

Output:


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]

Mengingat loop antara LLM dan alat pencarian paten, kami telah kembali ke node asisten yang melibatkan breakpoint sekali lagi. Karena kita ingin melanjutkan, kita hanya melewati None.

untuk setiap kejadian dalam graph.stream(None, config, stream_mode="values"):
    event['messages'][-1].pretty_print()

Output:

    ================================= 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": "Perangkat tanggap darurat pribadi jaringan mesh", "snippet": "Sistem pemantauan sensor aktivitas pengguna untuk menentukan pola aktivitas berdasarkan aktivitas pengguna yang terjadi dari waktu ke waktu.", "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"
    
    ...
    
    ================================= 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

Hebat! Agen kami telah berhasil menerapkan masukan kami dan mengembalikan paten yang relevan.

Langkah 7. Pendekatan HITL kedua: Interupsi dinamis

Sebagai alternatif untuk menggunakan breakpoint statis, kita dapat menggabungkan masukan manusia dengan menjeda grafik dari dalam node dengan menggunakan fungsi interrupt LangGraph. Kita dapat membangun node human_in_the_loop yang memungkinkan kita untuk secara langsung memperbarui keadaan grafik sebagai bagian dari aliran daripada berhenti pada titik yang telah ditentukan.

def human_in_the_loop(state: AgentState):
    value = interrupt('Apakah Anda ingin merevisi input atau melanjutkan?')
    return {"messages": value}

Kita dapat menginstansiasi graf baru dan menyesuaikan aliran untuk memasukkan node ini di antara node guardian dan node 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, "wali")
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()))

Output:

Grafik Agen LangGraph dengan Interupsi Dinamis

Hebat! Mari kita teruskan input awal untuk memulai alur kerja agen.

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

Output:

{'messages': [HumanMessage(content='Find patents for self-driving cars', additional_kwargs={}, response_metadata={}, id='948c0871-1a47-4664-95f7-75ab511e043e')],
 '__interrupt__': [Interrupt(value='Anda ingin merevisi input atau melanjutkan?', id='8d6cf9e82f9e3de28d1f6dd3ef9d90aa')]}

Seperti yang Anda lihat, grafik terganggu dan kami diprompt untuk merevisi input atau Lanjutkan. Mari kita merevisi input dan melanjutkan alur kerja agen dengan menggunakan kelas Command LangGraph. Tindakan ini memperbarui status seolah-olah berasal dari node human_feedback.

for event in new_graph.stream(Command(resume="Lupakan . Sebagai gantinya, temukan paten untuk memantau, menganalisis, dan meningkatkan kinerja olahraga"), config=config, stream_mode="values"):
        event["messages"][-1].pretty_print()

Output:

    ================================[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.

Seperti yang diharapkan, status grafik berhasil diperbarui dengan masukan kami, dan pesan AI dan alat berikut menghasilkan output yang sesuai. Alih-alih menampilkan paten untuk mobil otonom, agen menggunakan masukan manusia untuk menampilkan paten yang terkait dengan pemantauan, analisis, dan peningkatan kinerja olahraga.

Ringkasan

Dengan mengikuti tutorial ini, Anda berhasil membangun agen AI yang mengkhususkan diri dalam pencarian invensi yang sudah ada dengan LangGraph dan menerapkan beberapa alur kerja keterlibatan manusia. Sebagai langkah selanjutnya, cobalah membangun agen AI lain yang dapat digunakan dalam sistem multiagen bersama dengan agen pencarian invensi yang sudah ada. Mungkin agen sekunder ini dapat menggabungkan informasi yang diambil dari agen pencarian invensi yang sudah ada untuk kemudian merumuskan laporan yang membandingkan proposal paten Anda dengan yang sudah ada. Jadikan invensi Anda sebagai milik Anda!

Solusi terkait
Agen AI untuk bisnis

Bangun, terapkan, dan kelola asisten dan agen AI yang kuat yang mengotomatiskan alur kerja dan proses dengan AI generatif.

    Menjelajahi watsonx Orchestrate
    Solusi agen AI IBM

    Bangun masa depan bisnis Anda dengan solusi AI yang dapat Anda percaya.

    Jelajahi solusi agen AI
    Layanan AI IBM Consulting

    Layanan IBM Consulting AI membantu merancang ulang cara kerja bisnis dengan AI untuk transformasi.

    Jelajahi layanan kecerdasan buatan
    Ambil langkah selanjutnya

    Baik Anda memilih untuk menyesuaikan aplikasi dan keterampilan yang dibangun sebelumnya atau membangun dan menerapkan layanan agen khusus menggunakan studio AI, platform IBM watsonx siap membantu Anda.

    Menjelajahi watsonx Orchestrate Jelajahi watsonx.ai
    Catatan kaki

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