OpenClaw + Ollama + Elasticsearch 本地知识库 Agent 实战
让 Agent 真正具备本地知识检索、混合召回、自动索引、文档问答、持续记忆能力
- Elasticsearch 检索
- OCR / 合同系统
- 本地文档知识库
- 自动化工作流
- RAG Agent
OpenClaw + Ollama + Elasticsearch 本地知识库 Agent 实战
核心目标:
所有数据本地闭环,不走云端 API,OpenClaw 调度 Agent,Ollama 负责推理,Elasticsearch 负责混合检索与长期知识存储。(AI Agent Knowledge Base)
一、整体架构设计
推荐你直接采用这套生产架构:
User / Telegram / Web
↓
OpenClaw Gateway
↓
Agent Runtime
├── Tool Router
├── Memory Search
├── File Parser
└── Workflow Skills
↓
Ollama (Qwen2.5 / DeepSeek)
↓
Elasticsearch
├── BM25
├── Dense Vector
├── HNSW
└── Metadata Filter
↓
MinIO / 本地文件其中:
- OpenClaw = Agent 编排层
- Ollama = 本地 LLM
- Elasticsearch = 混合检索层
- MinIO = 原文档存储层
这正好和你现在的 ES + OCR 技术栈高度一致。
二、环境准备
1)启动 Elasticsearch
docker run -d \
--name es \
-p 9200:9200 \
-e discovery.type=single-node \
-e xpack.security.enabled=false \
-e ES_JAVA_OPTS="-Xms2g -Xmx2g" \
docker.elastic.co/elasticsearch/elasticsearch:8.15.02)启动 Ollama
ollama serve
ollama pull qwen2.5:7b
ollama pull nomic-embed-text本地 embedding 强烈推荐 nomic-embed-text。社区在 OpenClaw hybrid RAG 中大量使用。(reddit.com)
3)启动 OpenClaw
openclaw onboard新版已经支持自动发现本地 Ollama。(OpenClaw Alpha)
三、Elasticsearch 索引设计(核心)
这里是整个系统最关键的一层。
知识库索引 Mapping
PUT local_knowledge
{
"mappings": {
"properties": {
"doc_id": { "type": "keyword" },
"title": { "type": "text" },
"content": { "type": "text" },
"vector": {
"type": "dense_vector",
"dims": 768,
"index": true,
"similarity": "cosine",
"index_options": {
"type": "hnsw"
}
},
"tags": { "type": "keyword" },
"created_at": { "type": "date" }
}
}
}非常适合:
- 合同文档
- OCR PDF
- 技术文档
- 项目知识库
- API 文档
四、Python 文档入库 Pipeline(重点)
下面给你生产级 Python 脚本。
1)文档切块
from pathlib import Path
def chunk_text(text, size=500, overlap=100):
chunks = []
start = 0
while start < len(text):
end = start + size
chunks.append(text[start:end])
start += size - overlap
return chunks2)调用 Ollama Embedding
import requests
def embed(text):
resp = requests.post(
"http://localhost:11434/api/embeddings",
json={
"model": "nomic-embed-text",
"prompt": text
}
)
return resp.json()["embedding"]3)写入 Elasticsearch
from elasticsearch import Elasticsearch
from datetime import datetime
import uuid
es = Elasticsearch("http://localhost:9200")
def index_doc(title, content):
chunks = chunk_text(content)
for chunk in chunks:
vector = embed(chunk)
es.index(
index="local_knowledge",
document={
"doc_id": str(uuid.uuid4()),
"title": title,
"content": chunk,
"vector": vector,
"tags": ["contract"],
"created_at": datetime.now()
}
)五、混合检索(BM25 + 向量)
这是效果最好的方案。
OpenClaw 社区也非常推荐 hybrid memorySearch。(reddit.com)
Python Hybrid Search
def hybrid_search(query, query_vector):
return es.search(
index="local_knowledge",
query={
"bool": {
"should": [
{"match": {"content": query}},
{
"script_score": {
"query": {"match_all": {}},
"script": {
"source": "cosineSimilarity(params.q, 'vector') + 1.0",
"params": {"q": query_vector}
}
}
}
]
}
},
size=5
)六、接入 OpenClaw Skill(核心实战)
你真正要的是让 Agent 自动调用 ES。
skill 目录结构
skills/
└── es-rag/
├── SKILL.md
└── search.pySKILL.md
# ES RAG Search
When users ask about:
- contract
- OCR files
- project docs
- Elasticsearch architecture
- deployment scripts
Always call search.py first.
Use retrieved context before answering.Skill 是 OpenClaw 最核心扩展能力。(TechRadar)
search.py
import sys
query = sys.argv[1]
vec = embed(query)
result = hybrid_search(query, vec)
for hit in result["hits"]["hits"]:
print(hit["_source"]["content"])七、OpenClaw Agent 工作流优化(非常关键)
很多人只做了“能检索”,但 Agent 不一定主动用。
社区最佳实践是:
强制写入 AGENTS.md 规则,让 Agent 优先 memorySearch,再读文件 (reddit.com)
AGENTS.md
Before opening files directly:
1. Always use Elasticsearch hybrid retrieval
2. Prefer semantic recall
3. Merge top5 chunks
4. Then ask Ollama to summarize这一条非常关键。
否则 Agent 容易:
ls- 遍历文件夹
- 逐个打开 markdown
- 浪费大量 token
八、适配你的 OCR / 合同系统(强烈推荐)
你当前业务非常适合:
PDF
↓
OCR
↓
结构化字段抽取
↓
Chunk
↓
Embedding
↓
Elasticsearch
↓
OpenClaw Agent例如:
- 用户问:某合同违约条款是什么?
- Agent 自动检索 OCR 结果
- 返回原始 chunk + 总结结果
- 自动附带合同编号
九、性能优化(生产级)
1)混合权重推荐
直接用社区验证过的权重:
{
"vectorWeight": 0.7,
"textWeight": 0.3
}(reddit.com)
2)MMR 去重
lambda = 0.7避免多个 chunk 高度重复。
3)时间衰减
halfLifeDays = 30适合你的合同、版权咨询、工单系统。
十、最适合你的最终生产架构
Nginx
↓
OpenClaw
↓
Ollama(Qwen2.5)
↓
Elasticsearch(HNSW)
↓
MinIO
↓
OCR / Contract / Copyright System这套是你当前最匹配的 本地私有 Agent 知识库方案。
评论已关闭