LangChain Chroma — загрузка данных из базы данных векторов

Я написал код LangChain, используя Chroma DB, для векторного хранения данных с URL-адреса веб-сайта. В настоящее время он работает для получения данных из URL-адреса, сохранения их в папке проекта и последующего использования этих данных для ответа на запрос пользователя. Я понял, как сохранить эти данные после запуска, но не могу понять, как затем загрузить эти данные для будущих запросов. Цель состоит в том, чтобы получить пользовательский ввод, и программа, использующая OpenAI LLM, сгенерирует ответ на основе существующих файлов базы данных, в отличие от программы, которая должна создавать/записывать эти файлы базы данных при каждом запуске. Как это может быть сделано?

Что я должен делать?

Я попробовал это, поскольку это, вероятно, было бы идеальным решением:

      vectordb = Chroma(persist_directory=persist_directory, embedding_function=embeddings)
qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", vectorstore=vectordb)

Нофункция не занимаетdb в качестве входных данных, поэтому это не работает.

7 ответов

Вам нужно определить ретривер и передать его в цепочку. При этом ваша ранее сохраненная БД будет использоваться в запросах.

      vectordb = Chroma(persist_directory=persist_directory, embedding_function=embeddings)

retriever = vectordb.as_retriever()

qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)

Я также пытался использовать загрузчик хранилища векторов Chroma, но мой код не загружает БД с диска. Вот что я сделал:

      from langchain.embeddings.sentence_transformer import SentenceTransformerEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.document_loaders import PyPDFDirectoryLoader
import os
import json

def load_api_key(secrets_file="secrets.json"):
    with open(secrets_file) as f:
        secrets = json.load(f)
    return secrets["OPENAI_API_KEY"]

# Setup
api_key = load_api_key()
os.environ["OPENAI_API_KEY"] = api_key

# load the document and split it into chunks
loader = PyPDFDirectoryLoader("LINK TO FOLDER WITH PDF")
documents = loader.load()

# split it into chunks
text_splitter = CharacterTextSplitter(chunk_size=1500, chunk_overlap=200)
docs = text_splitter.split_documents(documents)

# create the open-source embedding function
embedding_function = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")

# load docs into Chroma DB
db = Chroma.from_documents(docs, embedding_function)

# query the DB
query = "MY QUERY"
docs = db.similarity_search(query)

# print results
print(docs[0].page_content)

# save to disk
db2 = Chroma.from_documents(docs, embedding_function, persist_directory="./chroma_db")

Пока никаких проблем! Затем, когда я загружаю БД с помощью этого кода:

      # load from disk
db3 = Chroma(persist_directory="./chroma_db", embedding_function=embedding_function)
db3.get() 
docs = db3.similarity_search(query)
print(docs[0].page_content)

The db3.get()уже показывает, что данных нет вdb3. Он возвращает:

      {'ids': [], 'embeddings': None, 'documents': [], 'metadatas': []}

Есть идеи, почему это могло пройти?

Во всех ответах, которые я видел, отсутствует один важный шаг для вызова сохранения БД. В качестве полного решения вам необходимо выполнить следующие шаги.

Чтобы создать базу данных в первый раз и сохранить ее, используя приведенные ниже строки.

      vectordb = Chroma.from_documents(data, embedding=embeddings, persist_directory = persist_directory)
vectordb.persist()

Затем базу данных можно загрузить, используя строку ниже.

      vectordb = Chroma(persist_directory=persist_directory, embedding_function=embeddings)

Хрома обеспечиваетget_collectionв

https://docs.trychroma.com/reference/Client#get_collection

Вот пример моего кода для запроса существующего векторного хранилища >

      def get(embedding_function):
    db = Chroma(persist_directory="./chroma_db", embedding_function=embedding_function)
    print(db.get().keys())
    print(len(db.get()["ids"]))

Вывод кода с 7580chunks, например >

      Using embedded DuckDB with persistence: data will be stored in: ./chroma_db
dict_keys(['ids', 'embeddings', 'documents', 'metadatas'])
7580

просто найдите следующие работы:

      def fetch_embeddings(collection_name):
    collection = chromadb_client.get_collection(
        name=collection_name, embedding_function=langchain_embedding_function
    )
    embeddings = collection.get(include=["embeddings"])

    print(collection.get(include=["embeddings", "documents", "metadatas"]))

    return embeddings

ссылка: https://docs.trychroma.com/usage-guide

сама по себе цепь. вот как мы импортируем:

      from langchain.chains import RetrievalQA

каждая цепочка состоит из двух важных компонентов: иllm. нужно получить документы и запихнуть эти документы себеPromptTemplate. Вот для чего этот аргумент:

      chain_type="stuff",

имеет еще один аргумент ключевого слова. это связь между сетью и разными векторными магазинами. извлекает документы из векторных хранилищ через файлы . Векторные магазины делаютsimilarity searchи вернуть документы в . ты создал

      vectordb = Chroma(persist_directory=persist_directory, embedding_function=embeddings)

теперь естьRetrievalQAсвязывается с этим векторным хранилищем черезretriever

      qa = RetrievalQA.from_chain_type(llm=llm, 
                                 chain_type="stuff",
                                 # this will make similarity search in vectordb
                                 retriever=vectordb_as_retriever)
      def load_api_key(secrets_file="secrets.json"):
    with open(secrets_file) as f:
        secrets = json.load(f)
    return secrets["OPENAI_API_KEY"]

Вместо этого вы можете создать.env(секретный файл) и поместите openaikey. Так:

      OPENAI_API_KEY = "<your_key>"

Затем загрузите его в свой основной файл и в свою основную функцию следующим образом:

      from dotenv import load_dotenv

ИСПОЛЬЗОВАНИЕ:

      load_dotenv()
Другие вопросы по тегам