LangChain kontra LangGraph: role, użytkownicy i kiedy wybrać jeden z nich
Co posiada LangChain, a co LangGraph: łańcuchy w porównaniu z trwałymi grafami, do kogo faktycznie przeznaczona jest każda z tych bibliotek oraz lista kontrolna pomocna przy wyborze jednej z nich.
To przewodnik pokazuje, jak odbudować funkcjonalną ścieżkę dla: LangChain i LangGraph Explained: Co to jest, kto je używa oraz jak tworzyć agenty AI przy ich pomocy. Skupiamy się na kontraktach, sprawdzaniach oraz kodzie, który można umieścić w repozytorium bez konieczności domyślania się intencji. Aby uzyskać ogólny obraz, należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać oddzielnie od kodu aplikacji. Pliki środowiskowe, magazyny tajemnic oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całego grafu.
llm = ChatOpenAI()
if (userAskedForFlights()) {
callFlightApi();
}
if (resultsAvailable()) {
summarizeResults();
}
User Question
↓
Reason
↓
Search Tool
↓
Analyze Result
↓
Answer
User Request
|
+---- Search
|
+---- Database
|
+---- Human Approval
|
v
Continue
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gpt-4o"
)
def get_weather(city):
return weather_api(city)
tools = [get_weather]
Need weather information
weather = get_weather("Bangalore")
{
"temperature": 34,
"condition": "Sunny"
}
The current temperature in Bangalore is 34°C and the weather is sunny.
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gpt-4o"
)
response = llm.invoke(
"Explain microservices in simple terms."
)
print(response.content)
User Request
|
v
Analyze Request
|
+---- Search Agent
|
+---- Database Agent
|
+---- Human Review
|
v
Generate Final Response
from langgraph.graph import StateGraph
builder = StateGraph(AgentState)
builder.add_node("search", search_node)
builder.add_node("answer", answer_node)
builder.set_entry_point("search")
builder.add_edge("search", "answer")
graph = builder.compile()
class AgentState(TypedDict):
question: str
search_result: str
answer: str
Example:
{
"question": "What is LangGraph?",
"search_result": "",
"answer": ""
}
def search_node(state):
...
builder.add_node("search", search_node)
builder.add_node("answer", answer_node)
builder.add_edge(
"search",
"answer"
)
builder.set_entry_point("search")
graph = builder.compile()
State
│
▼
┌─────────────┐
│ Search │ ← Node
└─────────────┘
│
│ ← Edge
▼
┌─────────────┐
│ Answer │ ← Node
└─────────────┘
│
▼
Updated State
Wiadomość od AI Mind
Dla funkcji „Wiadomość od AI Mind” należy zdefiniować dane wejściowe, osobę odpowiedzialną za daną czynność oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić tę czynność na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy udokumentować zarówno standardowy przebieg działania, jak i ścieżkę naprawczą. Próby ponownych działań, kontrola przez ludzi oraz obsługa nieudanych wiadomości stanowią część produktu, a nie elementy dodawane później. Schematy narzędzi muszą być ściśle określone. Zbyt szerokie pola tekstowe sprzyjają infekcjom i utrudniają audyty.
Listwa kontrolna operacyjna
Dla listy kontrolnej operacyjnej należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie wykonać dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu.
Zapisuj czas trwania i koszty obok wyników funkcjonalnych. Wczesna widoczność zapobiega niespodziewanym rachunkom, gdy proces przechodzi z środowiska demonstracyjnego do współdzielonych środowisk.
Ustaw punkt kontrolny po drogich wywołaniach modeli, aby ponowna próba nie generowała dodatkowych opłat za tę samą pracę.
Zachowuj prosty i typowany stan grafu. Zagłębione struktury ukrywają informację o tym, który węzeł zapisał dane do którego pola, co utrudnia kontynuację pracy po przerwach.
Napisz krótki podręcznik: jak rotować klucze, jak opróżniać kolejkę z zadań, jak cofnąć ostatnią zmianę.
Niech lepsze będą małe, testowalne jednostki niż rozbudowane skrypty. Gdy jakiś krok zawiedzie, powinien wskazywać na konkretną odpowiedzialność, a nie na skomplikowany łańcuch operacji.
Zanim zaczniesz promować tę architekturę, zamroź wersje, stwórz dokładny zapis procesu dla kluczowych etapów i potwierdź kroki odwracania zmian. Środowiska współdzielone wymagają ograniczeń szybkości, weryfikacji uprawnień oraz wyraźnego właściciela odpowiedzialnego za rotację haseł. Wolimy nudną niezawodność od pomysłowych, jednorazowych demonstracji.
W ramach wzmocnienia bezpieczeństwa, zdefiniuj wprowadzane dane, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu systemu.
Zachowaj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny haseł oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić, nie musząc czytać całej struktury systemu.
Rozdziel planowanie od wykonywania zadań za pomocą narzędzi. Planista proponuje rozwiązania; wykonawca je wdraża; sprawdzający porównuje wyniki z założonym celem.
W odniesieniu do zasady wzmocnienia nr 1 należy określić dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić ten krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu.
Należy preferować małe, testowalne jednostki zamiast rozbudowanych skryptów. Gdy jakiś krok zawiedzie, powinien wskazywać na konkretną odpowiedzialność, a nie na skomplikowaną strukturę procesów.
Schematy narzędzi należy ściśle ograniczyć. Szerokie pola tekstowe sprzyjają infekcjom i sprawiają, że audyty są kosztowne.
W odniesieniu do zasady wzmocnienia nr 2 również należy określić dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić ten krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu.
Należy rejestrować czasy wykonywania i koszty obok wyników funkcjonalnych. Wczesna widoczność tych informacji zapobiega nieoczekiwanym kosztom, gdy proces przechodzi z środowiska demonstracyjnego do współdzielonych środowisk.
Punkt kontrolny po drogich wywołaniach modeli, aby ponowna próba nie generowała dodatkowych opłat za tę samą pracę.
W odniesieniu do zasady 3 dotyczącej wzmocnienia bezpieczeństwa, należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu.
Należy udokumentować zarówno prawidłowy przebieg procesu, jak i ścieżkę naprawczą. Próby ponowne, kontrola ludzka oraz obsługa błędów stanowią część produktu, a nie elementy dodawane później.
Rozdziel planowanie od wykonywania zadań za pomocą narzędzi. Planista proponuje rozwiązania; wykonawca je wdraża; sprawdzający porównuje wyniki z założonym celem.
Literatura pokrewna
- Dlaczego zespoły migrują z LangChain chains do LangGraph workflows — Agenci produkcyjne wymagają trwałego stanu, gałęzi oraz mechanizmów HITL. Narzędzia LangChain należy zachować wewnątrz węzłów; przesuń strumień sterowania do wyraźnego grafu, gdy tego wymaga możliwość obsługi.
- Rozbijanie wielokierunkowych wiadomości ludzkich na plany podzadań LangGraph — Kierownicy powinni analizować złożone prośby ludzi na typowane podzadania, aby zespoły obsługujące prośby i wyszukiwanie nie przejmowały niewłaściwego tematu z wspólnej wiadomości.