⚡ สร้างตัวแทนภาษาเป็นกราฟ ⚡
บันทึก
กำลังมองหาเวอร์ชัน JS อยู่ใช่ไหม? คลิกที่นี่ (เอกสาร JS)
LangGraph เป็นไลบรารีสำหรับสร้างแอปพลิเคชันแบบมีสถานะและมีหลายตัวดำเนินการด้วย LLM ซึ่งใช้ในการสร้างเวิร์กโฟลว์ตัวแทนและหลายตัวแทน เมื่อเปรียบเทียบกับเฟรมเวิร์ก LLM อื่นๆ เฟรมเวิร์กนี้ให้ประโยชน์หลักเหล่านี้: วงจร ความสามารถในการควบคุม และความคงอยู่ LangGraph ช่วยให้คุณสามารถกำหนดโฟลว์ที่เกี่ยวข้องกับวงจร ซึ่งจำเป็นสำหรับสถาปัตยกรรมเอเจนต์ส่วนใหญ่ โดยสร้างความแตกต่างจากโซลูชันที่ใช้ DAG เนื่องจากเป็นเฟรมเวิร์กระดับต่ำมาก จึงให้การควบคุมอย่างละเอียดทั้งโฟลว์และสถานะของแอปพลิเคชันของคุณ ซึ่งสำคัญมากสำหรับการสร้างตัวแทนที่เชื่อถือได้ นอกจากนี้ LangGraph ยังมีความคงอยู่ในตัว ทำให้สามารถใช้งานคุณสมบัติหน่วยความจำและมนุษย์ในวงขั้นสูงได้
LangGraph ได้รับแรงบันดาลใจจาก Pregel และ Apache Beam อินเทอร์เฟซสาธารณะได้รับแรงบันดาลใจจาก NetworkX LangGraph สร้างโดย LangChain Inc ผู้สร้าง LangChain แต่สามารถใช้ได้โดยไม่ต้องใช้ LangChain
แพลตฟอร์ม LangGraph เป็นโครงสร้างพื้นฐานสำหรับการปรับใช้ตัวแทน LangGraph เป็นโซลูชันเชิงพาณิชย์สำหรับการปรับใช้แอปพลิเคชันเอเจนต์กับการใช้งานจริง ซึ่งสร้างขึ้นบนเฟรมเวิร์ก LangGraph แบบโอเพ่นซอร์ส แพลตฟอร์ม LangGraph ประกอบด้วยองค์ประกอบหลายอย่างที่ทำงานร่วมกันเพื่อสนับสนุนการพัฒนา การปรับใช้ การดีบัก และการตรวจสอบแอปพลิเคชัน LangGraph: เซิร์ฟเวอร์ LangGraph (API), LangGraph SDKs (ไคลเอนต์สำหรับ API), LangGraph CLI (เครื่องมือบรรทัดคำสั่งสำหรับการสร้างเซิร์ฟเวอร์ ), LangGraph Studio (UI/ดีบักเกอร์),
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ LangGraph โปรดดูหลักสูตร LangChain Academy หลักสูตรแรกของเรา Introduction to LangGraph ซึ่งให้บริการฟรีที่นี่
แพลตฟอร์ม LangGraph เป็นโซลูชันเชิงพาณิชย์สำหรับการปรับใช้แอปพลิเคชันเอเจนต์กับการใช้งานจริง ซึ่งสร้างขึ้นบนเฟรมเวิร์ก LangGraph แบบโอเพ่นซอร์ส ต่อไปนี้คือปัญหาทั่วไปบางประการที่เกิดขึ้นในการปรับใช้ที่ซับซ้อน ซึ่งแพลตฟอร์ม LangGraph กล่าวถึง:
pip install -U langgraph
หนึ่งในแนวคิดหลักของ LangGraph คือสถานะ การดำเนินการกราฟแต่ละครั้งจะสร้างสถานะที่ถูกส่งผ่านระหว่างโหนดในกราฟขณะที่ดำเนินการ และแต่ละโหนดจะอัปเดตสถานะภายในนี้ด้วยค่าที่ส่งคืนหลังจากดำเนินการแล้ว วิธีที่กราฟอัปเดตสถานะภายในนั้นถูกกำหนดโดยประเภทของกราฟที่เลือกหรือฟังก์ชันที่กำหนดเอง
มาดูตัวอย่างง่ายๆ ของตัวแทนที่สามารถใช้เครื่องมือค้นหากันดีกว่า
pip install langchain-anthropic
export ANTHROPIC_API_KEY=sk-...
อีกทางหนึ่ง เราสามารถตั้งค่า LangSmith เพื่อการสังเกตที่ดีที่สุดในระดับเดียวกันได้
export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY=lsv2_sk_...
from typing import Annotated , Literal , TypedDict
from langchain_core . messages import HumanMessage
from langchain_anthropic import ChatAnthropic
from langchain_core . tools import tool
from langgraph . checkpoint . memory import MemorySaver
from langgraph . graph import END , START , StateGraph , MessagesState
from langgraph . prebuilt import ToolNode
# Define the tools for the agent to use
@ tool
def search ( query : str ):
"""Call to surf the web."""
# This is a placeholder, but don't tell the LLM that...
if "sf" in query . lower () or "san francisco" in query . lower ():
return "It's 60 degrees and foggy."
return "It's 90 degrees and sunny."
tools = [ search ]
tool_node = ToolNode ( tools )
model = ChatAnthropic ( model = "claude-3-5-sonnet-20240620" , temperature = 0 ). bind_tools ( tools )
# Define the function that determines whether to continue or not
def should_continue ( state : MessagesState ) -> Literal [ "tools" , END ]:
messages = state [ 'messages' ]
last_message = messages [ - 1 ]
# If the LLM makes a tool call, then we route to the "tools" node
if last_message . tool_calls :
return "tools"
# Otherwise, we stop (reply to the user)
return END
# Define the function that calls the model
def call_model ( state : MessagesState ):
messages = state [ 'messages' ]
response = model . invoke ( messages )
# We return a list, because this will get added to the existing list
return { "messages" : [ response ]}
# Define a new graph
workflow = StateGraph ( MessagesState )
# Define the two nodes we will cycle between
workflow . add_node ( "agent" , call_model )
workflow . add_node ( "tools" , tool_node )
# Set the entrypoint as `agent`
# This means that this node is the first one called
workflow . add_edge ( START , "agent" )
# We now add a conditional edge
workflow . add_conditional_edges (
# First, we define the start node. We use `agent`.
# This means these are the edges taken after the `agent` node is called.
"agent" ,
# Next, we pass in the function that will determine which node is called next.
should_continue ,
)
# We now add a normal edge from `tools` to `agent`.
# This means that after `tools` is called, `agent` node is called next.
workflow . add_edge ( "tools" , 'agent' )
# Initialize memory to persist state between graph runs
checkpointer = MemorySaver ()
# Finally, we compile it!
# This compiles it into a LangChain Runnable,
# meaning you can use it as you would any other runnable.
# Note that we're (optionally) passing the memory when compiling the graph
app = workflow . compile ( checkpointer = checkpointer )
# Use the Runnable
final_state = app . invoke (
{ "messages" : [ HumanMessage ( content = "what is the weather in sf" )]},
config = { "configurable" : { "thread_id" : 42 }}
)
final_state [ "messages" ][ - 1 ]. content
"Based on the search results, I can tell you that the current weather in San Francisco is:nnTemperature: 60 degrees FahrenheitnConditions: FoggynnSan Francisco is known for its microclimates and frequent fog, especially during the summer months. The temperature of 60°F (about 15.5°C) is quite typical for the city, which tends to have mild temperatures year-round. The fog, often referred to as "Karl the Fog" by locals, is a characteristic feature of San Francisco's weather, particularly in the mornings and evenings.nnIs there anything else you'd like to know about the weather in San Francisco or any other location?"
ตอนนี้เมื่อเราส่ง "thread_id"
เดียวกัน บริบทการสนทนาจะถูกเก็บรักษาไว้ผ่านสถานะที่บันทึกไว้ (เช่น รายการข้อความที่เก็บไว้)
final_state = app . invoke (
{ "messages" : [ HumanMessage ( content = "what about ny" )]},
config = { "configurable" : { "thread_id" : 42 }}
)
final_state [ "messages" ][ - 1 ]. content
"Based on the search results, I can tell you that the current weather in New York City is:nnTemperature: 90 degrees Fahrenheit (approximately 32.2 degrees Celsius)nConditions: SunnynnThis weather is quite different from what we just saw in San Francisco. New York is experiencing much warmer temperatures right now. Here are a few points to note:nn1. The temperature of 90°F is quite hot, typical of summer weather in New York City.n2. The sunny conditions suggest clear skies, which is great for outdoor activities but also means it might feel even hotter due to direct sunlight.n3. This kind of weather in New York often comes with high humidity, which can make it feel even warmer than the actual temperature suggests.nnIt's interesting to see the stark contrast between San Francisco's mild, foggy weather and New York's hot, sunny conditions. This difference illustrates how varied weather can be across different parts of the United States, even on the same day.nnIs there anything else you'd like to know about the weather in New York or any other location?"
ChatAnthropic
เป็น LLM ของเรา หมายเหตุ: เราต้องแน่ใจว่าโมเดลรู้ว่ามีเครื่องมือเหล่านี้ให้โทรได้ เราสามารถทำได้โดยการแปลงเครื่องมือ LangChain ให้อยู่ในรูปแบบสำหรับการเรียกใช้เครื่องมือ OpenAI โดยใช้เมธอด .bind_tools()
StateGraph
) โดยผ่านสคีมาสถานะ (ในกรณีของเรา MessagesState
)MessagesState
เป็น state schema ที่สร้างไว้ล่วงหน้าซึ่งมีหนึ่งแอตทริบิวต์ - รายการของวัตถุ LangChain Message
รวมถึงตรรกะสำหรับการรวมการอัปเดตจากแต่ละโหนดเข้ากับสถานะมีสองโหนดหลักที่เราต้องการ:
agent
: รับผิดชอบในการตัดสินใจว่าจะดำเนินการใด (ถ้ามี)tools
ที่เรียกใช้เครื่องมือ: หากตัวแทนตัดสินใจที่จะดำเนินการ โหนดนี้จะดำเนินการดังกล่าว ขั้นแรก เราต้องตั้งค่าจุดเริ่มต้นสำหรับการประมวลผลกราฟ - โหนด agent
จากนั้นเราจะกำหนดหนึ่งขอบปกติและหนึ่งขอบแบบมีเงื่อนไข Edge แบบมีเงื่อนไขหมายความว่าปลายทางขึ้นอยู่กับเนื้อหาของสถานะของกราฟ ( MessageState
) ในกรณีของเรา จะไม่ทราบจุดหมายปลายทางจนกว่าตัวแทน (LLM) จะตัดสินใจ
.invoke()
, .stream()
และ .batch()
โดยอัตโนมัติด้วยอินพุตของคุณMemorySaver
- ตัวตรวจสอบในหน่วยความจำอย่างง่าย LangGraph เพิ่มข้อความอินพุตให้กับสถานะภายใน จากนั้นส่งสถานะไปยังโหนดจุดเข้าใช้งาน "agent"
โหนด "agent"
ดำเนินการ โดยเรียกใช้โมเดลการแชท
โมเดลการแชทส่งคืน AIMessage
LangGraph เพิ่มสิ่งนี้ให้กับสถานะ
กราฟจะวนขั้นตอนต่อไปนี้จนกว่าจะไม่มี tool_calls
บน AIMessage
อีกต่อไป :
AIMessage
มี tool_calls
โหนด "tools"
จะดำเนินการ"agent"
ดำเนินการอีกครั้งและส่งกลับ AIMessage
การดำเนินการดำเนินไปจนถึงค่า END
พิเศษและส่งออกสถานะสุดท้าย และด้วยเหตุนี้ เราจึงได้รับรายการข้อความแชททั้งหมดของเราเป็นผลลัพธ์
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการมีส่วนร่วม โปรดดูที่นี่