OpenChronicle 配置完全指南:Ollama 全本地部署与 4 阶段 LLM 调优清单
【免费下载链接】OpenChronicle项目地址: https://gitcode.com/gh_mirrors/op/OpenChronicle
OpenChronicle 是一款开源、本地优先的 AI Agent 记忆系统:它在你的 Mac 上捕获真实工作上下文,并沉淀为人类可读的 Markdown 记忆,供任意支持工具调用的 LLM Agent 查询。用好它的关键在OpenChronicle 配置——本文作为一份完整指南,带你完成 Ollama 全本地部署(无需 API Key、不依赖云端),并给出一份 4 阶段 LLM 调优清单:每个阶段该配什么模型、哪些坑必须避开。
config.toml 在哪里,如何查看
- 运行时配置位于
~/.openchronicle/config.toml(或用$OPENCHRONICLE_ROOT整体迁移目录)。 - 首次运行
openchronicle status时自动按默认值生成,无需手写。 - 随时查看已解析的生效配置:
openchronicle config。 - 所有 LLM 阶段都走 litellm,官方默认模板可直接参考 src/openchronicle/config.py 中的
DEFAULT_CONFIG_TEMPLATE。
Ollama 全本地部署:最小配置 3 行搞定
OpenChronicle 对云端提供商没有任何硬依赖——任何 litellm 够得着的模型都能用,包括本地 Ollama 服务。最小配置如下:
[models.default] model = "ollama/qwen2.5:14b" # 任意已 pull 的模型,加 ollama/ 前缀 base_url = "http://localhost:11434" api_key_env = "" # 留空——Ollama 不需要 key这段配置里有 3 个新手必踩的坑:
- 模型名必须加
ollama/前缀,litellm 靠它路由到 Ollama。 base_url指向本机 Ollama 地址http://localhost:11434,否则请求会发到 OpenAI。api_key_env留空。若保留默认的OPENAI_API_KEY而系统里又没导出该变量,litellm 会报错——尽管 Ollama 根本用不到 key。
4 阶段 LLM 调优:按阶段分配模型
OpenChronicle 的记忆管线有4 个 LLM 阶段,节奏与精度敏感度各不相同。分层分配(tiered assignment)通常非常值得——timeline 每分钟都触发,classifier 又极度怕弱模型:
| 阶段 | 触发节奏 | 职责 | 选型建议 |
|---|---|---|---|
timeline | 有捕获时每 60s | 把 1 分钟捕获窗口归一化为结构化活动记录,原文逐字保留 | “便宜但不弱”的小模型 |
reducer | 每 5 分钟 flush + 会话结束 | 把一个会话的 timeline 块压缩成一条 event-daily 记录 | 中等模型,精度决定时间范围与应用归属的质量 |
classifier | 每 30 分钟 + 会话结束 | 通过工具调用把长期事实提取到user-/project-/tool-/topic-/person-/org-*.md | 精度敏感,弱模型会“毒化”去重 |
compact | 文件超阈值后 | 重写过胖的记忆文件,名词短语丢失 >5% 即拒绝 | 与 classifier 同级或更强 |
推荐的本地分层配置(详见 docs/config.md):
[models.timeline] model = "ollama/qwen2.5:7b" # 便宜但不弱,常驻运行 [models.reducer] model = "ollama/qwen2.5:14b" # 压缩整个会话,精度重要 [models.classifier] model = "ollama/qwen2.5:14b" # 工具调用;弱模型会毒化去重 [models.compact] model = "ollama/qwen2.5:14b" # 与 classifier 同级或更强💡 每个阶段小节都完整继承
[models.default]的字段,只覆盖自己写出的项。想全局共用一个模型?只填[models.default],其余留空即可。
本地模型预检清单:4 项硬性检查
选完模型后,先对照 docs/config.md 的 “Things to check” 清单过一遍,能省掉大量排障时间:
- ✅Tool-calling(工具调用)支持——classifier 硬性要求。它靠函数调用循环驱动
append/create/supersede。qwen2.5、llama3.1、mistral-nemo、command-r均可用;小尺寸 Llama-3.2 与 Phi 系列表现不可靠。 - ✅JSON mode——timeline 与 reducer 硬性要求。两阶段以
response_format={"type":"json_object"}调用,litellm 会转成 Ollama 的format: "json"。模型若不遵守、返回散文,日志里会出现成片的解析错误——这时别调 prompt,换更大的模型。 - ✅上下文窗口(num_ctx)要够大。timeline 块为 1 分钟粒度,reducer 一次 flush 消费约 5 个块,2 小时的会话最多可堆约 24 个块。建议 Ollama
num_ctx对 timeline ≥16k,对 reducer/classifier ≥32k。默认 2–4k 会静默截断,症状极隐蔽。 - ✅
api_key_env保持为空,避免 litellm 因缺失环境变量直接拒绝请求。
验证配置:改完跑一次status,一行命令全知
守护进程只在启动时读取一次配置。编辑config.toml后:
openchronicle stop && openchronicle start openchronicle statusstatus会打印每个阶段解析出的模型,并对每个阶段的提供商做迷你探测(max_tokens=4,约 5 秒超时),每行显示三种结果之一:
✓ 234 ms—— 提供商正常应答;✗ AuthenticationError: …—— 模型名拼错、api_key_env缺失、base_url写错、key 过期,全部会在这第一次status就暴露,而不是几小时后在 writer 里静默失败;- 相同
(model, base_url, api_key)的阶段会去重探测,四阶段共用一个模型时只发一次网络请求。
在飞机上或 CI 环境想跳过网络探测,可设 mock 环境变量:
OPENCHRONICLE_LLM_MOCK=1 openchronicle status # 各行显示 ✓ mocked常见问题速查表
| 症状 | 原因与修复 |
|---|---|
| timeline / reducer 日志刷解析错误 | 模型忽略 JSON mode,尺寸太小——换更大模型 |
日志出现classifier ended without commit at iter N | 模型太弱,走不完工具调用协议——升级[models.classifier] |
| classifier 每个会话都写重复事实 | 模型跳过了search_memory去重检查——升级模型,不要加代码 |
启动报Address already in use | 8742 端口被占用,lsof -i :8742找出占用进程 |
| reducer 连续失败 | 日志见reducer failed (retry N/5);5 次失败后写heuristic兜底条目,会话永不丢失 |
排障时优先看这三个日志(均在~/.openchronicle/logs/下):writer.log(reducer/classifier 工具调用)、session.log(flush 与 tick)、timeline.log(窗口归一化)。完整排障手册见 docs/troubleshooting.md。
延伸阅读
- 配置与模型设置:docs/config.md
- 4 阶段管线与触发模型:docs/writer.md
- LLM 封装与 status 探测源码:src/openchronicle/writer/llm.py
- 配置默认值与继承逻辑:src/openchronicle/config.py
- 会话切分与调优:docs/session.md
【免费下载链接】OpenChronicle项目地址: https://gitcode.com/gh_mirrors/op/OpenChronicle
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考