Галоўная / Артыкулы / Практычныя прытамулкі: Дайце вашам AI-агенту памяць — і тады старайцеся бачыць усё, што ён рабіць.

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

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

3610 слоў

У гэтым керавану практычныя нарады паказваюць, як стварыць лянцуг ад сыр'ёў да рабочай системы для проекту «Дадзіце вашам 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

Што далей?

Кантэнт коду

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