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.0

2)启动 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 chunks

2)调用 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.py

SKILL.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 知识库方案


AI
最后修改于:2026年04月10日 10:45

评论已关闭

推荐阅读

AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日
python之plot()和subplot()画图
2024年11月26日
理解 DALL·E 2、Stable Diffusion 和 Midjourney 工作原理
2024年12月01日