Langchain / ChromaDB:为什么 VectorStore 返回这么多重复项?

nar*_*ssa 2 python openai-api langchain chromadb py-langchain

import os
from langchain.llms import OpenAI
import bs4
import langchain
from langchain import hub
from langchain.document_loaders import UnstructuredFileLoader
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma

os.environ["OPENAI_API_KEY"] = "KEY"

loader = UnstructuredFileLoader(
    'path_to_file'
)
docs = loader.load()

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000, chunk_overlap=200, add_start_index=True
)
all_splits = text_splitter.split_documents(docs)
vectorstore = Chroma.from_documents(documents=all_splits, embedding=OpenAIEmbeddings())
retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 6})

retrieved_docs = retriever.get_relevant_documents(
    "What is X?"
)
Run Code Online (Sandbox Code Playgroud)

这将返回:

[Document(page_content="...", metadata={'source': 'path_to_text', 'start_index': 16932}),
 Document(page_content="...", metadata={'source': 'path_to_text', 'start_index': 16932}),
 Document(page_content="...", metadata={'source': 'path_to_text', 'start_index': 16932}),
 Document(page_content="...", metadata={'source': 'path_to_text', 'start_index': 16932}),
 Document(page_content="...", metadata={'source': 'path_to_text', 'start_index': 16932}),
 Document(page_content="...", metadata={'source': 'path_to_text', 'start_index': 16932})]
Run Code Online (Sandbox Code Playgroud)

这看起来都是同一份文件。

当我第一次在 Google Colab/Jupyter Notebook 中运行这段代码时,它返回了不同的文档......当我运行更多时,它开始返回相同的文档。让我觉得这是一个数据库问题,每次运行时都会将相同的条目插入数据库中。

如何返回 6 份不同的唯一文档?

Yil*_*maz 5

问题在这里:

Chroma.from_documents(documents=all_splits, embedding=OpenAIEmbeddings())
Run Code Online (Sandbox Code Playgroud)

每次执行该文件时,都会将相同的文档插入数据库中。

如果您从同一文件插入,则可以注释掉该部分代码。或者您可以使用EmbeddingsRedundantFilter检测相似的向量

通过比较嵌入来删除冗余文档的过滤器。