嵌入
嵌入数据库是实现语义搜索的核心引擎。数据被转换为嵌入向量,其中相似的概念将产生相似的向量。无论是大型的还是小型的索引都是通过这些向量构建的。这些索引用于查找具有相同含义的结果,而不仅仅是相同的词汇。
以下代码片段展示了如何构建和搜索嵌入索引。
from txtai import Embeddings
# 创建嵌入模型,基于 sentence-transformers 和 transformers
embeddings = Embeddings(path="sentence-transformers/nli-mpnet-base-v2")
data = [
"美国确诊新冠病毒病例超过500万",
"加拿大最后一块完整的冰架突然崩塌,形成了一个曼哈顿大小的冰山",
"随着台海紧张局势升级,北京在沿海动员了入侵船只",
"国家公园管理局警告,在熊袭击中不要牺牲行动缓慢的朋友",
"缅因州男子赢得25美元彩票,赢得100万美元",
"无需工作即可赚取巨额利润,每天可赚取高达10万美元"
]
# 索引文本列表
embeddings.index(data)
print(f"{'查询':20} 最佳匹配")
print("-" * 50)
# 对每个查询运行嵌入搜索
for query in ("感人故事", "气候变化", "公共卫生故事", "战争",
"野生动物", "亚洲", "幸运", "不诚实的垃圾"):
# 提取第一个结果的uid
# 搜索结果格式:(uid, 分数)
uid = embeddings.search(query, 1)[0][0]
# 打印文本
print(f"{query:20} {data[uid]}")
构建
嵌入实例是基于构造函数中传入的内容进行配置驱动的。向量存储时可以选择存储内容。内容存储启用了额外的过滤和数据检索选项。
上面的示例通过路径参数设置了一个特定的嵌入向量模型。也可以创建一个没有配置的嵌入实例。
embeddings = Embeddings()
在这种情况下,在加载和搜索数据时,将使用默认的transformers向量模型来向量化数据。有关当前模型的推荐,请参阅模型指南。
索引
在创建新的嵌入实例后,下一步是向其中添加数据。
embeddings.index(rows)
索引方法接受一个可迭代对象,并支持以下每种元素的格式。
(id, data, tags)
- 默认处理格式
元素 | 描述 |
---|---|
id | 唯一记录ID |
data | 要索引的输入数据,可以是文本、字典或对象 |
tags | 可选的标签字符串,用于在索引时标记/标记数据 |
(id, data)
与上述相同,但没有标签。
data
单个要索引的元素。在这种情况下,将自动生成唯一的ID。请注意,对于生成的ID,更新和删除调用需要单独的搜索来获取目标ID。
当数据字段是字典时,文本通过text
键传递,二进制对象通过object
键传递。请注意,必须启用内容来存储元数据,并启用对象来存储二进制对象数据。如果提供了id
和tags
键,它们将被提取。
输入的可迭代对象可以是列表或生成器。生成器有助于索引非常大的数据集,因为任何时候只有部分数据在内存中。
有关索引的更多信息,请参阅索引指南。
搜索
一旦数据被索引,就可以进行搜索了。
embeddings.search(query, limit)
搜索方法接受两个参数,查询和查询限制。结果的格式取决于是否存储了内容。
- 当内容未存储时,返回
(id, 分数)
的列表 - 当内容存储时,返回
{**查询列}
的列表
支持自然语言和SQL查询。更多信息可以在查询指南中找到。
更多示例
请参阅此链接获取完整的嵌入示例列表。