Галоўная / Артыкулы

Дайце вашам AI-агенту памяць — і тады старайцеся бачыць усё, што ён рабіць.

Агент AI з памяцю, а таксама можлівасць цэлысаго стэскаўвання за всім, што ён рабіць: локальны LLM на Ollama, LangGraph для агента і LangSmith для логаў.

Выдавец: REACTAPP.TOP16 хв чытання3681 слоў

Крыніцы: Give Your AI Agent a Memory — Then Watch Everything It Does with LangSmith

У гэтым керавану практычныя нарады паказваюць, як стварыць лянцуг ад сыр'ёў да рабочай сістэмы для праекту «Дадзіце вашам AI-агенту памяць — а потым спазірваеце, як гэта робіцца за дапамою LangSmith». Акцэнт ставіцца на практычныя крокі, чыстае перакананне ў правільнасці дзействаў і код, які можна проста дадаць у рэпазітарый без неабязковасці з'ясоўвання намеру. У этапы агульнага перакладу неабходна з'явіць вхідныя даны, адпаведальнага за крок і крытэрыя завершэння пры перадзеіснаванні коду. Аператары должны магчымае перадзеіснаваць крок з вядомага пункта контролю, не намагаючыся з'ясавіць схованы стан. Конфігурацыю трэба залічыць параду ад коду прыкладнага програмнага забезпечэння. Файлы сераў, хранільнікі секрэтных даных і флагі функцый должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаяўшы весь граф.

Архітэктура

Калі працюеце над стадзіяй «Архітэктура», спачатку запісайце контракт: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі спіс пераконтроўкаў дапамагае заліцвачваць пазнейшыя змены ў кодзе. Документавайце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некорэктных паведамленняў ёсць часткаю продукту, а не пазнейшым дапрацоўкам. Зробіце пераконтроль пасля дорогіх крокаў. Програма для продакцыявання не павінна знову ставіць плату за той самы вызов LLM, калі аператар перапрыбуе пазнейшы вузел.

                    ┌─────────────────────┐
                    │       User          │
                    └──────────┬──────────┘
                               │
                               ▼
                    ┌─────────────────────┐
                    │    AI Agent         │
                    │  LangChain Agent    │
                    └──────────┬──────────┘
                               │
                 ┌─────────────┴─────────────┐
                 │                           │
                 ▼                           ▼
        ┌─────────────────┐        ┌──────────────────┐
        │ Conversation    │        │     Tools        │
        │ Memory          │        │                  │
        │ InMemorySaver   │        │ Tavily Web Search│
        └─────────────────┘        └──────────────────┘
                 │                           │
                 └─────────────┬─────────────┘
                               │
                               ▼
                    ┌─────────────────────┐
                    │     Ollama          │
                    │     Llama 3.2       │
                    └─────────────────────┘
                               │
                               ▼
                    ┌─────────────────────┐
                    │     LangSmith       │
                    │  Traces & Debugging │
                    └─────────────────────┘

1. Адкрытыя запуск LLM з Ollama

Калі працюеце над стадзіяй «Запуск LLM», спачатку запісайце умовы працы: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць пад часты няудачны рэзультат. Такі спіс дапамагае заліцварыць пазнейшыя змены ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, няудача должна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны працэс. Зявляйце логі з ідэнтыфікаторам запросу, ідэнтыфікаторам мадэлі і часам адзначэння кожнага вызову. Без такога следу перыодычныя проблэмы падаюць на думку як багі ў самай прыемлівай.

from langchain_ollama import ChatOllama
llm = ChatOllama(
    model="llama3.2:latest",
    base_url="http://localhost:11434",
    temperature=0,
)

model

Калі працуеце над стадзіяй модэлі, спачатку запісайце контракт: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць пад частковым неяксамошчынам. Такі спіс пераканае ў тым, што пазнейшыя змены коду будуць чыстымі. Спрэтавайце гэту стадзію як контракт межа данымі і перакананымі выходамі. Дайце назву артыфактам, задаце перакананні на успех і адмовіцеся ад тыхоўскага частковага завершэння. Зберагачвайце стабільныя інструкцыі сістэмы і схемы інструментаў. Перадача ідэнтычных прамуслов ёсць частым выклікам расходу рэсурсаў.

