我不确定 PineCone 和 Langchain 的 .get() 替代方案是什么。我希望运行此代码,但我不断收到错误消息,指出 .get 不是 Pinecone 的属性。我不确定有什么替代方案可以替代它。
def add_to_pinecone(chunks: list[Document]):
VectorStore = Pinecone(index='portfolio-assistant', embedding=get_embeddings() ,pinecone_api_key=pc_api_key) # Connecting to Pinecone
chunks_with_ids = calculate_chunk_ids(chunks)
existing_items = **VectorStore.get(include=[])**
existing_ids = set(existing_items["ids"])
print(f'Number of existing documents in VectorStore: {len(existing_ids)}')
new_chunks = []
for chunk in chunks_with_ids:
if chunk.metadata["id"] not in existing_ids:
new_chunks.append(chunk)
if len(new_chunks):
print(f"Adding new documents: {len(new_chunks)}")
new_chunk_ids = [chunk.metadata["id"] for chunk in new_chunks]
VectorStore.add_document(new_chunks, ids=new_chunk_ids)
else:
print("No new documents to add")
说的对,PineCone 中没有直接等效于
.get()
的方法,可以从索引中获取所有向量。方法
.upsert()
用于
添加或更新
向量,但它不会直接返回现有向量。
为了在的代码中实现类似于
.get()
的功能,可以执行以下操作:
-
使用
fetch()
方法: PineCone 的 Python 客户端具有一个fetch()
方法,可以用于通过它们的 ID 从索引中检索特定向量。如果想获取 所有 向量,则需要跟踪所有向量 ID,然后使用fetch()
方法批量检索它们。 -
维护单独的向量存储: 另一种方法是在内存或使用像 FAISS 这样的外部向量数据库中维护单独的向量存储。每次添加向量到 PineCone 时,还需要将其添加到这个单独的存储中。这种方法可以提供更大的灵活性,因为可以直接访问所有向量,但它也引入了数据冗余和同步问题。
-
迭代查询以获取所有向量(不推荐): 可以使用空的查询向量和一个非常大的
top_k
值对 PineCone 索引执行迭代查询。这将返回索引中的所有向量,但对于大型索引来说,这效率非常低,不推荐使用。
以下是使用
fetch()
方法修改后的代码示例:
def add_to_pinecone(chunks: list[Document]):
vector_store = Pinecone(index='portfolio-assistant', embedding=get_embeddings(), pinecone_api_key=pc_api_key)
chunks_with_ids = calculate_chunk_ids(chunks)
# 使用 fetch() 方法获取所有向量 ID
existing_ids = vector_store.fetch(ids=None, fetch_vector_data=False).ids
print(f'Number of existing documents in VectorStore: {len(existing_ids)}')
new_chunks = []
for chunk in chunks_with_ids:
if chunk.metadata["id"] not in existing_ids:
new_chunks.append(chunk)
if len(new_chunks):
print(f"Adding new documents: {len(new_chunks)}")
new_chunk_ids = [chunk.metadata["id"] for chunk in new_chunks]
vector_store.upsert(vectors=new_chunks, ids=new_chunk_ids)
else:
print("No new documents to add")
此代码使用
fetch(ids=None, fetch_vector_data=False)
从 PineCone 索引中检索所有向量 ID,而不检索实际的向量数据(以提高效率)。然后,它会检查
new_chunks
中哪些 ID 已经存在,并仅添加新的块。
注意: 在处理大量向量时,从 PineCone 索引中获取所有向量可能会很耗时且成本高昂。如果需要定期访问所有向量,请考虑使用单独的存储或优化用例,以尽量减少对所有向量的检索。
标签:python,openai-api,langchain,pinecone,text-embedding-ada-002 From: 78779680