代码之家  ›  专栏  ›  技术社区  ›  Kristian Vybiral

链链不使用松果矢量库

  •  0
  • Kristian Vybiral  · 技术社区  · 2 年前

    我尝试在我的语言链实现中使用一个完全有效且填充的松果索引作为向量库。但是,这些链不会以任何方式加载或操作矢量库。

    例如,这段代码:

    question = "What is your experience?"
    
    llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.1)
    
    pc_index = pinecone.Index(index_name)
    print(pc_index.describe_index_stats())
    
    pc_interface = Pinecone.from_existing_index(
        index_name, 
        embedding=OpenAIEmbeddings(), 
        namespace="SessionIndex"
    )
    
    qa_chain = RetrievalQA.from_chain_type(
        llm,
        retriever=pc_interface.as_retriever(),
    )
    print(qa_chain.run(question))
    

    返回:

    {'dimension': 1536,
     'index_fullness': 0.0,
     'namespaces': {'SessionIndex': {'vector_count': 40}},
     'total_vector_count': 40}
    As an AI language model, I don't have personal experiences like humans do. However, I have been trained on a wide range of data sources, including books, articles, and websites, to provide information and assist with various topics. Is there something specific you would like to know or discuss?
    

    该索引包含许多与个人经历相关的条目。如果我使用RetrievalQAWithSourcesChain并获取源代码的len(),它将打印0。

    如何使松果索引与Langchain一起工作?

    0 回复  |  直到 2 年前
        1
  •  2
  •   Stefano L    2 年前

    正如您在评论中指出的那样,文档插入很可能是以某种“非标准”的方式完成的(尽管您没有分享插入代码)。

    通常,如果您计划稍后在LangChain中运行查询,最好留在LangChain工具中进行插入。原因是,LangChain有一个统一的接口,可以让你看到它支持的所有向量存储“看起来都一样”,即使在内部它们可能会对数据使用不同的存储模型。

    例如,松果索引只有两个与向量相关的概念:“id”和“元数据”(字典)。因此,LC的Pinecone插件必须填充所有输入文本 in a "text" field of the metadata 被放入索引中(并在检索时将其提取回来)。

    这与其他LangChain支持的向量存储不同。例如,如果你查看Cassandra/Astra DB集成,你会看到一个表,其中有一个显式的输入文本列。你可以在这里看到这一点 notebook 这说明了如何使用该向量存储(带一个完整的示例)。顺便说一句,如果你不偏离LangChain抽象层,你可以用一个向量存储交换另一个,而基本上不会改变你的代码。。。正是因为LangChain所做的上述均匀化步骤。

    那么,回到松果和朗链。有几种方法可以使用LangChain将行放入向量存储中,这基本上取决于您的源代码(PDF、网页、字符串手动列表、文本文件……等等)。有很多受支持的“文档加载器”,请参阅 here .

    以下是在最简单的情况下可以做的事情,即在程序中有一个显式的字符串列表,将它们放入存储中(再次注意:这段代码本质上与向量存储无关)。这个 metadatas 如果需要,可以省略部分。

    texts = [
        "I grew up in a tall house.",
        "My neighbours were very kind",
        "I never felt compelled to do the dishes",
    ]
    metadatas = [
        {"source": "my_life"},
        {"source": "my_life"},
        {"source": "my_secrets"},
    ]
    pc_interface.add_texts(texts=texts, metadatas=metadatas)
    

    运行上述命令后,我可以测试您的示例将返回类似以下内容:

    Based on the given context, it seems that the speaker grew up in a tall house and had kind neighbors.
    

    请注意,如果你仔细观察 plugin implementation 你注意到一件令人惊讶的事情:即松果客户端 upsert 方法,其中 documentation 似乎需要一个字典来描述要插入的条目,它同样适用于3元组(id、vector、元数据dict)。

    总结一下: 如果您离开LangChain层,请自行承担风险。

    此外:您还可以找到更多使用LangChain在矢量存储中加载文档的习惯用法示例 here 而且在这个 full sample app 这些示例适用于Astra DB,但如上所述,如果你不离开抽象,你就不应该担心存储模型中的低级更改。而且,您可能会发现将您的体验扩展到其他矢量商店很方便:)

    干杯!

        2
  •  0
  •   Abhishek R    2 年前

    如何创建矢量存储很重要。最好还是坚持使用langchain。

    这个 return_source_documents=True 参数在 RetrievalQA 将让您看到使用了哪些源文档。

    创建矢量库

    如果你还没有矢量存储,以下是如何创建它并将其用作检索器:

    from langchain.chains import RetrievalQA
    import pinecone
    from langchain.vectorstores import Pinecone
    
    vectorstore = Pinecone.from_documents(docs,embed,index_name, namespace="myspace")
    
    retriever = vectorstore.as_retriever()
    
    
    question = "What is your experience?"
    llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.1)
    ## return_source_documents=True will let you see which source documents were used
    qa_chain = RetrievalQA.from_chain_type(llm,retriever=retriever, return_source_documents=True)
    
    print(qa_chain.run(question))
    
    

    加载矢量库

    如果你已经在另一个会话中创建了一个向量存储,以下是如何加载它并将其用作检索器:

    from langchain.chains import RetrievalQA
    import pinecone
    from langchain.vectorstores import Pinecone
    
    vectorstore = Pinecone.from_existing_index(index_name=index_name, embedding = embed, namespace="myspace")
    
    retriever = vectorstore.as_retriever()
    
    question = "What is your experience?"
    llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.1)
    ## return_source_documents=True will let you see which source documents were used
    qa_chain = RetrievalQA.from_chain_type(llm,retriever=retriever, return_source_documents=True)
    
    print(qa_chain.run(question))