前言:
每次对话LLM模型都会根据需要加载memory的内容,如果直接将全部的memory一次性的给LLM模型不仅浪费token也会带来效率的问题,通过建立memory的检索,同时LLM在搜索的时候通过向量匹配语义,能够实现精确的答复,本文描述通过ollama部署本地向量的方法。
📦 检查当前是否使用
从下面可以看到根本就没有启动向量配置,下面步骤我们通过ollama来配置。
root@VM-0-7-ubuntu:~/.openclaw# openclaw memory status --deepMemory Search (publisher)Provider: none (requested: auto)Model: noneSources: memoryIndexed: 0/2 files · 0 chunksDirty: yesStore: ~/.openclaw/memory/publisher.sqliteWorkspace: ~/.openclaw/workspace-publisherEmbeddings: unavailable #没有向量配置Embeddings error: No API key found for provider "openai". Auth store: /root/.openclaw/agents/publisher/agent/auth-profiles.json (agentDir: /root/.openclaw/agents/publisher/agent). Configure auth for this agent (openclaw agents add <id>) or copy auth-profiles.json from the main agentDir.No API key found for provider "google". Auth store: /root/.openclaw/agents/publisher/agent/auth-profiles.json (agentDir: /root/.openclaw/agents/publisher/agent). Configure auth for this agent (openclaw agents add <id>) or copy auth-profiles.json from the main agentDir.No API key found for provider "voyage". Auth store: /root/.openclaw/agents/publisher/agent/auth-profiles.json (agentDir: /root/.openclaw/agents/publisher/agent). Configure auth for this agent (openclaw agents add <id>) or copy auth-profiles.json from the main agentDir.No API key found for provider "mistral". Auth store: /root/.openclaw/agents/publisher/agent/auth-profiles.json (agentDir: /root/.openclaw/agents/publisher/agent). Configure auth for this agent (openclaw agents add <id>) or copy auth-profiles.json from the main agentDir.By source: memory · 0/2 files · 0 chunksVector: unknownFTS: readyEmbedding cache: enabled (0 entries)Batch: disabled (failures 0/2)📦 第一步:解压安装包到系统目录
# 进入存放安装包的目录cd /home/ubuntu# 安装 zstd 解压工具(如果系统还没有)sudo apt update && sudo apt install zstd -y# 解压到 /usr 目录(官方标准路径)sudo tar --zstd -xf ollama-linux-amd64.tar.zst -C /usr⁘ 验证解压是否成功:
# 检查可执行文件是否存在ls -la /usr/bin/ollama# 应该显示类似 -rwxr-xr-x 的文件# 测试版本命令/usr/bin/ollama --version# 应该输出 ollama version 0.x.x👤 第二步:创建专用系统用户(安全加固)
# 创建 ollama 系统用户(禁止登录,自动创建家目录)sudo useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama# 将当前用户加入 ollama 组(便于后续管理)sudo usermod -a -G ollama $(whoami)📁 第三步:设置模型存储目录权限
# 创建模型存储目录sudo mkdir -p /var/lib/ollama# 设置所有权为 ollama 用户sudo chown -R ollama:ollama /var/lib/ollama# 设置目录权限sudo chmod -R 755 /var/lib/ollama⚙️ 第四步:配置 systemd 服务(实现开机自启和后台运行)
# 创建服务文件sudo tee /etc/systemd/system/ollama.service > /dev/null <<'EOF'[Unit]Description=Ollama ServiceAfter=network-online.target[Service]ExecStart=/usr/bin/ollama serveUser=ollamaGroup=ollamaRestart=alwaysRestartSec=3Environment="OLLAMA_HOST=0.0.0.0"Environment="HOME=/var/lib/ollama"Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"[Install]WantedBy=multi-user.targetEOF重要说明:
OLLAMA_HOST=0.0.0.0 允许其他程序(如 OpenClaw)通过网络访问 HOME=/var/lib/ollama 指定模型存储路径为系统目录,便于管理
🚀 第五步:启动 Ollama 服务
# 重新加载 systemd 配置sudo systemctl daemon-reload# 启动 Ollama 服务sudo systemctl start ollama# 设置开机自启sudo systemctl enable ollama# 查看服务状态(应该显示 active (running))sudo systemctl status ollama🧪 第六步:验证服务运行状态
# 检查 Ollama API 是否可访问curl http://localhost:11434/api/tags# 应该返回一个 JSON 数组(可能为空,表示还没有模型)# 输出:{"models":[]}第七步:拉取嵌入模型(nomic-embed-text)
bash# 拉取模型sudo -u ollama /usr/bin/ollama pull nomic-embed-text# 查看已下载的模型ollama list输出:NAME ID SIZE MODIFIEDnomic-embed-text:latest 0a109f422b47 274 MB About a minute ago✅ 第八步:验证 Ollama 已就绪
# 确认服务运行正常sudo systemctl status ollama# 确认 API 返回模型列表curl http://localhost:11434/api/tags# 现在应该返回包含 nomic-embed-text 的 JSON🔗 第九步:配置 OpenClaw 使用 Ollama
现在回到 OpenClaw 配置记忆搜索:
# 启用记忆搜索openclaw config set agents.defaults.memorySearch.enabled true# 指定使用 ollama 作为嵌入提供商openclaw config set agents.defaults.memorySearch.provider ollama# 指定嵌入模型名称openclaw config set agents.defaults.memorySearch.model nomic-embed-text# 重启 OpenClaw Gatewayopenclaw gateway restart# 触发索引构建openclaw memory index# 查看记忆状态(现在应该有索引了)openclaw memory status --deep配置完成后检查:
root@VM-0-7-ubuntu:~/.openclaw# openclaw memory status --deepMemory Search (publisher)Provider: ollama (requested: ollama)Model: nomic-embed-textSources: memoryIndexed: 2/2 files · 2 chunksDirty: noStore: ~/.openclaw/memory/publisher.sqliteWorkspace: ~/.openclaw/workspace-publisherEmbeddings: readyBy source: memory · 2/2 files · 2 chunksVector: readyVector dims: 768Vector path: ~/.local/share/pnpm/global/5/.pnpm/sqlite-vec@0.1.7-alpha.2/node_modules/sqlite-vec-linux-x64/vec0.soFTS: readyEmbedding cache: enabled (2 entries)Batch: disabled (failures 0/2)后记:
完成向量部署后,通过配合上下文管理lossless-low以及memory backend检索机制这3个独立的系统完美实现内存的管理,后续将会从原理层面解释这3个系统如何配合完成一次会话。
夜雨聆风