model="llama3.2:latest"

Калі працуеце над стадзіяй модэлі, спачатку запісайце контракт: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць пад частковым неяксамошчынам. Такі спіс пераканае ў тым, што пазнейшыя змены коду будуць чыстымі. Зберагачвайце настройкі за межамі коду прыемліка. Файлы сераўнавання, храненні секрэтных дадзенаў і флагі функцый должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аўдыт без неабяжлівага чытання всей структуры.

base_url

Этап baseurl работае наяўней, калі яго спрыяваць як мерыемую паверхню. Зафіксавайце адна ідэальная транскрыпцыю, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць сферу дзеяння. Дакументавайце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некорэктных паведамленняў ёсць часткай продукту, а не наступным этапам дапрацоўкі. Храніце стан графа ў простам і тыпаваным фармаце. Вкладзеныя блокі маскуюць інфармацыю пра тое, які вузел запісаў канкрэтны поле, і спакшуюць продовжэнне працы пасля перэрываў.

base_url="http://localhost:11434"

temperature

Тэпературны ўзлак работае наяўней, калі яго спрыяваць як вімерную паверхню. Запісаўце адна «золатая» транскрыпцыю, адын прыклад неудачы і прыметку па вярнэнню да пачатковага стану пры расшырэнні масштаба. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісьць крок не выйшла, прычына неудачы павінна вказваць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Рэжым графа павінен застацца простым і з адначыяным тыпам дадзеных. Вкладаныя структуры дадзеных масквуюць, які вузел запісаў кожны поле, і спакоююць продажчык задач пасля перэрываў.

temperature=0

2. Стварэнне агента

Этап 2 «Стварэнне агента» працюе найкрашча, калі яго розглядаць як меркавыя паракетры. Зберагчыце адны ідэальны прыклад працы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расшырваць сферу дзеяння. Разглядайце гэты этап як кантракт межа вхіднымі данымі і пераканаленымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце крытэрыя успеху і не падзеўляйцеся частым, непূরным выкананнем задач. Храніце стан графа ў простам і тыпаваным фармаце. Вярнутыя структуры даных маскуюць інфармацыю пра тое, які вузел запісаў кожны поле, і спакойваюць працэс пасля перарываў. Этап 2 «Стварэнне агента» працюе найкрашча, калі яго розглядаць як меркавыя паракетры. Зберагчыце адны ідэальны прыклад працы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расшырваць сферу дзеяння. Храніце настройкі параду ад коду прыемлівача. Файлы сераўіса, хранальнікі секрэтных даных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куда аператары можу аўдытаваць іх без неабходнасці чытаць весь граф.

from langchain.agents import create_agent
agent = create_agent(
    model=llm
)
agent = create_agent(
    model=llm,
    tools=[tool1],
    system_prompt="You are an intelligent knowlegable agent"
)

3. Надаўча агенту інструмент для пошуку ў Інтэрнэце

Для этапы 3 «Выдача агенту» неабяцо практычна з’явіць вхідныя даны, адміністратара крока і крэтырыя для завершэння пры перадзеіснаванні коду. Аператары павінны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы схованы стан. Неабяцо задокументаваць як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкіе перакрыцця і апрацоўка некорэктных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней. Автэнтыфікуйцеся на воратах і практычна автарызуйцеся на роўні дадзеных. Сам токэн-носіцель не ёсць межай арэндавання.

from langchain.tools import tool
@tool("web_search", description="Search the web for information")
def tool1(query: str) -> Dict[str, Any]:
    tavily = TavilyClient()
    return tavily.search(query=query)
tavily = TavilyClient()
return tavily.search(query=query)
User Question
      │
      ▼
     LLM
      │
      │ "I need external information"
      ▼
  Web Search Tool
      │
      ▼
   Tavily API
      │
      ▼
 Search Results
      │
      ▼
     LLM
      │
      ▼
 Final Answer

