LanceDB 实战:为 AI Agent 构建本地语义检索引擎
从方案选型到实战部署,让抓取的数据真正"活"起来

LanceDB 实战:为 AI Agent 构建本地语义检索引擎
从一份配置清单说起
前不久,我给自己的 AI Agent 做了一次全面的能力体检。结果出来了:13 个信息获取平台,10 个直接可用;7 个 MCP 工具全部就绪;52 个信息获取工具,46 个能用——覆盖率 88%。
按理说这应该很开心,但翻到最下面一行备注,我愣住了:
最大缺口: 不是平台没接入,而是向量数据库和数据管道——没有这些,所有抓到的数据都是"死数据"。
这句话像一根刺。花那么多时间配置抓取能力——小红书、Reddit、B 站、YouTube 全都接上了——结果内容抓进来只能躺在磁盘上吃灰。想找一篇几个月前抓到的文章,除了靠文件名猜,别无他法。
是时候解决这个问题了。

QMD vs 向量数据库:两种"记忆"的区别
在进入正题之前,先澄清一个容易混淆的概念。
如果你用过 OpenClaw,应该知道它自带一个叫 QMD 的记忆系统。那为什么还需要向量数据库?它们不都是"存东西、搜东西"的吗?
其实完全是两回事:
| 对比 | QMD(Agent 记忆) | 向量数据库(内容仓库) |
|---|---|---|
| 用途 | Agent 自己的经历记忆 | 外部内容的语义检索 |
| 存储什么 | 会话记录、笔记、记忆片段 | 抓到的网页/文章/平台数据 |
| 查询方式 | 关键词 + 语义(基于嵌入) | 纯语义(向量相似度) |
| 谁在用 | Agent 自己 | 你自己用 Agent 去搜索 |
| 能回答 | “上次我们聊了什么?” | “所有抓到的内容里,有没有提到 XXX?” |
一个很形象的类比:
- QMD → Agent 的"短期记忆",记的是自己的经历和见闻
- 向量数据库 → Agent 的"图书馆",存的是外部收集的资料
两者互补,并行不悖。QMD 让 Agent 记住你们的对话历史,向量数据库让 Agent 能搜索海量外部内容。

主流向量数据库方案选型
市面上的向量数据库不少,我花了些时间把主流方案拉出来对比了一遍:
| 方案 | 类型 | 本地运行 | 外部依赖 | 适用规模 |
|---|---|---|---|---|
| Chroma | Python 库 | ✅ 原生 | ❌ 无 | 万级文档以内 |
| LanceDB | Python 库 + Parquet | ✅ 原生 | ❌ 无 | 万到十万级 |
| Qdrant | Rust 服务 | ✅ 可自建 | ✅ 需 Docker | 中等规模,需高级查询 |
| Pinecone | 云服务 | ❌ | ✅ API Key | 大规模生产 |
| Milvus | C++ 服务 | ✅ 可自建 | ✅ 需 Docker | 百万级 |
我自己的需求很明确:
- 本地运行——不做云服务,数据在自己手里
- 零外部依赖——不想为一个小功能起 Docker 容器
- 万级以内——个人使用,不追求百万级规模
- Agent 集成友好——Python 调用要够简单
按这个标准,Pinecone 和 Milvus 直接出局(一个要云,一个太重)。Qdrant 很好但需要 Docker,杀鸡用牛刀。剩下 Chroma 和 LanceDB 两个候选。
Chroma 是社区最热门的选项,三行代码就能用,文档好、活跃度高。LanceDB 同样零配置,底层用 Parquet 格式存储,查询性能在数据量大时比 Chroma 更优。
最终我选了 LanceDB——既然是"可以存更多数据"的备选,那干脆一步到位。而且 Parquet 底层的优势在于:以后数据量上来了,不需要迁移方案,原地就能扛住。

LanceDB 安装:三行命令搞定
安装过程比想象的还简单:
# 激活 Python 虚拟环境
source ~/.venv/bin/activate
# 安装 lancedb
pip install lancedb是的,就这一条命令。没有 Docker,没有系统依赖,没有编译等待。
安装完成后,创建一个数据库实例:
import lancedb
# 指定一个本地目录作为数据库存储路径
db = lancedb.connect('/home/oklife/lancedb_demo')
print("LanceDB 连接成功!")数据库路径可以是任意目录,如果目录不存在会自动创建。LanceDB 会在该目录下存储所有表和索引数据。
验证安装版本:
python3 -c "import lancedb; print(lancedb.__version__)"
# 输出: 0.34.0实战:存入内容并语义检索
安装只是第一步,能不能真正用起来才是关键。我决定用抓到的"闲鱼出售虚拟资料"相关文章做一次完整的语义检索演示。
第一步:配置嵌入模型
LanceDB 内置了嵌入函数注册表,可以直接加载 sentence-transformers 模型:
from lancedb.embeddings import get_registry
# 加载轻量级嵌入模型
emb = get_registry().get('sentence-transformers').create(
name='all-MiniLM-L6-v2'
)all-MiniLM-L6-v2 是一个 80MB 大小的轻量嵌入模型,生成 384 维向量。对中文语义检索效果不错,而且运行在本地,不需要联网。
第二步:创建表并写入数据
# 准备测试数据——模拟从各平台抓取的五篇关于"闲鱼卖虚拟资料"的文章
articles = [
{
'id': '1',
'title': '一天收入200+',
'source': '立破网',
'text': '长期可做项目,一周出单,每天2小时选品。闲鱼出售虚拟资料,自动发货,无需囤货。'
},
{
'id': '2',
'title': '靠AI闷声赚钱月入5000+',
'source': '知乎',
'text': '三类产品:教程资料包9.9-19.9元、信息差服务、PPT模板。利用AI批量生成资料,自动上架。'
},
{
'id': '3',
'title': '搭配网盘拉新',
'source': '知鸿阁',
'text': '自动发货系统,注意版权问题,早八晚八上架,搭配网盘拉新双重收益。'
},
{
'id': '4',
'title': '副业拆解月入10000+',
'source': '搜狐',
'text': '自动发货24小时不间断,运营4个闲鱼号,日入八九百。核心是选品和自动化。'
},
{
'id': '5',
'title': '新号2天破100单',
'source': 'AI副业网',
'text': '单天利润900-2000,自动上传加自动发货,新号冷启动策略。'
},
]
# 创建表,传入嵌入函数和初始数据
table = db.create_table('xianyu_articles', embedding_functions=[emb], data=articles)这里有一个很巧妙的设计:创建表时传入 embedding_functions=[emb],后续写入的数据中只要包含 text 字段,LanceDB 就会自动调用嵌入模型将文本转为向量存进去。完全不需要手动调用嵌入 API。

