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)
Но
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
сама по себе цепь. вот как мы импортируем:
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()