4. Проблема: LLM-ы не памятаюць автаматычна аўтара

Для этапы 4 «Проблемы LLM» неабяжна прадзефінаваць вхідныя даны, адпраўніка крока і крэтыяры завершэння перад змінайом коду. Аперацыяныя працавнікі павінны магчымае перзапускаць крок з вядомай точкі контролю, не падозрываючы схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшае, прычына неудачы павінна вказываць на адзіну адпраўнічую функцыю, а не на заплутаны ланцоўкі задач. Калі наступны крок — гэта код або вызов інструмента, лепш выбіраць структураваныя выходныя даны з перакананнем схэмы замест вольнага фармата тэксту.

from langgraph.checkpoint.memory import InMemorySaver
agent = create_agent(
    model=llm,
    checkpointer=InMemorySaver()
)
Question → LLM → Answer

5. InMemorySaver — Надаўчы Агенту памяці

Для стадыі 5 InMemorySaver Giving the stage неабяжна ўзначэнне вхідных дадзеных, адпаведальнага за крок і крэтарыяў завершэння працы перад змінайом коду. Аператары должны магчымае запускіць крок з вядомай точкі контролю без адгадванняя схованага стану. Спрыятлівае цюю стадыю як кантракт межа вхіднымі дадзенымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, узначце перакананні на успех і адмовіцеся ад тыхняга частковага завершэння без паведамлення. Забезпечыце людзкія падтверджэння для тых крокаў, якія выкарыстоўваюць грошы або зміняюць даны праўеркі. Компіляцыйныя налашчэння не ўзначаюць павнае выпаненне бізнес-функцый. Для стадыі 5 InMemorySaver Giving the stage неабяжна ўзначэнне вхідных дадзеных, адпаведальнага за крок і крэтарыяў завершэння працы перад змінайом коду. Аператары должны магчымае запускіць крок з вядомай точкі контролю без адгадванняя схованага стану. Зберагачыце налашчэнні за межамі коду прыкладнення. Файлы сераўіса, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць без неабяжнага чытання ўсіх.

checkpointer=InMemorySaver()

6. Найважнейшая лінія: thread_id

Працюючы над 6-й стадыяй «Найважнейшых», спачатку запісуйце умовы працы: неабяжлівыя даныя, сігнал успеху і тое, што вядзецца пад частковым невяскам. Такі спіс дапамагае заліцвачыць змяны ў кодзе. Документавайце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, кантрольныя етапы з удзелам людзей і обработка некорэктных паведамленняў ёсць часткай продукту, а не дадатковымі удосконаленнямі. Стварайце контрольныя пункты пасля дорогіх крокаў. Сістэма вярнення не павінна знову ставіць плату за той самы вызов LLM, калі аператар перапрыбуе працаваць з наступным вузлом.

config = {
    "configurable": {
        "thread_id": "1"
    }
}
Thread 1
────────────
User → My favorite color is Green
AI   → Great!
User → What's my favorite color?
AI   → Green
Thread 2
────────────
User → My favorite color is Blue
AI   → Blue

7. Першая розмова

Калі працюеце над 7-м стадыям Першай розмовы, спачатку запісацеце кантракт: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі спіс пераконтроўваець дапамагае залічыцца з пазнейшымі змянамі ў кодзе. Валіце маленькія, тэставаныя елементы замест вялікіх скрыптав. Калі якісь крок не выйшае, прычына нявыпання павінна вказываць на адну адпаведальнасць, а не на заплутаны ланцюг задач. Зробіце пераконтроль пасля дорогіх крокаў. Програма не павінна зноў сцягваць плата за той самы вызов LLM, калі аператар прабуе зноў запрацаваць з пазнейшым вузлам.

question = HumanMessage(
    content="I am X my favorite color is Green"
)
response = agent.invoke(
    {"messages": [question]},
    config,
)
"thread_id": "1"

8. Запыт да Агента пазнейша

