技术背景介绍

SQLite-VSS 是一个专为向量搜索设计的 SQLite 扩展,强调本地优先操作,便于集成到无需外部服务器的应用中。通过利用 Faiss 库,它提供了高效的相似度搜索和聚类功能。

本文将介绍如何使用 langchain-community 提供的工具,通过向量化文本数据并保存到 SQLite 数据库中进行高效的相似度查询。这不仅能够提升搜索效率,同时还能保证数据的本地化存储,适合嵌入到本地应用中。

核心原理解析

SQLite-VSS 结合了 SQL 数据库的易用性和 Faiss 的强大向量搜索能力。我们可以使用预训练的嵌入模型(例如 sentence-transformers)将文本转换为向量,然后存储在 SQLite 数据库中。查询时,利用向量之间的相似度进行高效的搜索。

代码实现演示

以下是完整的代码示例,展示了如何进行向量搜索的具体步骤:

安装依赖

首先,需要安装必要的依赖项:

pip install --upgrade --quiet sqlite-vss langchain-community

快速开始示例

import os
from langchain_community.document_loaders import TextLoader
from langchain_community.embeddings.sentence_transformer import SentenceTransformerEmbeddings
from langchain_community.vectorstores import SQLiteVSS
from langchain_text_splitters import CharacterTextSplitter

# 加载文档并分割为多个片段
loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()

# 将文档分割为多个片段
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
texts = [doc.page_content for doc in docs]

# 创建开源嵌入函数
embedding_function = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")

# 将文本加载到 SQLite-VSS 中,表名为 state_union
db = SQLiteVSS.from_texts(
    texts=texts,
    embedding=embedding_function,
    table="state_union",
    db_file="/tmp/vss.db",
)

# 查询
query = "What did the president say about Ketanji Brown Jackson"
data = db.similarity_search(query)

# 打印结果
print(data[0].page_content)

使用现有的 SQLite 连接

如果已有 SQLite 连接,可以通过以下方式使用 SQLite-VSS:

from langchain_community.document_loaders import TextLoader
from langchain_community.embeddings.sentence_transformer import SentenceTransformerEmbeddings
from langchain_community.vectorstores import SQLiteVSS
from langchain_text_splitters import CharacterTextSplitter

# 加载文档并分割为多个片段
loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()

# 将文档分割为多个片段
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
texts = [doc.page_content for doc in docs]

# 创建开源嵌入函数
embedding_function = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")
connection = SQLiteVSS.create_connection(db_file="/tmp/vss.db")

db1 = SQLiteVSS(
    table="state_union", embedding=embedding_function, connection=connection
)

db1.add_texts(["Ketanji Brown Jackson is awesome"])

# 再次查询
query = "What did the president say about Ketanji Brown Jackson"
data = db1.similarity_search(query)

# 打印结果
print(data[0].page_content)

# 清理数据库文件
os.remove("/tmp/vss.db")

应用场景分析

  1. 本地搜索引擎:适合应用在需要本地数据存储和搜索的场景,如桌面应用、移动应用等。
  2. 隐私保护:由于所有数据均保存在本地,适用于数据隐私要求高的应用场景。
  3. 快速原型开发:利用 SQLite-VSS 可以快速构建原型,不需要复杂的服务器部署。

实践建议

  1. 选择合适的嵌入模型:根据具体应用选择合适的嵌入模型,以平衡精度和性能。
  2. 定期维护数据库:定期清理和优化 SQLite 数据库,以确保搜索效率。
  3. 本地存储注意事项:由于数据存储在本地,需注意数据备份和恢复机制。

如果遇到问题欢迎在评论区交流。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