首页 > 编程问答 >使用 Langchain 和 OpenAI 将矢量嵌入数据从 PDF 添加到 PineCone

使用 Langchain 和 OpenAI 将矢量嵌入数据从 PDF 添加到 PineCone

时间:2024-07-23 04:10:20浏览次数:14  
标签:python openai-api langchain pinecone text-embedding-ada-002

我不确定 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() 的功能,可以执行以下操作:

  1. 使用 fetch() 方法: PineCone 的 Python 客户端具有一个 fetch() 方法,可以用于通过它们的 ID 从索引中检索特定向量。如果想获取 所有 向量,则需要跟踪所有向量 ID,然后使用 fetch() 方法批量检索它们。

  2. 维护单独的向量存储: 另一种方法是在内存或使用像 FAISS 这样的外部向量数据库中维护单独的向量存储。每次添加向量到 PineCone 时,还需要将其添加到这个单独的存储中。这种方法可以提供更大的灵活性,因为可以直接访问所有向量,但它也引入了数据冗余和同步问题。

  3. 迭代查询以获取所有向量(不推荐): 可以使用空的查询向量和一个非常大的 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

相关文章

  • Python 套接字请求在很多情况下都会失败
    我在python中尝试了超过5种不同的方法,尽管人们说它在其他论坛上有效,但所有这些方法都惨遭失败。importsocketmessage="test"clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)clientsocket.connect(('1.1.1.1',80))clientsocket.send(mes......
  • Python 网络套接字
    我一直尝试通过Python访问该网站的websocket,但是需要绕过CloudFlare,现在我尝试通过cookie进行绕过,但是这不起作用。我已经尝试在没有cookie的情况下执行此操作,但这也不起作用。importwebsocketimportbase64importosdriver=selenium.webdriver.Firefox()driver.ge......
  • 如何在Python中使用Selenium提取data-v-xxx?
    因为我想查看每个class='num'内的文本是否大于0。如果测试通过,那么我需要获取venuen-name内的文本。我观察到,data-v是相同的。所以我的方法是获取相同的data-v-<hashvalue>来查找场地名称。我尝试了不同的方法来提取,但仍然无法提取。有什么建议吗?这是DOM<div......
  • Python:添加异常上下文
    假设我想提出一个异常并提供额外的处理信息;最好的做法是什么?我想出了以下方法,但对我来说有点可疑:definternal_function():raiseValueError("smellysocks!")defcontext_function():try:internal_function()exceptExceptionase:......
  • 【视频】Python遗传算法GA优化SVR、ANFIS预测证券指数ISE数据-CSDN博客
    全文链接:https://tecdat.cn/?p=37060本文旨在通过应用多种机器学习技术,对交易所的历史数据进行深入分析和预测。我们帮助客户使用了遗传算法GA优化的支持向量回归(SVR)、自适应神经模糊推理系统(ANFIS)等方法,对数据进行了特征选择、数据预处理、模型训练与评估。实验结果表明,这些方法......
  • Python学习笔记42:游戏篇之外星人入侵(三)
    前言在之前我们已经创建好了目录,并且编写好了游戏入口的模块。今天的内容主要是讲讲需求的分析以及项目各模块的代码初步编写。在正式编写代码前,碎碎念几句。在正式编写一个项目代码之前,实际是有很多工作要做的。就项目而言,简单的定项,需求对齐,项目架构设计,实际的代码编写,......
  • Python入门知识点 5--流程控制语句
    先来分享一个pycharm使用小技巧   红色波浪线:提醒可能报错   黄色波浪线:提醒书写不规范,ctrl+alt+l去掉黄线   code--Reformatcode,就可以去掉黄线,调整代码格式1、程序三大执行流程(1)顺序执行        程序执行时,代码从上往下,从左往右执行,中间......
  • python里读写excel等数据文件的几种常用方式
    python处理数据文件第一步是要读取数据,文件类型主要包括文本文件(csv、txt等)、excel文件、数据库文件、api等。下面整理下python有哪些方式可以读取数据文件。1.python内置方法(read、readline、readlines)read():一次性读取整个文件内容。推荐使用read(size)方法,size越大......
  • python+flask计算机毕业设计鲜花坊销售平台(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着电子商务的迅猛发展,线上购物已成为人们日常生活的重要组成部分,尤其在追求生活品质与个性化的今天,传统鲜花销售行业正经历着深刻的变革......
  • python+flask计算机毕业设计快递驿站管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着电子商务的迅猛发展,快递行业迎来了前所未有的繁荣期,快递包裹量急剧增长,对快递末端配送服务提出了更高的要求。传统的快递配送模式面临......