跳到主要内容

LLM 后端与记忆

本章讲:agent 怎么“问模型”(一个接口接多种后端),以及会话记忆怎么管、怎么压缩。

3.1 多后端 LLM dispatch

问题: 用户可能用 Ollama、LM Studio、或云端 API(OpenAI/Anthropic/DeepSeek/…)。agent 不应该关心用哪个。

思路: Provider 用一张 dispatch 表(后端名 -> 函数)把差异藏在 respond() 后面(llm_provider.py:27-42):

# 示意,非源码
self.available_providers = {
"ollama": self.ollama_fn,
"openai": self.openai_fn,
"anthropic": self.anthropic_fn,
"lm-studio": self.lm_studio_fn,
"server": self.server_fn, # 远程自托 LLM 服务器
# deepseek / google / together / openrouter / minimax / litellm
}
# 调用时按名字选
thought = self.available_providers[self.provider_name](history, verbose)

真实入口 llm_provider.py:76-100Provider.respond),包了一层异常翻译(连接拒绝/过载/未实现都转成友好报错)。

安全提醒: 云端 API 被标为 unsafe_providersllm_provider.py:46),选了会警告“你的数据会上云”(llm_provider.py:49-50)——呼应项目的“本地优先/隐私优先”定位。

3.2 记忆管理

Memorymemory.py)本质是一个 [{role, content, …}] 列表,首项是 system prompt。

  • push(role, content)memory.py:158-173):追加一条,返回其索引(agent 用来记位置)。openrouter 后端只存 role/content,其他后端额外存时间和模型名。
  • clear()memory.py:175-178):只留 system prompt——browser agent 每轮都调。
  • get()memory.py:192-193):拿整个列表去请求 LLM。

3.3 巧妙之处:从模型名猜上下文窗口

get_ideal_ctxmemory.py:46-67)从模型名里抽“7b/14b”这种参数量数字,按经验公式估算上下文大小:

# 示意,非源码
model_size ="deepseek-r1:14b" 里抽出 14
ctx = 4096 * (model_size / 7) ** 1.5 # 7b 基准 4096
ctx = 2 ** round(log2(ctx)) # 舍入到最近的 2 的幂

模型越大,估的上下文越大。模型名不含数字时返回 None(不压缩)。这是个粗略但零依赖的启发式(源码自标 EXPERIMENTAL,memory.py:49)。

3.4 记忆压缩

开启 memory_compression 后,push 时若内容超过 ideal_ctx * 1.5 就调 compressmemory.py:160-164)。compressmemory.py:235-246)用一个本地小模型(pszemraj/led-base-book-summary)把超 1024 字符的条目摘要化。

注意:默认各 agent 创建 Memory 时 memory_compression=False(看各 agent 构造,如 code_agent.py:33-36),所以压缩默认不开。

3.5 边界/坑

  • dispatch 表里 test_fn 等是占位用途。 生产用 ollama/lm-studio/云 API。
  • 压缩模型是额外下载。 开压缩才 download_modelmemory.py:69-74);不开则 compress 直接跳过。
  • config.ini 默认值看着像示例。 仓里 provider_name=openaiis_local=Trueconfig.ini)看上去是测试/示例配置,真要本地跑应按 README 改成 ollama / lm-studio。

3.6 代码地图

主题文件符号
多后端 dispatchsources/llm_provider.pyProvider.respondavailable_providers
Ollama 后端sources/llm_provider.pyProvider.ollama_fn
远程服务器后端sources/llm_provider.pyProvider.server_fn
API key 获取sources/llm_provider.pyProvider.get_api_key
记忆追加/清理sources/memory.pyMemory.pushclear
上下文估算sources/memory.pyMemory.get_ideal_ctx
压缩sources/memory.pyMemory.compresssummarize