Практычныя прыказкі: Стварэнне мнагаагентнай системы з нуля — Частка 6
Практычныя прыказкі: Стварэнне мнагаагентнай системы з нуля — Частка 6: контракты, перакантрольванні та слоты для коду для команд, якія викорыстоўваюць гэты патэрн.
Наступныя прыміткі паказваюць практычны шлях для выконання задачі «Стварэнне мнага-агентскай системы з нуля — Частка 6: Адзірнаемасць і адлагоўкі». Акцэнт ставяецца на кантракты, перакрычанні та месця для коду, які можна легка заменіць, а не на мотывацыйныя аспекты. Калі працуеце на стадіі агледзення, спачатку запісайце кантракт: неабяжныя вхідныя даны, сигнал успеху та тое, што выканаецца у разе частковага невыпання. Такі список дапамагае залишацца чыстым пад час пазнейшых змян у кодзе. Валіце маленькія, тэставаныя елементы заместо величзіных скрыптав. Калі якісь крок не выйшоў, прычына невыпання павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач.
Што павінен адражаць траец?
Этап «Што трэба выявіць» працюе найкраща, калі яго розглядаць як вимерную паверхню. Запісаце адна «золатая» транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да попераднего стану перш чым расширваць масштабы. Разглядзіце этап як кантракт межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Даце назвы артыфактам, задаце критэрыі успеху і не прабуйце завершыць задачу часткова без адзінаго заўважэння. Храніце стан графа у простам і типаваным формате. Вкладзеныя блокі маскуюць інфармацыю пра тое, який вузел запісаў канкрэтны поле, і спакоююць продажчыку роботы пасля перарываў.
blog-pipeline
├── research-agent
│ ├── search-web
│ └── research-model
├── writer-agent
│ └── writer-model
├── citation-check
│ └── citation-review-model
└── reviewer-agent
└── reviewer-model
Працэс з’яеднання Langfuse з LangGraph
Этап падзею Connect Langfuse да LangGraph работае наякраўей, калі яго спрыяваць як мерыемую паверхню. Запісаце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметку па адвярненню перад расшырэнням масштаба. Запісвайце часы выканання і кост токенав або запытаў разам з функцыйнальнымі рэзултатамі. Відразы костаў з самага пачатку запобегае неспакойным рахункам, калі працэс пераходзіць з дэмовай среды ў спяльнаныя сераўы. Храніце стан графа ў простам і типаваным формате. Вкладзеныя блокі маскуюць інфармацыю пра тое, який вузел запісаў які поле, і спакштуюць продажчыку роботу пасля перарываў.
pip install -U langfuse
export LANGFUSE_PUBLIC_KEY="pk-lf-..."
export LANGFUSE_SECRET_KEY="sk-lf-..."
export LANGFUSE_BASE_URL="https://cloud.langfuse.com"
export LANGFUSE_TRACING_ENVIRONMENT="development"
from langfuse import get_client, propagate_attributes
from langfuse.langchain import CallbackHandler
langfuse = get_client()
langfuse_handler = CallbackHandler()
Запісвайце весь процес выканання статыі
Этап Trace one complete article працюе найкраща, калі яго розглядаць як вимерную паверхню. Зберагачыце адны ідеальны транскрыпт, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перад расшырэнням масштаба. Зберагачыце настройкі пазначкай за межамі коду прыемліка. Файлы сераўіснага сераўісу, хранілішчы секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць контроль без неабяжнага чытання всіх дадзеных. Зберагачыце стан графа ў простам і типаванам формате. Вярнутыя структуры дадзеных маскуюць інфармацыю пра тое, канфігурацыйны вузел запісаў канкрэтнае поле, і спакойваюць працу пасля перерываў. Этап Trace one complete article працюе найкраща, калі яго розглядаць як вимерную паверхню. Зберагачыце адны ідеальны транскрыпт, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перад расшырэнням масштаба. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі які-небудзь крок не выйшае, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач.
def run_blog_pipeline(topic: str, blog_id: str, user_id: str):
initial_state = {
"topic": topic,
"audience": "developers new to agent systems",
"research_brief": "",
"sources": [],
"open_questions": [],
"article_draft": "",
"review_feedback": "",
"citation_issues": [],
"approved": False,
"revision_count": 0,
"status": "researching",
}
with langfuse.start_as_current_observation(
as_type="span",
name="blog-pipeline",
input={"topic": topic, "audience": initial_state["audience"]},
) as pipeline_span:
with propagate_attributes(
trace_name="blog-pipeline",
session_id=blog_id,
user_id=user_id,
tags=["blog-pipeline", "langgraph"],
version="1.0.0",
metadata={"workflow": "research-write-review"},
):
trace_id = langfuse.get_current_trace_id()
result = graph.invoke(
initial_state,
config={"callbacks": [langfuse_handler]},
)
pipeline_span.update(
output={
"status": result["status"],
"approved": result["approved"],
"revision_count": result["revision_count"],
}
)
return result, trace_id
Дадзіце адазначэнні, якія поясняюць перадачу задач
Для аддыяння заазначэнняў, якія пояснююць стадію, паказвайце вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры перадзеіснаванні коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Спрыяйце цій стадіі як даговору межаў вхідных і перакананых выходных дадзенняў. Даўце назвы артыфактам, паказвайце перакананні пра успех і адмовіцеся ад тыхняга частковага завершэння без паведамлення. Забяжцеся пра людскія падтверджэнняя ў тых випадках, калі выкананы расходы або змененыя ў продакшн-дадзеннях. Кампіляцыйныя налашчэнні не ўзроўнаўцяюцься з павнай завершанасцю бізнес-процэсаў.
from langchain_core.runnables import RunnableConfig
def research_node(state: BlogState, config: RunnableConfig) -> dict:
with langfuse.start_as_current_observation(
as_type="span",
name="research-agent",
input={"topic": state["topic"], "audience": state["audience"]},
) as span:
result = research_agent.invoke(
{"topic": state["topic"], "audience": state["audience"]},
config=config,
)
span.update(
output={
"source_count": len(result["sources"]),
"open_question_count": len(result["open_questions"]),
"brief": result["research_brief"],
}
)
return {
"research_brief": result["research_brief"],
"sources": result["sources"],
"open_questions": result["open_questions"],
"status": "writing",
}
Адзначыце сігналы, якія трэба адзначыць
Для пазлу «Марк» неабяжна адзначыць сігналы, якіе выражаюць стадію, задаць вхідныя даны, адпаведнага власніка крока і критэрыя выходу пры змены коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы схованы стан. Запісваць час выконання і кост токена або запыту праз адзін ряд з функцыйнальнымі рэзултатамі. Відразы коста з самага пачатку запобегае неспакоўным рахункам, калі траекторыя пераходзіць з дэмаверсіі ў спакульнаныя сераўысы. Заставіць людзкую апрацоўку на тых элементах, якія витрачаюць грошы або зменяюць даны ў працэсе виробніцтва. Падключэнне праз час компілявання не ўзроўнаўваецца з полным адпаведнам станом бізнесу.
def record_source_assessment(assessment: SourceAssessment) -> None:
if assessment.suspicious_content:
langfuse.update_current_span(
level="WARNING",
status_message="Untrusted source contained agent-directed instructions.",
)
def record_pipeline_failure(error: Exception) -> None:
langfuse.update_current_span(
level="ERROR",
status_message=f"Pipeline failed: {type(error).__name__}",
)
Ператварыць рашэнні апрацоўніка ў балы
Ёнколі трэба пераканаліць рашынанні Turn Reviewer у практычны етап, перад тым як зменіць код, неабяжна задаць вхідныя даны, адпаведальнага за крок і крэтырыя для завершэння. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Конфігурацыю трэба залічыць праз аплякацыйны код. Файлы сераўіса, храненні секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаяўшы весь код. Прызначаць людскія апраўданні для тых крокаў, якія выкарыстоўваюць грошы або зменяюць даны у працэсе. Прыўязкі ў часе компіляцыі не є падтверджэнням полныя адпаведнасці да бізнес-трэбаў. Ёнколі трэба пераканаліць рашынанні Turn Reviewer у практычны етап, перад тым як зменіць код, неабяжна задаць вхідныя даны, адпаведальнага за крок і крэтырыя для завершэння. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Валічыць маленькія, тэставальныя елементы пра велікія скрыпты. Калі крок не выйшоў, прычына нехарактернага рэзультата должна вказываць на адну конкрэтную адпаведальнасць, а не на канфлікт разных элементаў.
закрэненыя трубопрацесы.result, trace_id = run_blog_pipeline(
topic="How AI agents use tools",
blog_id="blog-ai-tools-001",
user_id="philip",
)
if trace_id:
langfuse.create_score(
trace_id=trace_id,
name="review_approved",
value=1 if result["approved"] else 0,
data_type="BOOLEAN",
comment=result["status"],
)
langfuse.create_score(
trace_id=trace_id,
name="revision_count",
value=float(result["revision_count"]),
data_type="NUMERIC",
)
Діагностика неудачнай роботы за пяць запытанняў
Калі працуеце над стадіяй діагностики неудачнай роботы, спачатку запісуйце умовы кантракту: неабяжлівыя вхідныя даны, сигнал успеху і тое, што выходзіць у разе частковай неудачы. Такі список контролю дапамагае заліцвачыць пазнейшыя змены ў кодзе. Спрыймайце гэтую стадію як кантракт межаў між вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаць критэрыя успеху і не падзеўляйцеся частковым завершэнням без паведамлення. Ствараць контрольныя точкі пасля дорогіх крокаў. Система вярнення роботы не должна занова ставіць плату за той самы вызыв LLM, калі аператар прабуе зноў запрацаваць пазнейшы вузел.
Візуабельнасць таксама мае межы прыватнасці
Калі працюеце над можлівасцю спостэрэння, таксама існуе певны этап — спачатку запішыце умовы: неабяжлівыя даннэ, сигнал успеху і тое, што выканаецца пад частым неудачам. Такі список контролю дапамагае залічваць змяны ў кодзе чыста.
Запісвайце час выканання і кост токена або запыту пад функцыйнальнымі рэзултатамі. Відразы відомасці коста з’являецца неспадзейаныя рахункі, калі процес пераходзіць з дэмовай среды ў спяльныя сераверы.
Зробіце перапактаванне пасля дорогіх крокаў. Система вярнення не павінна знову нарахоўваць кост той самай вызову LLM, калі аператар прабуюць зноў выканаць пазнейшы элемент.
Што мы створылі
Калі працуеце над этапам «Што мы створылі», спачатку запісайце умовы викорыстання: неабяжлівыя даны, сигнал успеху і тое, што выходзіць пад частковыя неудачы. Такі список дапамагае заліцварваць пазнейшыя змены ў кодзе. Зберагаюце настройкі празьмо за межамі коду прыемлі. Файлы сераўіса, хранільнікі секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аудыт без неабяжлівага чытання всей структуры. Ставяце контрольныя пункты пасля дорогіх крокаў. Система вярнення роботы не должна занова ставіць плату за той самы вызов LLM, калі аператар перапрыяўляе роботу да наступнага элемента. Калі працуеце над этапам «Што мы створылі», спачатку запісайце умовы викорыстання: неабяжлівыя даны, сигнал успеху і тое, што выходзіць пад частковыя неудачы. Такі список дапамагае заліцварваць пазнейшыя змены ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшаў, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаную структуру роботы.
Контрольны список для аператараў
У стадії практычнага чэклісту, перш чым зменяць код, неабходна ясная ваказка пра вхідныя даны, адпаведальнага за крок і критэрыі завершэння. Аперацыйныя працавнікі должны магчымаць перзапуск кроку з вядомай точкі контролю, не прабуючы спадараць ся пра захаваны стан.
Неабходна адночасная документацыя як успішнага, так і варыятныя сцэнарыяў. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є часткай продукту, а не дадатковым элементам пасляўпрацоўкі.
Неабходна людзкая апраўда для тых крокоў, якіе ведуць да выдатку грошаў або змяні дадзенняў у прыемліванні. Компіляцыйныя налашчэння не є гарантыяй полной адпаведнасці продукту выкананню бізнес-трэбаванняў.
Напісце кароткі посібнік: як роцыяваць клучы, як спрачысляць чергу, як анулюваць пярэдніе змяны.
Валіце маленькія, тэставаныя елементы замест вялікіх скрыптав. Калі крок не выйшоў, прычына нехарактэрыстыкі должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцоўкі задач.
Неабяжна людская празначэнне для тых элементаў, якія выдвайуць грошы або зменяюць данні праработкі. Працаванне ў часе компілявання не абяжаецца пачынкамі бізнес-процэсаў.
Перш чым пераводзіць стэк, заморажуйце версіі, зафіксавайце «золаты» транскрыпты для критычных ліній працы і паказвайце крокі для адвярнення змян. У спадзеленых средах неабходны ліміты частоты, перакананні ў правах на вядомасці і чысткі власнік для ротацыі секрэтных даных. Валіце надзейнасць працы над крэатывнымі, але разовымі дэманстрацыямі.
Запіс для cf19385cb4a9: не кладзіце ключы прадастаўцаў у репазітарый, задаце верхнюю межу токенаў на сесію і храніце транскрыпты празаўседы ў фіксаты eval, каб пазнейшыя замены модэляў заставаліся парабяльнымі.