Калі працуеце за 8-ю стадзіяй «Запыткі да агента», спачатку запісайце контракт: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі спіс перакладоў заходзіць пазнейшыя змены коду чыстымі. Спрыятлівайце гэтую стадзію як контракт межа данымі і перакананымі выходамі. Дайце назву артыфактам, задаць тэсты на успех і не падзеўляйце частковым завершэнням без паведамлення. Зробіце перапытку пасля дорогіх крокаў. Сістэма вярнення не павінна зноў выклікаць той самы каллендж да LLM, калі аператар прабуе зноў запрацаваць пазнейшы вузел. Калі працуеце за 8-ю стадзіяй «Запыткі да агента», спачатку запісайце контракт: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі спіс перакладоў заходзіць пазнейшыя змены коду чыстымі. Зберагачыце настройкі за межамі коду прыемленае. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функцый павінны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аўдыт без неабяжлівага чытання всей структуры.

question2 = HumanMessage(
    content="What's my favorite color?"
)
response2 = agent.invoke(
    {"messages": [question2]},
    config,
)
config = {
    "configurable": {
        "thread_id": "1"
    }
}
Your favorite color is Green!

9. Чаму thread_id так важны

Этап «9 прычын», калі ўжо стосуецца thread_id, працюе наяўней, калі яго розглядаць як параметр, які можна змерыць. Запісаўце адны ідэальны прыклад працы, адну справу з бягам і прыміткі па поверненню да пачатковага стану, прычаму расшырваць дыяпазон не трэба. Дакументавайце як шлях успеху, так і шлях вярнення да нормы. Перапрыбуткі, людзкія контралі і обработка некорэктных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней. Храніце стан графа ў простам і тыпаваным фармаце. Вярнутыя структуры дакументаў маскуюць інфармацыю пра тое, які вузел запісаў кожны поле, і спакшваюць возз'еднанне пасля перэрываў.

Customer A → thread_id = "customer-A"
Customer B → thread_id = "customer-B"
Customer C → thread_id = "customer-C"
AI Agent
                │
       ┌────────┼────────┐
       ▼        ▼        ▼
   Customer A Customer B Customer C
      │           │          │
   Thread A    Thread B   Thread C

10. Але памяці недастатнек

Этап «10 But Memory Isn» працюе найкрашча, калі яго розглядаць як вімерную паверхню. Запісаўце адна «золатая» транскрыпцыя, адын прыклад неудачы і прыметку па вярнэнню да пачатковага стану пры расшырэнні масштаба. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Рэзультаты обработкі трэба зберагаць у простаму, тыпаваным фармаце. Вкладзеныя структуры маскуюць інфармацыю пра тое, які вузел запісаў канкрэтны поле, і спакоююць працу пасля перэрываў.

User Question
     ↓
Agent
     ↓
LLM decides to call web_search
     ↓
Tavily
     ↓
Search results
     ↓
LLM
     ↓
Final answer

11. Введзіце LangSmith

Этап 11 Enter LangSmith работае наяўней, калі яго спрыяваць як мерыемую паверхню. Зафіксавайце адна ідэальная транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць масштаб. Спрыяйце гэты этап як кантракт межа вхіднымі дадзеннямі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаць крытэрыя успеху і адмовіцеся ад тых падзеяў, калі завершэнне выканання адбываецца часткова без паведамлення. Храніце стан графа ў простым і тыпаванам фармаце. Вкладзеныя блокі маскуюць інфармацыю пра тое, які вузел запісаў кожны поле, і спакоююць продажчыку працу пасля перэрываў. Этап 11 Enter LangSmith работае наяўней, калі яго спрыяваць як мерыемую паверхню. Зафіксавайце адна ідэальная транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць масштаб. Храніце настройкі параду ўнутры коду прыкладнага програміста. Файлы сераў, сховішчы секрэтных дадзенняў і флагі функцый должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць без неабходнасці чытання всего графа.

os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_API_KEY"] = "YYY"
os.environ["LANGSMITH_ENDPOINT"] = "https://langsmith-endpoint"
os.environ["LANGSMITH_PROJECT"] = "local-ollama-agent"
LANGSMITH_TRACING=true

12. Чаму трэйсінг лепшы за print()

