Skip to main content

松果

Pinecone是一个具有广泛功能的向量数据库。

本笔记本展示了如何使用与Pinecone向量数据库相关的功能。

要使用Pinecone,您必须拥有一个API密钥。这里是安装说明

pip install pinecone-client openai tiktoken langchain
import os
import getpass

os.environ["PINECONE_API_KEY"] = getpass.getpass("Pinecone API Key:")
os.environ["PINECONE_ENV"] = getpass.getpass("Pinecone Environment:")

我们想要使用OpenAIEmbeddings,所以我们必须获取OpenAI API密钥。

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 Pinecone
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()
import pinecone

# 初始化pinecone
pinecone.init(
api_key=os.getenv("PINECONE_API_KEY"), # 在app.pinecone.io上找到
environment=os.getenv("PINECONE_ENV"), # 在控制台上的api密钥旁边
)

index_name = "langchain-demo"

# 首先,检查我们的索引是否已经存在。如果不存在,我们创建它
if index_name not in pinecone.list_indexes():
# 创建一个新的索引
pinecone.create_index(
name=index_name,
metric='cosine',
dimension=1536
)
# OpenAI嵌入模型`text-embedding-ada-002`使用1536个维度
docsearch = Pinecone.from_documents(docs, embeddings, index_name=index_name)

# 如果您已经有一个索引,可以像这样加载它
# docsearch = Pinecone.from_existing_index(index_name, embeddings)

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

向现有索引添加更多文本

可以使用add_texts函数将更多文本嵌入并更新到现有的Pinecone索引中

index = pinecone.Index("langchain-demo")
vectorstore = Pinecone(index, embeddings.embed_query, "text")

vectorstore.add_texts("More text!")

最大边际相关搜索

除了在检索器对象中使用相似性搜索外,还可以使用mmr作为检索器。

retriever = docsearch.as_retriever(search_type="mmr")
matched_docs = retriever.get_relevant_documents(query)
for i, d in enumerate(matched_docs):
print(f"\n## Document {i}\n")
print(d.page_content)

或直接使用max_marginal_relevance_search

found_docs = docsearch.max_marginal_relevance_search(query, k=2, fetch_k=10)
for i, doc in enumerate(found_docs):
print(f"{i + 1}.", doc.page_content, "\n")