This commit is contained in:
2026-06-04 16:41:36 +00:00
parent 7e7d9dcc4e
commit 03febd4b7d
+40 -34
View File
@@ -1,66 +1,68 @@
from langgraph.graph import StateGraph, START, END from langgraph.graph import StateGraph, START, END
from state import ReflectState from state import ReflectState
from nodes import draft_answer, reflect, rewrite from nodes import generate_answer
def should_continue(state: ReflectState) -> str: def should_retry(state: ReflectState) -> str:
"""Функция-условие: продолжать или завершить""" """
# Проверяем вердикт Условие: продолжать попытки или завершить
if state["verdict"] == "ok": Проверяет наличие ошибки и количество попыток
print(f"✅ Ответ принят после {state['round']} раундов") """
# Если ошибки нет - успех
if state["error"] is None:
print(f"✅ Ответ успешно сгенерирован за {state['round']} попыт(ок/ки)")
return "end" return "end"
# Проверяем лимит раундов # Если есть ошибка и не превышен лимит - повторяем
if state["round"] >= state["max_rounds"]: if state["round"] < state["max_rounds"]:
print(f"⚠️ Достигнут лимит раундов ({state['max_rounds']}). Возвращаем последнюю версию.") print(f"🔄 Повторная попытка ({state['round'] + 1}/{state['max_rounds']})...")
return "retry"
# Превышен лимит - завершаем с ошибкой
print(f"⚠️ Достигнут лимит попыток ({state['max_rounds']}). Последняя ошибка: {state['error']}")
return "end" return "end"
# Требуется доработка def build_retry_graph(max_rounds: int = 3):
print(f"🔄 Запускаем раунд доработки {state['round'] + 1}/{state['max_rounds']}") """
return "rewrite" Строит граф с retry-логикой через try/except
def build_reflection_graph(max_rounds: int = 2): Структура:
"""Строит граф с рефлексией""" START → generate_answer → should_retry
# Инициализация графа с состоянием → (если error None) → END
→ (если error и round < max_rounds) → generate_answer (с увеличенным round)
→ иначе → END
"""
graph = StateGraph(ReflectState) graph = StateGraph(ReflectState)
# Добавляем узлы # Добавляем единственный узел (он же будет вызываться повторно)
graph.add_node("draft_answer", draft_answer) graph.add_node("generate_answer", generate_answer)
graph.add_node("reflect", reflect)
graph.add_node("rewrite", rewrite)
# Добавляем рёбра # Добавляем рёбра
graph.add_edge(START, "draft_answer") graph.add_edge(START, "generate_answer")
graph.add_edge("draft_answer", "reflect")
# Условное ребро после рефлексии # Условное ребро после генерации
graph.add_conditional_edges( graph.add_conditional_edges(
"reflect", "generate_answer",
should_continue, should_retry,
{ {
"rewrite": "rewrite", "retry": "generate_answer", # Петля для повторной попытки
"end": END "end": END
} }
) )
# После rewrite возвращаемся на reflect для повторной оценки
graph.add_edge("rewrite", "reflect")
# Компилируем граф
return graph.compile() return graph.compile()
# Пример использования # Пример использования
if __name__ == "__main__": if __name__ == "__main__":
# Создаём граф # Создаём граф
app = build_reflection_graph(max_rounds=2) app = build_retry_graph(max_rounds=3)
# Входное состояние # Входное состояние
initial_state = { initial_state = {
"question": "Объясни студенту разницу между tool и resource в MCP", "question": "Объясни студенту разницу между tool и resource в MCP",
"draft": "", "draft": "",
"critique": "", "error": None,
"verdict": "needs_revision",
"round": 1, "round": 1,
"max_rounds": 2 "max_rounds": 3
} }
# Запуск # Запуск
@@ -68,6 +70,10 @@ if __name__ == "__main__":
# Вывод результата # Вывод результата
print("\n" + "="*80) print("\n" + "="*80)
print("ФИНАЛЬНЫЙ ОТВЕТ:") if final_state["error"] is None:
print("✅ ФИНАЛЬНЫЙ ОТВЕТ:")
print("="*80) print("="*80)
print(final_state["draft"]) print(final_state["draft"])
else:
print("❌ НЕ УДАЛОСЬ СГЕНЕРИРОВАТЬ КАЧЕСТВЕННЫЙ ОТВЕТ")
print(f"Ошибка: {final_state['error']}")