第三步:语义检索
# 搜索与"闲鱼虚拟资料"相关的内容
results = table.search('闲鱼出售虚拟资料赚钱').limit(5)
# 输出结果
for i, r in enumerate(results.to_list(), 1):
print(f"\n--- 结果 {i} ---")
print(f"标题: {r['title']}")
print(f"来源: {r['source']}")
print(f"内容摘要: {r['text'][:80]}...")检索结果
语义检索返回的文章按相关性从高到低排列:
| 排名 | 标题 | 来源 | 核心信息 |
|---|---|---|---|
| 1 | 一天收入200+ | 立破网 | 长期可做,一周出单,每天2小时选品 |
| 2 | 靠AI闷声赚钱月入5000+ | 知乎 | 三类产品:教程资料包、信息差服务、PPT模板 |
| 3 | 搭配网盘拉新 | 知鸿阁 | 自动发货,注意版权,早八晚八上架 |
| 4 | 副业拆解月入10000+ | 搜狐 | 自动发货24小时,4个号日入八九百 |
| 5 | 新号2天破100单 | AI副业网 | 单天利润900-2000,自动上传+自动发货 |
每篇文章都与搜索词"闲鱼出售虚拟资料赚钱"高度相关。这就是语义检索的魅力——不需要精确匹配关键词,你的查询和文章内容"意思相近"就能找到。
数据库文件结构
完成写入后,LanceDB 在磁盘上生成的数据文件结构如下:
/home/oklife/lancedb_demo/
├── xianyu_articles.lance/ ← 闲鱼虚拟资料文章库
│ ├── _versions/ ← 版本管理
│ ├── data/ ← Parquet 文件(实际数据)
│ └── manifest.json ← 索引清单
└── test_articles.lance/ ← 之前测试的表每个表对应一个 .lance 目录,数据以列式格式(Parquet)存储。这种格式的特点是按列压缩,查询时只读取所需的列,性能和存储效率都很好。

总结与下一步
经过这一轮实战验证,可以确认 LanceDB 完全满足我的需求:
- ✅ 零外部依赖:纯 Python 库,
pip install lancedb即装即用 - ✅ 本地持久化:所有数据存储在本地磁盘,不依赖云服务
- ✅ 自动嵌入:写入时自动调用嵌入模型向量化,无需手动处理
- ✅ 语义检索:搜索自然语言描述即可找到相关内容,不要求精确关键词匹配
- ✅ 性能优秀:Parquet 底层存储,查询效率随数据量增长保持稳定
下一步可以做的事情
- 接入数据管线:把 agent-reach 抓取的所有内容自动写入 LanceDB,实现"抓取即入库"
- 构建多知识库:按主题分表——小红书笔记一个表、知乎文章一个表、RSS 订阅一个表
- Agent 集成:让 OpenClaw Agent 在回答问题前先查询 LanceDB,获得外部知识支持
- 定时更新:配合 cron 定期抓取增量内容,保持知识库的时效性
关于其他待办事项
LanceDB 就位后,原来的待办清单也需要跟进。如果你也想搭建完整的 AI Agent 信息管线,下面这三件事值得优先处理:
- GitHub 认证:
gh auth login浏览器登录一次,之后就能直接操作仓库 - 小宇宙播客转录:注册 Groq → 配置 API Key,播客内容就能转文字入库
- 雪球股票行情:浏览器登录雪球 →
agent-reach configure取 Cookie

关联阅读
- [[QMD 记忆系统配置与使用]] — Agent 内部记忆的配置指南,与本文的向量数据库方案互补
- [[OpenClaw 记忆系统完整验证报告]] — 深入理解 QMD 记忆系统的工作原理和验证过程
- [[LanceDB 数据库]] — 本文源笔记,包含更原始的工具配置和方案选型信息
参考来源
–全文完–

梦行志
