6大核心模块(Modules)
示例
Pinecone 混合搜索(Pinecone Hybrid Search)

LangChain

如何使用一个检索器

本文档介绍了如何使用一个检索器,该检索器在幕后使用松果(Pinecone)和混合搜索。

这个检索器的逻辑来自于此文档 (opens in a new tab)

from langchain.retrievers import PineconeHybridSearchRetriever
 

设置松果(Pinecone)#

您只需要执行这一步。

注意:重要的是确保在元数据中保存文档文本的“上下文”字段未被索引。目前,您需要明确指定要索引的字段。有关更多信息,请查看松果(Pinecone)的文档 (opens in a new tab)

import os
import pinecone
 
api_key = os.getenv("PINECONE_API_KEY") or "PINECONE_API_KEY"
# find environment next to your API key in the Pinecone console
env = os.getenv("PINECONE_ENVIRONMENT") or "PINECONE_ENVIRONMENT"
 
index_name = "langchain-pinecone-hybrid-search"
 
pinecone.init(api_key=api_key, enviroment=env)
pinecone.whoami()
 
WhoAmIResponse(username='load', user_label='label', projectname='load-test')
 
 # create the index
pinecone.create_index(
   name = index_name,
   dimension = 1536,  # dimensionality of dense model
   metric = "dotproduct",  # sparse values supported only for dotproduct
   pod_type = "s1",
   metadata_config={"indexed": []}  # see explaination above
)
 

现在创建完成了,我们可以使用它了

index = pinecone.Index(index_name)
 

获取嵌入Embeddings和Sparse编码器#

嵌入Embeddings用于密集向量,令牌化器用于Sparse向量

from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
 

要将文本编码为Sparse值,您可以选择SPLADE或BM25。对于域外任务,我们建议使用BM25。

有关Sparse编码器的更多信息,请查看pinecone-text库的文档 (opens in a new tab)

from pinecone_text.sparse import BM25Encoder
# or from pinecone_text.sparse import SpladeEncoder if you wish to work with SPLADE
 
# use default tf-idf values
bm25_encoder = BM25Encoder().default()
 

上面的代码使用了默认的tf-idf值。强烈建议将tf-idf值与您自己的语料库相匹配。您可以按如下方式进行:

corpus = ["foo", "bar", "world", "hello"]
 
# fit tf-idf values on your corpus
bm25_encoder.fit(corpus)
 
# store the values to a json file
bm25_encoder.dump("bm25_values.json")
 
# load to your BM25Encoder object
bm25_encoder = BM25Encoder().load("bm25_values.json")
 

构建检索器Load Retriever#

现在我们可以构建检索器了!

retriever = PineconeHybridSearchRetriever(embeddings=embeddings, sparse_encoder=bm25_encoder, index=index)
 

添加文本 Add texts (if necessary)#

如果尚未添加到检索器中,我们可以将文本添加到检索器中。

retriever.add_texts(["foo", "bar", "world", "hello"])
 
100%|██████████| 1/1 [00:02<00:00,  2.27s/it]
 

运用检索器 Use Retriever#

现在我们可以使用检索器了!

result = retriever.get_relevant_documents("foo")
 
result[0]
 
Document(page_content='foo', metadata={})