לפני שמתחילים
במדריך הזה אנחנו יוצאים מנקודת הנחה שקראתם את ההוראות במאמרים הבאים ופעלתם לפיהן:
- יצירת סוכן LangGraph: כדי ליצור את
agentכמופע שלLanggraphAgent. - אימות משתמשים כדי לבצע אימות כמשתמש לצורך שליחת שאילתות לסוכן.
- מייבאים ומפעילים את ה-SDK כדי להפעיל את הלקוח לקבלת מופע שנפרס (אם צריך).
קבלת מופע של סוכן
כדי לשלוח שאילתה ל-LanggraphAgent, צריך קודם ליצור מכונה חדשה או לקבל מכונה קיימת.
כדי לקבל את LanggraphAgent שמתאים למזהה משאב ספציפי:
Agent Platform SDK
מריצים את הקוד הבא:
import agentplatform
client = agentplatform.Client( # For service interactions via client.runtimes
project="PROJECT_ID",
location="LOCATION",
)
agent = client.runtimes.get(name="projects/PROJECT_ID/locations/LOCATION/reasoningEngines/RESOURCE_ID")
print(agent)
איפה
-
PROJECT_IDהוא Google Cloud מזהה הפרויקט שבו יוצרים ופורסים סוכנים, ו -
LOCATIONהוא אחד מהאזורים הנתמכים. -
RESOURCE_IDהוא המזהה של הסוכן שנפרס כמשאבreasoningEngine.
ספריית הבקשות של Python
מריצים את הקוד הבא:
from google import auth as google_auth
from google.auth.transport import requests as google_requests
import requests
def get_identity_token():
credentials, _ = google_auth.default()
auth_request = google_requests.Request()
credentials.refresh(auth_request)
return credentials.token
response = requests.get(
f"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/reasoningEngines/RESOURCE_ID",
headers={
"Content-Type": "application/json; charset=utf-8",
"Authorization": f"Bearer {get_identity_token()}",
},
)
API בארכיטקטורת REST
curl \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/reasoningEngines/RESOURCE_IDכשמשתמשים ב-Agent Platform SDK, האובייקט agent תואם למחלקה AgentRuntime שכוללת את המאפיינים הבאים:
agent.api_resourceעם מידע על הסוכן שהופעל. אפשר גם לקרוא לפונקציהagent.operation_schemas()כדי להחזיר את רשימת הפעולות שהסוכן תומך בהן. פרטים נוספים זמינים במאמר בנושא פעולות נתמכות.-
agent.api_clientשמאפשרת אינטראקציות סינכרוניות עם שירותים agent.async_api_clientשמאפשרת אינטראקציות אסינכרוניות בין שירותים
בהמשך הקטע הזה נניח שיש לכם מכונת AgentRuntime שנקראת agent.
פעולות נתמכות
הפעולות הבאות נתמכות ב-LanggraphAgent:
-
query: לקבלת תשובה לשאילתה באופן סינכרוני. -
stream_query: להצגת תשובה לשאילתה באופן שוטף. -
get_state: כדי לקבל נקודת ביקורת ספציפית. -
get_state_history: כדי להציג את נקודות הבדיקה של שרשור. -
update_state: ליצירת ענפים שמתאימים לתרחישים שונים.
הזרמת תשובה לשאילתה
כדי להזרים תשובה, משתמשים בשיטה LanggraphAgent.stream_query.
LangGraph תומך בכמה מצבי סטרימינג. העיקריים שבהם הם:
-
values: במצב הזה, המערכת מעבירה בסטרימינג את המצב המלא של הגרף אחרי כל קריאה לצומת. -
updates: במצב הזה, העדכונים של מצב הגרף מועברים בסטרימינג אחרי כל קריאה לצומת.
כדי להזרים אחורה values (בהתאם למצב המלא של הגרף):
for state_values in agent.stream_query(
input=inputs,
stream_mode="values",
config={"configurable": {"thread_id": "streaming-thread-values"}},
):
print(state_values)
כדי להזרים בחזרה updates (בהתאם לעדכונים של מצב הגרף):
for state_updates in agent.stream_query(
input=inputs,
stream_mode="updates",
config={"configurable": {"thread_id": "streaming-thread-updates"}},
):
print(state_updates)
שילוב גורם אנושי
ב-LangGraph, היבט נפוץ של שילוב בני אדם בתהליך הוא הוספת נקודות עצירה כדי להפריע לרצף הפעולות של הסוכן, ולאפשר לאדם להמשיך את התהליך בשלב מאוחר יותר.
בדיקה
אפשר להגדיר נקודות עצירה באמצעות הארגומנטים interrupt_before= או interrupt_after= כשקוראים לפונקציה .query או .stream_query:
from langchain.load import load as langchain_load
response = agent.query(
input=inputs,
interrupt_before=["tools"], # after generating the function call, before invoking the function
interrupt_after=["tools"], # after getting a function response, before moving on
config={"configurable": {"thread_id": "human-in-the-loop-deepdive"}},
)
langchain_load(response['messages'][-1]).pretty_print()
הפלט אמור להיראות כך:
================================== Ai Message ==================================
Tool Calls:
get_exchange_rate (12610c50-4465-4296-b1f3-d751ec959fd5)
Call ID: 12610c50-4465-4296-b1f3-d751ec959fd5
Args:
currency_from: USD
currency_to: SEK
אישור
כדי לאשר את הקריאה שנוצרה לכלי ולהמשיך עם שאר ההפעלה, צריך להעביר את None לקלט ולציין את השרשור או את נקודת הבדיקה בתוך config:
from langchain.load import load as langchain_load
response = agent.query(
input=None, # Continue with the function call
interrupt_before=["tools"], # after generating the function call, before invoking the function
interrupt_after=["tools"], # after getting a function response, before moving on
config={"configurable": {"thread_id": "human-in-the-loop-deepdive"}},
)
langchain_load(response['messages'][-1]).pretty_print()
הפלט אמור להיראות כך:
================================= Tool Message =================================
Name: get_exchange_rate
{"amount": 1.0, "base": "USD", "date": "2024-11-14", "rates": {"SEK": 11.0159}}
היסטוריה
כדי להציג רשימה של כל נקודות הבדיקה של שרשור נתון, משתמשים בשיטה LanggraphAgent.get_state_history:
for state_snapshot in agent.get_state_history(
config={"configurable": {"thread_id": "human-in-the-loop-deepdive"}},
):
if state_snapshot["metadata"]["step"] >= 0:
print(f'step {state_snapshot["metadata"]["step"]}: {state_snapshot["config"]}')
state_snapshot["values"]["messages"][-1].pretty_print()
print("\n")
התגובה תהיה דומה לרצף הפלט הבא:
step 3: {'configurable': {'thread_id': 'human-in-the-loop-deepdive', 'checkpoint_ns': '', 'checkpoint_id': '1efa2e95-ded5-67e0-8003-2d34e04507f5'}}
================================== Ai Message ==================================
The exchange rate from US dollars to Swedish krona is 1 USD to 11.0159 SEK.
step 2: {'configurable': {'thread_id': 'human-in-the-loop-deepdive', 'checkpoint_ns': '', 'checkpoint_id': '1efa2e95-d189-6a77-8002-5dbe79e2ce58'}}
================================= Tool Message =================================
Name: get_exchange_rate
{"amount": 1.0, "base": "USD", "date": "2024-11-14", "rates": {"SEK": 11.0159}}
step 1: {'configurable': {'thread_id': 'human-in-the-loop-deepdive', 'checkpoint_ns': '', 'checkpoint_id': '1efa2e95-cc7f-6d68-8001-1f6b5e57c456'}}
================================== Ai Message ==================================
Tool Calls:
get_exchange_rate (12610c50-4465-4296-b1f3-d751ec959fd5)
Call ID: 12610c50-4465-4296-b1f3-d751ec959fd5
Args:
currency_from: USD
currency_to: SEK
step 0: {'configurable': {'thread_id': 'human-in-the-loop-deepdive', 'checkpoint_ns': '', 'checkpoint_id': '1efa2e95-c2e4-6f3c-8000-477fd654cb53'}}
================================ Human Message =================================
What is the exchange rate from US dollars to Swedish currency?
אחזור ההגדרה של שלב
כדי לקבל נקודת ביקורת מוקדמת יותר, מציינים את checkpoint_id (ואת checkpoint_ns). קודם כל, חוזרים אחורה לשלב 1, כשנוצרת קריאת הכלי:
snapshot_config = {}
for state_snapshot in agent.get_state_history(
config={"configurable": {"thread_id": "human-in-the-loop-deepdive"}},
):
if state_snapshot["metadata"]["step"] == 1:
snapshot_config = state_snapshot["config"]
break
print(snapshot_config)
הפלט אמור להיראות כך:
{'configurable': {'thread_id': 'human-in-the-loop-deepdive',
'checkpoint_ns': '',
'checkpoint_id': '1efa2e95-cc7f-6d68-8001-1f6b5e57c456'}}
מסע בזמן
כדי לקבל נקודת ביקורת, משתמשים בשיטה LanggraphAgent.get_state:
# By default, it gets the latest state [unless (checkpoint_ns, checkpoint_id) is specified]
state = agent.get_state(config={"configurable": {
"thread_id": "human-in-the-loop-deepdive",
}})
print(f'step {state["metadata"]["step"]}: {state["config"]}')
state["values"]["messages"][-1].pretty_print()
כברירת מחדל, הוא מקבל את נקודת הבדיקה האחרונה (לפי חותמת זמן). הפלט אמור להיראות כך:
step 3: {'configurable': {'thread_id': 'human-in-the-loop-deepdive', 'checkpoint_ns': '', 'checkpoint_id': '1efa2e95-ded5-67e0-8003-2d34e04507f5'}}
================================== Ai Message ==================================
The exchange rate from US dollars to Swedish krona is 1 USD to 11.0159 SEK.
אחזור נקודת ביקורת של הגדרה
עבור הגדרה מסוימת (לדוגמה, snapshot_config מההגדרה של שלב), אפשר לקבל את נקודת הבדיקה המתאימה:
state = agent.get_state(config=snapshot_config)
print(f'step {state["metadata"]["step"]}: {state["config"]}')
state["values"]["messages"][-1].pretty_print()
הפלט אמור להיראות כך:
step 1: {'configurable': {'thread_id': 'human-in-the-loop-deepdive', 'checkpoint_ns': '', 'checkpoint_id': '1efa2e95-cc7f-6d68-8001-1f6b5e57c456'}}
================================== Ai Message ==================================
Tool Calls:
get_exchange_rate (12610c50-4465-4296-b1f3-d751ec959fd5)
Call ID: 12610c50-4465-4296-b1f3-d751ec959fd5
Args:
currency_from: USD
currency_to: SEK
הפעלה מחדש
כדי להפעיל מחדש ממצב נתון, מעבירים את הגדרת המצב (למשל state["config"])
לסוכן. הגדרת המצב היא מילון שנראה כך:
{'configurable': {'thread_id': 'human-in-the-loop-deepdive',
'checkpoint_ns': '',
'checkpoint_id': '1efa2e95-cc7f-6d68-8001-1f6b5e57c456'}}
כדי להפעיל מחדש מנקודה מסוימת state["config"] (שבה נוצרה קריאה לכלי), מציינים None בקלט:
from langchain.load import load as langchain_load
for state_values in agent.stream_query(
input=None, # resume
stream_mode="values",
config=state["config"],
):
langchain_load(state_values["messages"][-1]).pretty_print()
התוצאה תהיה דומה לרצף הפלטים הבא:
================================== Ai Message ==================================
Tool Calls:
get_exchange_rate (12610c50-4465-4296-b1f3-d751ec959fd5)
Call ID: 12610c50-4465-4296-b1f3-d751ec959fd5
Args:
currency_from: USD
currency_to: SEK
================================= Tool Message =================================
Name: get_exchange_rate
{"amount": 1.0, "base": "USD", "date": "2024-11-14", "rates": {"SEK": 11.0159}}
================================== Ai Message ==================================
The exchange rate from US dollars to Swedish krona is 1 USD to 11.0159 SEK.
התפצלות
אפשר ליצור הסתעפות מנקודות ביקורת קודמות כדי לנסות תרחישים חלופיים באמצעות ה-method LanggraphAgent.update_state:
branch_config = agent.update_state(
config=state["config"],
values={"messages": [last_message]}, # the update we want to make
)
print(branch_config)
הפלט אמור להיראות כך:
{'configurable': {'thread_id': 'human-in-the-loop-deepdive',
'checkpoint_ns': '',
'checkpoint_id': '1efa2e96-0560-62ce-8002-d1bb48a337bc'}}
אנחנו יכולים לשלוח שאילתה לנציג התמיכה עם branch_config כדי להמשיך מנקודת הבדיקה עם המצב המעודכן:
from langchain.load import load as langchain_load
for state_values in agent.stream_query(
input=None, # resume
stream_mode="values",
config=branch_config,
):
langchain_load(state_values["messages"][-1]).pretty_print()
התוצאה תהיה דומה לרצף הפלטים הבא:
================================== Ai Message ==================================
Tool Calls:
get_exchange_rate (12610c50-4465-4296-b1f3-d751ec959fd5)
Call ID: 12610c50-4465-4296-b1f3-d751ec959fd5
Args:
currency_date: 2024-09-01
currency_from: USD
currency_to: SEK
================================= Tool Message =================================
Name: get_exchange_rate
{"amount": 1.0, "base": "USD", "date": "2024-08-30", "rates": {"SEK": 10.2241}}
================================== Ai Message ==================================
The exchange rate from US dollars to Swedish krona on 2024-08-30 was 1 USD to 10.2241 SEK.