数据截至 (上游 commit 059ecec2eeac)
txtai — 这是什么 / 全景图 / 阅读地图
30 秒导读: txtai 是一个 all-in-one 的 AI 框架,但本套文档只聚焦它的检索心脏——「嵌入数据库」(embeddings database):一个把「稠密向量索引 + 稀疏关键词索引 + 关系数据库 + 图网络」四种后端焊在一起的对象,专门服务语义搜索和 RAG(检索增强生成,先查资料再让大模型作答)。
本页是索引页(顶层路由)。 它只覆盖三件事:这是什么、全景怎么转、该往哪读。任何单一机制的原理与代码走读都留给 01–06 章,本页不深入、不与后续重复。
1. 这是什么(零基础也能懂)
一句话定义。 txtai 是一个开源 AI 框架;它对外自称「all-in-one AI framework for semantic search, LLM orchestration and language model workflows」(setup.py:184)。
但本文只讲它的一个部件。 按官方 README 的原话,txtai 最关键的组件是嵌入数据库,它是「向量索引 (稀疏 + 稠密)、图网络、关系数据库的联合体」(README.md 顶部特性段)。搜索、RAG、agent 都建在这块地基上,所以理解 txtai 的检索能力 = 理解嵌入数据库。
它给谁、解决什么问题。 传统搜索按关键词匹配;语义搜索理解意思——查「positive」,能命中「Correct」这种词面不同但含义相近的结果。假设你有一堆文档、图片、音频,想让程序「按意思找」,或想给大模型接一个外部知识源,txtai 就是那层「把数据变成可被意思检索的库」。
它能做什么(本文范围内):
- 把文本 / 文档 / 图像 / 音频 / 视频转成向量并建索引
- 稠密向量搜索、稀疏关键词搜索、两者混合(hybrid)搜索
- 用 SQL 在向量库上做带过滤条件的检索
- 把结果组织成图网络,跑关系检索与主题建模
用起来什么样。 最小示例来自 README——三行建库、一行搜索:
# 示意(取自 README.md),非源码走读
import txtai
embeddings = txtai.Embeddings() # 用默认句向量模型,零配置
embeddings.index(["Correct", "Not what we hoped"])
embeddings.search("positive", 1)
# [(0, 0.29862046241760254)] # 命中 "Correct",按语义而非词面
一句话直觉 / 类比。 把嵌入数据库想成一台多引擎的搜索发动机:同一批数据,既能「按意思」查(稠密向量),又能「按词」查(稀疏关键词),还能「带条件」查(SQL),还能「顺着关系」查(图)——而它们共享同一份 id 和内容,所以可以随意组合。这套「可插拔」正是 txtai 的设计取向:setup.py 把 ann / database / graph / scoring / vectors 全部拆成可选依赖分组(setup.py:58-164),你只装用得到的引擎。
本节到此不碰任何底层代码。往下才进入「大盘怎么转」。
2. 全景图(一个 Embeddings 里的『五联合』)
一个 Embeddings 实例(embeddings/base.py:22)就是一个装配现场:它按你的 config,把最多五个协作部件挂到自己身上(__init__ 里的 self.ann / self.scoring / self.database / self.graph / self.model,见 embeddings/base.py:46-65)。README 说的「联合体」,落到代码就是这五个字段。
怎么读下面这张图: 上半是四个数据存储 / 索引后端(查询时被路由到的目标),下半的向量模型是给它们供料的公共上游;中间的 Embeddings 是编排者,谁都不直接对话,全经它转发。
┌──────────────────────────────┐
文档流 documents → │ Embeddings (编排 / 路由) │ ← 查询 query
│ embeddings/base.py:22 │
└───┬────────┬────────┬─────────┘
┌───────────────────┘ │ └───────────────────┐
▼ ▼ ▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌──────────┐ ┌───────────┐ (content 存哪)
│ ① 稠密索引 │ │ ② 稀疏索引 │ │ ④ 图网络 │ │ ③ 关系数据库│
│ ANN 近邻 │ │ scoring │ │ graph │ │ database │
│ self.ann │ │self.scoring│ │self.graph │ │self.database│
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘
│「按意思」 │「按词」 │「顺关系」 │「按条件/存原文」
└──────────┬──────┴─────────────┴───────────────┘
▼
┌──────────────────┐
│ ⑤ 向量模型 model │ 文本/文档 → 向量,供 ①②④ 使用
│ self.model │ (VectorsFactory 造)
└──────────────────┘
五个部件一句话职责(谁造它、在哪,详见对应章):
| # | 部件 | 干什么(白话) | 装配入口(base.py 符号) | 详见章 |
|---|---|---|---|---|
| ① | 稠密索引 ANN | 「按意思找」——近似最近邻搜向量 | createann (:958) | 03 |
| ② | 稀疏索引 scoring | 「按词找」——bm25/tfidf 等关键词打分 | createscoring (:1054) | 03 |
| ③ | 关系数据库 database | 存原文 + 用 SQL 带条件检索(content store) | createdatabase (:972) | 05 |
| ④ | 图网络 graph | 顺着节点关系检索、跑主题建模 | creategraph (:994) | 06 |
| ⑤ | 向量模型 model | 把数据变成向量,喂给 ①②④ | loadvectors (:888) | 02 |
五个部件都可缺席:只挂 ① 就是纯向量库,① + ② 就是 hybrid,③ 决定「结果是
(id, score)元组还是带原文的 dict」。它们如何按 config 被选择性创建,是 01 章的主题。
3. 主线走一遍(高层,不进代码)
嵌入数据库有两条主干路径:建索引(index) 和