Для этапы аналізу 12 «Чаму» неабяжна ўскладненне вхідных дадзей, адпаведальнага за крок і крэтарыяў завершэння працы перад змінайом коду. Аператары должны магчымае запускіць крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Неабяжна задокументаваць як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія пераказы і апрацоўка некорэктных паведамленняў ёсць часткай продукту, а не яго пазнейшай дапрацоўкі. Неабяжна атрыбуаваць людзкую згоду тым крокам, якія ведуць да вітрачання грошаў або змены дадзей у прыемніце. Працэс кампайлявання не ёсць адпаведніком пачытальнасці бізнес-процэсаў.

print(response)
Question
   │
   ├── LLM call
   │
   ├── Tool decision
   │
   ├── Web search
   │
   ├── Tool response
   │
   ├── Another LLM call
   │
   └── Final response

13. Чаго мы можамы научыцца з аналізу?

Для параграфа «13. Чаго мы можамы адгуклаць?» неабяжна прадзефінаваць вхідныя даны, адпаведальную особу за кожны крок і крытэрыі завершэння працы перад змянайом коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшаў, прычына неудачы павінна вказываць на адзін конкрэтны аспект, а не на заплутаны працэс. Неабяжна ўключыць людзкую апраўдку для тых крокаў, якія выкарыстоўваюць грошы або зміняюць даны ў працэсе віробніцтва. Компіляцыйныя налашчэння не ёсць гарантыяй полнай адпаведнасці працы сістэмы бізнес-трэбаванням.

Total execution: 8 seconds
LLM call              1.5 sec
Web search             5.2 sec
Final LLM call         1.3 sec

14. Спяўненне патрэб памяці і стварэння можлівасцей абзору

Для этапы 14 «Утрыманне памяці» неабяжна ўзначыць вхідныя даны, адпаведальнага за этап і крэтыры завершэння пры змяне коду. Аперацыйныя працавнікі должны магчымае перадзеяць этап з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Спрацавляйце з гэтай стадыяй як з кантрактом межаў вхідных дадзеных і перакананых выходных рэзультатаў. Даць назвы артыфактам, узначыць крэтыры успеху і адмовіцца ад бяспечнага частковага завершэння. Забезпечыце людскія апраўдкі для тых крокаў, якія выкарыстоўваюць грошы або зміняюць даны праўлення. Працэс складання коду не ёсць адпаведнікам пачатковай цэлесообразнасі працы. Для этапы 14 «Утрыманне памяці» неабяжна ўзначыць вхідныя даны, адпаведальнага за этап і крэтыры завершэння пры змяне коду. Аперацыйныя працавнікі должны магчымае перадзеяць этап з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Зберагачыце настройкі параду коду прыкладнення. Файлы сераўіса, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое працавнікі можуць аўдытаваць, не чытаючы весь ланцуг задач.

                         ┌───────────────┐
                         │     User      │
                         └───────┬───────┘
                                 │
                                 ▼
                      ┌────────────────────┐
                      │     AI Agent       │
                      └─────────┬──────────┘
                                │
                 ┌──────────────┼──────────────┐
                 │              │              │
                 ▼              ▼              ▼
             Memory          LLM            Tools
          InMemorySaver     Ollama          Tavily
                 │              │              │
                 └──────────────┼──────────────┘
                                │
                                ▼
                         ┌─────────────┐
                         │ LangSmith   │
                         │   Tracing   │
                         └─────────────┘

Памяць

Калі працюеце над стадзіяй Памяці, спачатку запісайце угоду: неабяжлівыя даны, сігнал успеху і тое, што выканаецца у разе частковага нявыполнення. Такі спіс пераканаець у тым, што пазнейшыя змены коду будуць чыстымі. Документавайце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контраліны і обработка некорэктных паведамленняў ёсцю часткай продукту, а не пазнейшым дапрацоўкам. Стварайце контрольныя пункты пасля дорогіх крокаў. Продовжэнне працы не должна зноў выклікаць той самы календар вызову LLM, калі аператар перапрыбывае пазнейшы вузел.

LLM

