OpenSearch

OpenSearchopen in new window 是一个可扩展、灵活且可扩展的开源软件套件,用于搜索、分析和可观察性应用,采用 Apache 2.0 许可。OpenSearch 是基于 Apache Lucene 的分布式搜索和分析引擎。

本笔记演示了与 OpenSearch 数据库相关的功能。

在运行之前,您应该已经启动了一个 OpenSearch 实例:点击这里查看简单的 Docker 安装方式open in new window

similarity_search 默认执行近似 k-NN 搜索,它使用了一些针对大型数据集推荐的算法,如 lucene、nmslib、faiss。如果要执行蛮力搜索,我们还有其他的搜索方法,比如脚本评分和痛点脚本。详细信息请查阅 这里open in new window

安装

安装 Python 客户端。

!pip install opensearch-py

我们想要使用 OpenAIEmbeddings,因此我们需要获取 OpenAI API 密钥。

import os
import getpass

os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Key:')
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import OpenSearchVectorSearch
from langchain.document_loaders import TextLoader
from langchain.document_loaders import TextLoader
loader = TextLoader('../../../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()

使用近似 k-NN 进行相似性搜索

使用自定义参数的 Approximate k-NN 搜索的 similarity_search 方法。

docsearch = OpenSearchVectorSearch.from_documents(
    docs, 
    embeddings, 
    opensearch_url="http://localhost:9200"
)

# If using the default Docker installation, use this instantiation instead:
# docsearch = OpenSearchVectorSearch.from_documents(
#     docs, 
#     embeddings, 
#     opensearch_url="https://localhost:9200", 
#     http_auth=("admin", "admin"),     
#     use_ssl = False,
#     verify_certs = False,
#     ssl_assert_hostname = False,
#     ssl_show_warn = False,
# )
query = "What did the president say about Ketanji Brown Jackson"
docs = docsearch.similarity_search(query, k=10)
print(docs[0].page_content)
docsearch = OpenSearchVectorSearch.from_documents(docs, embeddings, opensearch_url="http://localhost:9200", engine="faiss", space_type="innerproduct", ef_construction=256, m=48)

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

使用脚本评分进行相似性搜索

使用自定义参数的 Script Scoring 搜索的 similarity_search 方法。

docsearch = OpenSearchVectorSearch.from_documents(docs, embeddings, opensearch_url="http://localhost:9200", is_appx_search=False)

query = "What did the president say about Ketanji Brown Jackson"
docs = docsearch.similarity_search("What did the president say about Ketanji Brown Jackson", k=1, search_type="script_scoring")
print(docs[0].page_content)

使用 Painless 脚本进行相似性搜索

使用自定义参数的 Painless 脚本 搜索的 similarity_search 方法。

docsearch = OpenSearchVectorSearch.from_documents(docs, embeddings, opensearch_url="http://localhost:9200", is_appx_search=False)
filter = {"bool": {"filter": {"term": {"text": "smuggling"}}}}
query = "What did the president say about Ketanji Brown Jackson"
docs = docsearch.similarity_search("What did the president say about Ketanji Brown Jackson", search_type="painless_scripting", space_type="cosineSimilarity", pre_filter=filter)
print(docs[0].page_content)

使用预先存在的 OpenSearch 实例

也可以使用已经存在的 OpenSearch 实例,其中包含已经存在向量的文档。

# 这只是一个示例,您需要更改这些值以指向另一个 OpenSearch 实例
docsearch = OpenSearchVectorSearch(index_name="index-*", embedding_function=embeddings, opensearch_url="http://localhost:9200")

# 您可以指定自定义字段名称以匹配用于存储嵌入、文档文本值和元数据的字段
docs = docsearch.similarity_search("Who was asking about getting lunch today?", search_type="script_scoring", space_type="cosinesimil", vector_field="message_embedding", text_field="message", metadata_field="message_metadata")
Last Updated:
Contributors: 刘强