Skip to content

嵌入

embeddings embeddings

嵌入数据库是实现语义搜索的核心引擎。数据被转换为嵌入向量,其中相似的概念将产生相似的向量。无论是大型的还是小型的索引都是通过这些向量构建的。这些索引用于查找具有相同含义的结果,而不仅仅是相同的词汇。

以下代码片段展示了如何构建和搜索嵌入索引。

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键传递。请注意,必须启用内容来存储元数据,并启用对象来存储二进制对象数据。如果提供了idtags键,它们将被提取。

输入的可迭代对象可以是列表或生成器。生成器有助于索引非常大的数据集,因为任何时候只有部分数据在内存中。

有关索引的更多信息,请参阅索引指南

搜索

一旦数据被索引,就可以进行搜索了。

embeddings.search(query, limit)

搜索方法接受两个参数,查询和查询限制。结果的格式取决于是否存储了内容

  • 当内容未存储时,返回(id, 分数)的列表
  • 当内容存储时,返回{**查询列}的列表

支持自然语言和SQL查询。更多信息可以在查询指南中找到。

更多示例

请参阅此链接获取完整的嵌入示例列表。