Калі працюеце з стадзіяй LLM, спачатку запісайце контракт: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага неяксамоства. Такі спіс пераканальвае ў тым, каб пазнейшыя змены коду былі чыстымі. Валіце маленькія, тэставаныя елементы замест вялікіх скрыптав. Калі якісь крок неяксамоства, гэтае неяксамоства павінна адносіцца да адной адпаведальнасці, а не да заплутанага ланца задач. Зберагайце у кэшы стабільныя інструкцыі сістэмы і схемы інструментав. Перадзесланне ідэнтычных прамаркетаў — частая прычына змарнавання рэсурсаў.

Інструменты

Калі працуеце на стадыі «Інструменты», спачатку запісайце угоду: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць пад частыя неудачы. Такі спіс пераканае ў тым, што пазнейшыя змены коду будуць чыстымі. Спрыймайце гэтую стадыю як угоду межа данымі і перакананымі выходамі. Дайце назву кожнам элементам, задаце крытэрыі успеху і не падзволяйце частым завершэнням працы без паведамлення. Запісвайце назву інструмента, хэш аргументаў, час адпаведзьбы і рэзультат кожнага вызову. Без такога лёгкага следу дэбагаванне губіць гадзіны. Калі працуеце на стадыі «Інструменты», спачатку запісайце угоду: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць пад частыя неудачы. Такі спіс пераканае ў тым, што пазнейшыя змены коду будуць чыстымі. Зберагаюце настройкі праза код аплікацыі. Файлы сераўнавання, храненні секрэтных даных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць без неабяжлівага чытання всей структуры.

LangSmith

LangSmith-а стадыя працюе наўсёрэдзей, калі яе спрыяваць як вімерную паверхню. Зафіксавайце адна ідэальная транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць масштабы. Дакументавайце як шлях успеху, так і шлях вярнэння. Перапрыбуткі, людзкія контрольныя пункты і обработка некорэктных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам. Храніце стан графа простым і з адначытаемымі данымі. Вкладзеныя блокі маскуюць, які вузел запісаў канкрэтны поле, і спакшуюць продовжэнне працы пасля перарываў.

15. Полны концэптуальны плакат

Этап «15. Полная концэптуальная стадыя» працюе наўсёрэдзей, калі яго розглядаць як вімерную паверхню. Запісаўце адна «золатая» транскрыпцыя, адын прыклад неудачы і прыметку па вярнэнню да пачатковага стану пры расшырэнні масштаба. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Рэзультаты працы графа павінны быць простымі і з адначыя структураю. Вкладзеныя блокі маскуюць інфармацыю пра тое, які вузел запісаў канкрэтны поле, і спакоююць працу пасля перарываў.

Крок 1 — Пользоватэль задае інформацыю

Прынцыпавае выкананне на першым кроку будзе найбліжэйшае, калі яго спрыяць як вімерную паверхню. Зафіксавайце адны ідэальны прыклад, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць масштаб. Спрыяйце гэтаму этапу як кантракту межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаць крытэрыя успеху і адмовіцеся ад тыхняй частковай працы без паведамлення.

"My name is Amit and my favorite color is Green."

Прынцыпавае выкананне на першым кроку будзе найбліжэйшае, калі яго спрыяць як вімерную паверхню. Зафіксавайце адны ідэальны прыклад, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць масштаб. Зберагаўце настройкі за межамі коду прыемлівача. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куда аператары можу аўдытаваць іх без неабяжнага чытання всіх дадзеных.

thread_id = 1

Крок 2 — Пользоватэль задае ўтолькі іншы вопыт

Для другога крока, калі корыстнік задае запіт, неабяжна практычна вакументацыя: апісацыя вхідных дадзеных, адказальнага за крок і крэтарыяў завершэння працы перад змінайом коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Неабяжна задокументаваць як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія пераказы і обработка некорэктных паведамленняў ёсць часткай продукту, а не элементамі пазнейшага дапрацоўкі. Неабяжна прыняць людзкую згоду для тых крокаў, якія выкарыстоўваюць грошы або зміняюць даны, выкарыстоўваные у працэсе. Кампіляцыйныя налашчэння не ёсць гарантыяй полнай адпаведнасці продукту бізнес-трэбованням.

