Галоўная / Артыкулы / Практычныя прытамулкі: Стварэнне локальных AI-агентаў: практычныя вядомасці пра модэлі та память

Практычныя прытамулкі: Стварэнне локальных AI-агентаў: практычныя вядомасці пра модэлі та память

Практычныя нарады: Стварэнне локальных AI-агентаў: практычныя вядомасці пра моделі, память, контракты, перакананні і слоты для коду для команд, якія викорыстоўваюць гэты патэрн.

2049 слоў

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

Слой 1: Слой LLM

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

ollama pull qwen3:8b
ollama pull nomic-embed-text
_orig_ollama_chat = ollama.chat
def _no_think_chat(*args, **kwargs):
    opts = kwargs.get("options") or {}
    if isinstance(opts, dict):
        opts.setdefault("think", False)
        kwargs["options"] = opts
    return _orig_ollama_chat(*args, **kwargs)
ollama.chat = _no_think_chat

Layer 2: Agent Framework Layer

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

- -
name: local-ai-assistant
description: Local AI coding assistant with persistent memory
command-dispatch: tool
command-tool: exec
command-arg-mode: raw
-
def detect_intent(message: str) -> dict:
    try:
        resp = ollama.chat(
            model=OLLAMA_CHAT_MODEL,
            messages=[{"role": "user", "content": INTENT_PROMPT.format(message=message)}],
            options={"temperature": 0, "num_predict": 1024},
        )
        return extract_json(resp["message"]["content"])
    except Exception:
        return keyword_intent_fallback(message)

2-й слой: Слой памяці

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

from mem0 import Memory
config = {
    "llm": {
        "provider": "ollama",
        "config": {"model": "qwen3:8b", "ollama_base_url": "http://localhost:11434"},
    },
    "embedder": {
        "provider": "ollama",
        "config": {"model": "nomic-embed-text", "ollama_base_url": "http://localhost:11434"},
    },
    "vector_store": {
        "provider": "qdrant",
        "config": {"host": "localhost", "port": 6333, "embedding_model_dims": 768},
    },
}
memory = Memory.from_config(config)
memory.add("I always use type hints and pytest", user_id="dev")
results = memory.search("write a utility function", user_id="dev")
def _is_worth_storing(self, user_message: str) -> bool:
    response = ollama.chat(
        model=OLLAMA_CHAT_MODEL,
        messages=[{"role": "user", "content": SMART_MEMORY_PROMPT.format(
            user_message=user_message
        )}],
        options={"temperature": 0, "num_predict": 512},
    )
    data = self._extract_json_robust(response["message"]["content"])
    return bool(data.get("worth_storing", False))
HIGH-VALUE (worth storing):
- "I prefer TypeScript over JavaScript"
- "I use pytest, never unittest"
- "Always use Google-style docstrings"

LOW-VALUE (discard):
- "What does enumerate() do?"
- "Write a retry decorator"
- "Thanks"

Layer 4: Слой зберагчыка

Этап сховішча 4-го шару працюе найэфективней, калі яго розглядаць як вимерную паверхню. Запісаце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметкі па поверненню да пачатковага стану пры розширэнні масштаба. Запісвайце часы выкання і кост токеноў або запита праза функцыональныя рэзултаты. Відразлівасць коста з самага пачатку запобегае неспакоўным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя сераўысы. Задаце бюджет токеноў на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмаверсіям ператварыцца на неспакоўныя рахункі.

pip install chromadb
# Qdrant via Docker
docker run -d - name qdrant-local -p 6333:6333 \
-v $(pwd)/qdrant_storage:/qdrant/storage qdrant/qdrant
"vector_store": {
    "provider": "qdrant",
    "config": {
        "collection_name": "coding_assistant",
        "host": "localhost",
        "port": 6333,
        "embedding_model_dims": 768,  # must match your embedding model exactly
    },
}

5-й шар: Шар інтэрфейсу

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

Заключэнне

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

Interface: Web UI on localhost
│
Framework: OpenClaw - tool-dispatch, SKILL.md routing
│
LLM: Ollama for qwen3:8b
(think mode disabled for JSON reliability)
│
Memory: Structured persistent memory with value filtering
Embeddings via nomic-embed-text
│
Storage: Chroma (zero infrastructure) or Qdrant (more robust)

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

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

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

Задаўце ліміты на кантэкст на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць кантэкст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўлівыя рахункі.

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

Напісаўце кароткі посібнік: як зменяць кантрольныя клучы, як спрачыслаць чергу задач, як адвярнуць пасляпэўныя змены.

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

Перад паднесенням стаку заморажавайце версіі, зафіксавайце «золаты» транскрыпты для критычных частак і паверыце крокі для адвярнення змян. У спакульнаваных сяродавішчах патрабуюцца ліміты частоты запытоў, перакананні ў прыналежнасці і чыста вялікі адпаведальны за змěну секрэтных дадзеных. Валіце простую надзейнасць працы замест адчулых разовых дэманстрацый.

Прымітка для 12622e9e0269: не кладзіце ключы прадастаўца ў репазітарый, задаце максымальную кантитатыву токенаў на сесію і зберагаце транскрыпты праза фіксатырэў eval, каб пазнейшыя замены моделяў заставаліся пораўнанымі.

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

Дзеянне зміцнення 0/721: звярніце увагу на час выканання, класы памылак і витрату токенав для гэтага пункту, а потым выявіце, чы рашыцца застаўляць зміны на адной фіксаванай сэтке пытанняў, а не на індывідуальных спостарожэннях.

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

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

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

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

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

Дзеянне 3/721 практыкы забезпечэння безпекі: звярзайце час выканання, класы каштоўкаў і витрату токеноў для гэтай практыкі, а потым вырашыце, чы робіць змены на адной пазначанай базе пытанняў, а не на адной лічбе прыкладаў.

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

Дзеянне паўжчання 4/721: звярніце увагу на час выканання, клас памылакі і колькасць выкорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазыраннях, выявіце, чы хацяце застаўіць змены.

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

Дзеянне паўжчання 5/721: звярніце увагу на час выканання, клас памылакі і колькасць выкорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазыраннях, выявіце, чы хацяце застаўіць змены.

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

Дзеянне прыемкі з павышэння безпекі 6/721: вымерайце час выканання, класію памылак і вартась токенаў для гэтай прыемкі, а пасля выберайце, чы робіць змены на адной пазначанай базе пытанняў, а не на адной толькі прыватнай інформацыі.

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

Дзеянне паўжасткі 7/721: звярніце увагу на час выканання, клас памылак і колькасць викорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набора пытанняў, а не на індывідуальных прыкладах, выявіце, чы робіць змены.

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

Дзеянне паўжасткі 8/721: звярніце увагу на час выканання, клас памылак і колькасць викорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набора пытанняў, а не на індывідуальных прыкладах, выявіце, чы робіць змены.