实现强大搜索功能:使用Infinispan进行向量搜索

85 阅读2分钟

引言

Infinispan是一个开源的键值数据网格,能够以单节点或分布式的形式运行。自15.x版本以来,Infinispan支持向量搜索,这为开发者实现复杂的检索功能提供了便利。在本文中,我们将探索如何使用Infinispan和Python进行向量搜索。

主要内容

环境准备

要进行本次演示,我们需要一个正在运行的Infinispan实例和一个数据文件。请确保已安装以下Python库:

# 您可以根据需要跳过此部分
%pip install sentence-transformers
%pip install langchain
%pip install langchain_core
%pip install langchain_community

下载数据并配置Infinispan

在继续之前,请准备好数据文件并配置Infinispan。

# 下载新闻数据文件
wget https://raw.githubusercontent.com/rigazilla/infinispan-vector/main/bbc_news.csv.gz

# 创建Infinispan配置文件
echo 'infinispan:
  cache-container: 
    name: default
    transport: 
      cluster: cluster 
      stack: tcp 
  server:
    interfaces:
      interface:
        name: public
        inet-address:
          value: 0.0.0.0 
    socket-bindings:
      default-interface: public
      port-offset: 0        
      socket-binding:
        name: default
        port: 11222
    endpoints:
      endpoint:
        socket-binding: default
        rest-connector:
' > infinispan-noauth.yaml

# 运行Infinispan Docker实例
!docker rm --force infinispanvs-demo
!docker run -d --name infinispanvs-demo -v $(pwd):/user-config  -p 11222:11222 infinispan/server:15.0 -c /user-config/infinispan-noauth.yaml

代码示例

现在,让我们看看如何通过Python与Infinispan进行交互。

选择嵌入模型

我们将使用HuggingFace提供的嵌入模型。

from langchain.embeddings import HuggingFaceEmbeddings

model_name = "sentence-transformers/all-MiniLM-L12-v2"
hf = HuggingFaceEmbeddings(model_name=model_name)

准备数据

我们需要预处理数据文件以便将其存储在Infinispan中。

import csv
import gzip

# 打开数据文件并处理
with gzip.open("bbc_news.csv.gz", "rt", newline="") as csvfile:
    reader = csv.reader(csvfile, delimiter=",", quotechar='"')
    texts, metas = [], []
    for i, row in enumerate(reader):
        text = row[0] + "." + row[4]
        texts.append(text)
        metadata = {"text": row[4], "title": row[0]}
        metas.append(metadata)
        if i >= 5000:
            break

填充向量存储

from langchain_community.vectorstores import InfinispanVS

ispnvs = InfinispanVS.from_texts(texts, hf, metas)

进行查询

def print_docs(docs):
    for res in docs:
        print("TITLE: " + res.metadata["title"])
        print(res.page_content)

query_results = ispnvs.similarity_search("European nations", 5)
print_docs(query_results)

常见问题和解决方案

  1. 配置错误导致无法连接Infinispan
    检查Docker配置文件和网络设置,确保端口正确打开。

  2. 数据加载缓慢
    确保网络连接稳定,并使用本地代理服务提高访问速度。

  3. 模型嵌入时间较长
    考虑使用更高配置的服务器或者优化模型加载过程。

总结和进一步学习资源

本文介绍了使用Infinispan进行向量搜索的基础流程。对于大规模应用,可能需要深入了解Infinispan的集群配置和优化策略。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---