"What's my favorite color?"
"Your favorite color is Green."

Крок 3 — Корыстнік задае запіт на інформацыю

Для трэцьяго крока, калі корыстнік запытае пра практыку, неабяжна з’явіць вакулпныя даны, адказальнага за крок і крэтырыя для завершэння пры перадзеі коду. Аперацыйныя працавнікі павінны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшаў, прычына нехаспекі павінна вказываць на адзіну адпаведальнасць, а не на заплутаны ланцужок задач. Неабяжна ўключыць людзкія апраўданні для тых крокоў, якія выкарыстоўваюць грошы або зміняюць даны ў працэсе. Компіляцыйныя налашчэнні не ёсць адпаведнікамі пачатковай цэлесапраўленасці праекту.

"Who is the Chief Minister of Tamil Nadu?"
web_search

Крок 4 — Адпрацоўванне інструментам

Для этапа выканання інструментам Крок 4 неабяцкова прадзефінавацыя вхідных дадзеных, адпраўніка кроку і крэтарыяў завершэння пры перадзмене коду. Аперацыйныя працавнікі павінны магчымаецца перзапускаць крок з вядомага пункту контролю без адгадванняя схованага стану. Спрыймайце гэты этап як кантракт межа вхідных дадзеных і перакананых выходных рэзультатаў. Даць назвы артыфактам, прадзефінавацыяя перакананняя успеху і адмовіцца ад бяспрэчнага частковага завершэння. Автэнтыфікуйцеся на в’язку і парадзефінавайце правыя на працу ў плэне дадзеных. Толькі токен-носіцель не ёсць межай арэны. Для этапа выканання інструментам Крок 4 неабяцкова прадзефінавацыя вхідных дадзеных, адпраўніка кроку і крэтарыяў завершэння пры перадзмене коду. Аперацыйныя працавнікі павінны магчымаецца перзапускаць крок з вядомага пункту контролю без адгадванняя схованага стану. Зберагачыце настройкі за межамі коду прыемленае. Файлы сераўіснага сэрвісу, хранілішчы секрэтных дадзеных і флагі функцыйяў павінны знаходзіцца ў адном месцы, якое працавнікі можуць аўдытаваць без чытанняя цэлага графу.

Шаг 5 — LLM генеруе адказ

Кал працуеце над шагам 5, калі LLM генеруе рэзультат, спачатку запісайце умовы кантракту: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі чэк-ліст дапамагае заставіць пазнейшыя змены коду быць чыстымі.

Шаг 6 — LangSmith фіксуе выконанне

16. Зьвярненне пра секрэты

os.environ["TAVILY_API_KEY"] = "XXX"
os.environ["LANGSMITH_API_KEY"] = "YYY"
export TAVILY_API_KEY="..."
export LANGSMITH_API_KEY="..."
export LANGSMITH_TRACING="true"
export LANGSMITH_PROJECT="local-ollama-agent"

17. Чаму гэтая архітэктура мае значэнне

User → LLM → Response
┌── Memory
                   │
User → Agent → LLM ├── Tools
                   │
                   └── State
                        │
                        ▼
                    Tracing

18. Памяць проты стойкасці

InMemorySaver()
Application starts
      ↓
Thread 1 created
      ↓
Conversation stored in memory
      ↓
Application restarts
      ↓
Memory is gone

19. Простая ментальная мадэль

1⃣ Агент

agent = create_agent(...)

2⃣ Мадэль

llm = ChatOllama(...)

3⃣ Памяць

checkpointer=InMemorySaver()

4⃣ Возможнае назіранне

LANGSMITH_TRACING=true
Agent
 ├── Model
 ├── Memory
 ├── Tools
 └── Observability

Заключэнне

Ollama
   +
Llama 3.2
   +
LangChain Agent
   +
InMemorySaver
   +
Tavily
   +
LangSmith

Што далей?

Кантэнт коду

Чэк-ліст для эксплуатацыі