⚡ Membangun agen bahasa sebagai grafik ⚡
Catatan
Mencari versi JS? Klik di sini (dokumen JS).
LangGraph adalah perpustakaan untuk membangun aplikasi multi-aktor yang stateful dengan LLM, yang digunakan untuk membuat alur kerja agen dan multi-agen. Dibandingkan dengan kerangka LLM lainnya, kerangka ini menawarkan manfaat inti berikut: siklus, pengendalian, dan ketekunan. LangGraph memungkinkan Anda menentukan alur yang melibatkan siklus, yang penting bagi sebagian besar arsitektur agen, sehingga membedakannya dari solusi berbasis DAG. Sebagai kerangka kerja tingkat rendah, kerangka ini memberikan kontrol menyeluruh atas alur dan status aplikasi Anda, yang penting untuk menciptakan agen yang andal. Selain itu, LangGraph menyertakan persistensi bawaan, yang memungkinkan fitur human-in-the-loop dan memori tingkat lanjut.
LangGraph terinspirasi oleh Pregel dan Apache Beam. Antarmuka publik mengambil inspirasi dari NetworkX. LangGraph dibuat oleh LangChain Inc, pencipta LangChain, namun dapat digunakan tanpa LangChain.
LangGraph Platform adalah infrastruktur untuk menyebarkan agen LangGraph. Ini adalah solusi komersial untuk menerapkan aplikasi agen ke produksi, yang dibangun di atas kerangka kerja sumber terbuka LangGraph. Platform LangGraph terdiri dari beberapa komponen yang bekerja sama untuk mendukung pengembangan, penerapan, debugging, dan pemantauan aplikasi LangGraph: LangGraph Server (API), LangGraph SDK (klien untuk API), LangGraph CLI (alat baris perintah untuk membangun server ), LangGraph Studio (UI/debugger),
Untuk mempelajari lebih lanjut tentang LangGraph, lihat kursus LangChain Academy pertama kami, Pengantar LangGraph , tersedia gratis di sini.
LangGraph Platform adalah solusi komersial untuk menerapkan aplikasi agen ke produksi, yang dibangun di atas kerangka kerja LangGraph sumber terbuka. Berikut adalah beberapa masalah umum yang muncul dalam penerapan kompleks, yang ditangani oleh Platform LangGraph:
pip install -U langgraph
Salah satu konsep sentral LangGraph adalah negara. Setiap eksekusi grafik menciptakan keadaan yang diteruskan antar node dalam grafik saat mereka mengeksekusi, dan setiap node memperbarui keadaan internal ini dengan nilai kembaliannya setelah dieksekusi. Cara grafik memperbarui status internalnya ditentukan oleh jenis grafik yang dipilih atau fungsi kustom.
Mari kita lihat contoh sederhana agen yang bisa menggunakan alat pencarian.
pip install langchain-anthropic
export ANTHROPIC_API_KEY=sk-...
Secara opsional, kita dapat menyiapkan LangSmith untuk kemampuan observasi terbaik di kelasnya.
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?"
Sekarang ketika kita meneruskan "thread_id"
yang sama, konteks percakapan dipertahankan melalui status tersimpan (yaitu daftar pesan yang disimpan)
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
sebagai LLM kami. CATATAN: kita perlu memastikan model mengetahui bahwa ia memiliki alat yang tersedia untuk dipanggil. Kita dapat melakukan ini dengan mengonversi alat LangChain ke dalam format pemanggilan alat OpenAI menggunakan metode .bind_tools()
.StateGraph
) dengan meneruskan skema status (dalam kasus kami MessagesState
)MessagesState
adalah skema status bawaan yang memiliki satu atribut -- daftar objek LangChain Message
, serta logika untuk menggabungkan pembaruan dari setiap node ke dalam statusAda dua node utama yang kita butuhkan:
agent
: bertanggung jawab untuk memutuskan tindakan apa (jika ada) yang harus diambil.tools
yang memanggil alat: jika agen memutuskan untuk mengambil suatu tindakan, simpul ini kemudian akan menjalankan tindakan tersebut. Pertama, kita perlu menetapkan titik masuk untuk eksekusi grafik - node agent
.
Kemudian kita mendefinisikan satu sisi normal dan satu sisi bersyarat. Tepi bersyarat berarti bahwa tujuan bergantung pada konten status grafik ( MessageState
). Dalam kasus kami, tujuannya tidak diketahui sampai agen (LLM) memutuskan.
.invoke()
, .stream()
dan .batch()
dengan input AndaMemorySaver
- checkpointer sederhana dalam memori LangGraph menambahkan pesan input ke status internal, lalu meneruskan status tersebut ke node titik masuk, "agent"
.
Node "agent"
dijalankan, memanggil model obrolan.
Model obrolan mengembalikan AIMessage
. LangGraph menambahkan ini ke negara bagian.
Graph memutar langkah-langkah berikut hingga tidak ada lagi tool_calls
di AIMessage
:
AIMessage
memiliki tool_calls
, node "tools"
akan dijalankan"agent"
dijalankan lagi dan mengembalikan AIMessage
Eksekusi berlanjut ke nilai END
khusus dan menghasilkan status akhir. Dan sebagai hasilnya, kami mendapatkan daftar semua pesan obrolan kami sebagai keluaran.
Untuk informasi lebih lanjut tentang cara berkontribusi, lihat di sini.