LangChain против LangGraph: роли, пользователи и когда выбирать тот или иной инструмент
Что владеет LangChain, а что — LangGraph: цепочки против устойчивых графов, для кого предназначена каждая библиотека, а также чек-лист для выбора подходящего инструмента.
В этом руководстве воссоздаётся рабочий путь для книги «LangChain и LangGraph: что это такое, кто их использует и как с их помощью создавать ИИ-агентов». Особое внимание уделяется контрактам, проверкам и коду, который можно просто добавить в репозиторий без необходимости угадывать его назначение. Для получения обзора необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не пытаясь угадать скрытое состояние. Конфигурацию следует хранить отдельно от кода приложения: файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь граф.
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
Сообщение от AI Mind
Для реализации функции «Сообщение от AI Mind» необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не пытаясь угадать скрытое состояние. Необходимо одновременно задокументировать успешный сценарий работы и сценарий восстановления. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не этапом последующей доработки. Строго ограничьте схемы инструментов. Широкие параметры в виде свободного текста способствуют внедрению угроз и затрудняют аудит.
Чек-лист операционной деятельности
Для операционного чек-листа необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Записывайте время выполнения и затраты рядом с функциональными результатами. Раннее отслеживание помогает избежать неожиданных счетов при переходе от демо-среды к общедоступным средам.
Устанавливайте точку контроля после дорогостоящих вызовов модели, чтобы повторная попытка не влекла за собой повторной оплаты той же работы.
Сохраняйте структуру графа простой и типизированной. Вложенные структуры данных маскируют информацию о том, какой узел записал какое поле, и мешают возобновлению работы после прерываний.
Напишите краткий руководство: как обновлять ключи, как опустошать очередь, как откатить последние изменения.
Предпочитайте небольшие, тестируемые единицы кода большим скриптам. При сбое шага причина должна быть связана с конкретной функцией, а не с запутанной цепочкой операций.
Перед внедрением стека заморозьте версии, сделайте копию «золотого» варианта выполнения для критической цепочки операций и уточните шаги возврата к предыдущему состоянию. В совместных средах необходимы ограничения на частоту запросов, проверки принадлежности ресурсов и четко определенный ответственный за обновление секретов. Лучше выбирать надежность, даже если она кажется скучной, чем умные одноразовые демонстрации.
Для усиления безопасности на этапе 0 определите входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг, исходя из известной точки контроля, без необходимости угадывать скрытое состояние системы.
Храните конфигурацию отдельно от кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь кодовый граф.
Разделяйте планирование и выполнение с помощью инструментов. Планировщик предлагает варианты; исполнитель вносит изменения; проверщик сравнивает результаты с поставленной целью.
Что касается рекомендации по усилению безопасности №1, необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Лучше использовать небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое шага причина должна быть связана с конкретной функцией, а не с запутанной структурой обработки данных.
Строго ограничьте схемы инструментов. Широкие параметры в виде свободного текста способствуют внедрению угроз и затрудняют аудит.
Что касается рекомендации по усилению безопасности №2, необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Фиксируйте время выполнения и затраты вместе с функциональными результатами. Отслеживание на ранних этапах предотвращает неожиданные расходы при переходе с демо-среды в общедоступные среды.
Точка контроля после дорогостоящих вызовов модели, чтобы повторная попытка не приводила к повторной оплате за одну и ту же работу.
Что касается рекомендации 3 по усилению безопасности, необходимо определить входные данные, ответственного за шаг и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Документируйте одновременно успешный сценарий выполнения и сценарий восстановления. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не последующими улучшениями.
Разделяйте планирование и выполнение с помощью инструментов. Планировщик предлагает варианты; исполнитель вносит изменения; проверщик сравнивает результаты с поставленной целью.