跳到主要内容

2. Embedding 与向量数据库实战 (Qdrant/Chroma)

切分好的文档段落(Chunk)如何快速进行语义搜索?我们需要借助 Embedding 模型 与专门的 向量数据库(Vector DB)


🔮 1. Embedding 模型选型

Embedding 模型负责将文本文本转换为高维向量(如 768 或 1024 维):

  • 中文推荐选型BAAI/bge-m3(支持多语言、多粒度、混合检索)、text-embedding-3-small(OpenAI)。

🗄️ 2. 向量数据库 vs 传统数据库

传统 SQL 数据库使用 WHERE text LIKE '%关键词%',只能进行字面精准匹配(搜索“苹果”,搜不到“iPhone”)。

向量数据库采用 HNSW 等近似近邻算法(ANN),通过计算余弦距离,实现语义相似度模糊搜索


💻 3. Python 轻量级向量数据库 Chroma 实战

下面用 20 行代码展示文档入库与语义检索全流程:

import chromadb
from chromadb.utils import embedding_functions

# 1. 初始化 Chroma 本地向量数据库客户端
client = chromadb.Client()

# 2. 使用默认轻量 Embedding 模型创建集合 (Collection)
collection = client.create_collection(name="company_kb")

# 3. 准备知识库文档数据
documents = [
"公司员工年假规定:工作满1年享有5天带薪年假。",
"出差报销标准:一线城市住宿补贴为每天 500 元。",
"无线网络 Wi-Fi 密码是 Company2026!,请勿外传。"
]
ids = ["doc1", "doc2", "doc3"]

# 4. 文档批量入库 (自动向量化)
collection.add(
documents=documents,
ids=ids
)

# 5. 用户提问语义检索 (即便没有出现“休假”二字也能查到)
query_text = "我今年入职,能休几天假?"
results = collection.query(
query_texts=[query_text],
n_results=1 # 返回最相似的 1 条结果
)

print("查询问题:", query_text)
print("检索到的最匹配知识库段落:\n", results['documents'][0][0])
# 匹配输出: "公司员工年假规定:工作满1年享有5天带薪年假。"