目录

LanceDB 实战:为 AI Agent 构建本地语义检索引擎

从方案选型到实战部署,让抓取的数据真正"活"起来

LanceDB 实战:为 AI Agent 构建本地语义检索引擎

从一份配置清单说起

前不久,我给自己的 AI Agent 做了一次全面的能力体检。结果出来了:13 个信息获取平台,10 个直接可用;7 个 MCP 工具全部就绪;52 个信息获取工具,46 个能用——覆盖率 88%。

按理说这应该很开心,但翻到最下面一行备注,我愣住了:

最大缺口: 不是平台没接入,而是向量数据库和数据管道——没有这些,所有抓到的数据都是"死数据"。

这句话像一根刺。花那么多时间配置抓取能力——小红书、Reddit、B 站、YouTube 全都接上了——结果内容抓进来只能躺在磁盘上吃灰。想找一篇几个月前抓到的文章,除了靠文件名猜,别无他法。

是时候解决这个问题了。

/images/Code-Art-Studio-images/lancedb-local-semantic-search-engine/illustrations/1.webp

QMD vs 向量数据库:两种"记忆"的区别

在进入正题之前,先澄清一个容易混淆的概念。

如果你用过 OpenClaw,应该知道它自带一个叫 QMD 的记忆系统。那为什么还需要向量数据库?它们不都是"存东西、搜东西"的吗?

其实完全是两回事:

对比QMD(Agent 记忆)向量数据库(内容仓库)
用途Agent 自己的经历记忆外部内容的语义检索
存储什么会话记录、笔记、记忆片段抓到的网页/文章/平台数据
查询方式关键词 + 语义(基于嵌入)纯语义(向量相似度)
谁在用Agent 自己你自己用 Agent 去搜索
能回答“上次我们聊了什么?”“所有抓到的内容里,有没有提到 XXX?”

一个很形象的类比:

  • QMD → Agent 的"短期记忆",记的是自己的经历和见闻
  • 向量数据库 → Agent 的"图书馆",存的是外部收集的资料

两者互补,并行不悖。QMD 让 Agent 记住你们的对话历史,向量数据库让 Agent 能搜索海量外部内容。

/images/Code-Art-Studio-images/lancedb-local-semantic-search-engine/illustrations/2.webp

主流向量数据库方案选型

市面上的向量数据库不少,我花了些时间把主流方案拉出来对比了一遍:

方案类型本地运行外部依赖适用规模
ChromaPython 库✅ 原生❌ 无万级文档以内
LanceDBPython 库 + Parquet✅ 原生❌ 无万到十万级
QdrantRust 服务✅ 可自建✅ 需 Docker中等规模,需高级查询
Pinecone云服务✅ API Key大规模生产
MilvusC++ 服务✅ 可自建✅ 需 Docker百万级

我自己的需求很明确:

  1. 本地运行——不做云服务,数据在自己手里
  2. 零外部依赖——不想为一个小功能起 Docker 容器
  3. 万级以内——个人使用,不追求百万级规模
  4. Agent 集成友好——Python 调用要够简单

按这个标准,Pinecone 和 Milvus 直接出局(一个要云,一个太重)。Qdrant 很好但需要 Docker,杀鸡用牛刀。剩下 Chroma 和 LanceDB 两个候选。

Chroma 是社区最热门的选项,三行代码就能用,文档好、活跃度高。LanceDB 同样零配置,底层用 Parquet 格式存储,查询性能在数据量大时比 Chroma 更优。

最终我选了 LanceDB——既然是"可以存更多数据"的备选,那干脆一步到位。而且 Parquet 底层的优势在于:以后数据量上来了,不需要迁移方案,原地就能扛住。

/images/Code-Art-Studio-images/lancedb-local-semantic-search-engine/illustrations/3.webp

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。

/images/Code-Art-Studio-images/lancedb-local-semantic-search-engine/illustrations/4.webp

第三步:语义检索

# 搜索与"闲鱼虚拟资料"相关的内容
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)存储。这种格式的特点是按列压缩,查询时只读取所需的列,性能和存储效率都很好。

/images/Code-Art-Studio-images/lancedb-local-semantic-search-engine/illustrations/5.webp

总结与下一步

经过这一轮实战验证,可以确认 LanceDB 完全满足我的需求:

  • 零外部依赖:纯 Python 库,pip install lancedb 即装即用
  • 本地持久化:所有数据存储在本地磁盘,不依赖云服务
  • 自动嵌入:写入时自动调用嵌入模型向量化,无需手动处理
  • 语义检索:搜索自然语言描述即可找到相关内容,不要求精确关键词匹配
  • 性能优秀:Parquet 底层存储,查询效率随数据量增长保持稳定

下一步可以做的事情

  1. 接入数据管线:把 agent-reach 抓取的所有内容自动写入 LanceDB,实现"抓取即入库"
  2. 构建多知识库:按主题分表——小红书笔记一个表、知乎文章一个表、RSS 订阅一个表
  3. Agent 集成:让 OpenClaw Agent 在回答问题前先查询 LanceDB,获得外部知识支持
  4. 定时更新:配合 cron 定期抓取增量内容,保持知识库的时效性

关于其他待办事项

LanceDB 就位后,原来的待办清单也需要跟进。如果你也想搭建完整的 AI Agent 信息管线,下面这三件事值得优先处理:

  • GitHub 认证gh auth login 浏览器登录一次,之后就能直接操作仓库
  • 小宇宙播客转录:注册 Groq → 配置 API Key,播客内容就能转文字入库
  • 雪球股票行情:浏览器登录雪球 → agent-reach configure 取 Cookie

/images/Code-Art-Studio-images/lancedb-local-semantic-search-engine/illustrations/6.webp


关联阅读

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

参考来源


–全文完–

感谢阅读
若你有故事想讲、有困惑想聊、或是想找个人说说心里话,甚至只是吐槽发泄一下情绪,都欢迎来找我聊聊:   《内容已折叠,点击展开》

希望我写的每一个字,成为我自己和某个人活下去、拼下去的力量。                     《内容已折叠,点击展开》

“技术终归是工具,而我们一次次认真把问题理顺,守住的其实不只是页面样式和代码输出,还有那一点不愿被混乱打败的心气,是每一个深夜仍愿点灯前行的人。”

转载请注明来自https://oklife.me。

文尾配图水墨画图片