Почему мой объект JSON неправильно вставляется в ChromaDB с использованием Langchain и Python?Python

Программы на Python
Anonymous
Почему мой объект JSON неправильно вставляется в ChromaDB с использованием Langchain и Python?

Сообщение Anonymous »

Я пытаюсь ввести серию тем в ChromaDB, эти темы можно найти здесь. Всего 35 тем, 34 из которых уникальны. Темы имеют действительный формат JSON — я могу добавлять и удалять их из MongoDB, использовать дампы JSON и загружать их, и они были созданы из вызова langchain openai, где выходные данные поступают из форматтера JSON.
Однако, что бы я ни пытался, в ChromaDB вводятся только 7 из них, И попытка использовать RecursiveJsonSplitter всегда приводит к ошибке.
Вот два метода, которые я использую. используя (вызов write_object_to_prompt просто удаляет все фигурные скобки и добавляет разрывы строк/отступы):
def add_to_chroma(database_name: str, collection_name: str, json_object: json, user_directory: str, state, meta_data: json, doc_ids: list[str] = None):
try:
db_directory = os.path.join(user_directory, database_name + ".db")
embedding_function = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")
# embedding_function = OpenAIEmbeddings(model="text-embedding-3-small")
chroma_db = Chroma(persist_directory=db_directory, collection_name=collection_name, embedding_function=embedding_function,
collection_metadata={"hnsw:space": "cosine"})
# embed_object = write_object_to_prompt(json_object)
embed_object = json_object
# text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=100)
json_splitter = RecursiveJsonSplitter(max_chunk_size=2000)
json_docs = json_splitter.split_json(embed_object, True)
meta_list = []
for json_doc in json_docs:
meta_list.append(meta_data)
docs = json_splitter.create_documents(texts=json_docs, metadatas=meta_list)

if doc_ids is None:
doc_ids = [str(uuid.uuid4()) for i in range(1, len(docs) + 1)]
else:
# We look to see if the document exists:
result = chroma_db.get(doc_ids)
if result is not None and len(result) > 0:
# This is an update:
state["persistent_logs"].append("Updating " + meta_data["topic_id"] + " in Chroma")
chroma_db.update_documents(doc_ids, docs)
return doc_ids, state
state["persistent_logs"].append("Adding " + meta_data["topic_id"] + " to Chroma")
chroma_db.from_documents(docs, embedding_function, ids=doc_ids)
except:
trace_back = traceback.format_exc()
logging.error("An unexpected error occurred attempting to add document to Chroma: " + database_name + ", to the collection: " + collection_name +
"\nHere is the document that failed: " + write_object_to_prompt(json_object) + " \nWith the error:\n " + trace_back)
state["persistent_logs"].append(
"An unexpected error occurred attempting to add document to Chroma: " + database_name + ", to the collection: " + collection_name +
"\nHere is the document that failed: " + write_object_to_prompt(json_object) + " \nWith the error:\n " + trace_back)
return doc_ids, state

def get_current_count(database_name: str, collection_name: str, user_directory: str) -> int:
db_directory = os.path.join(user_directory, database_name + ".db")
# embedding_function = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")
embedding_function = OpenAIEmbeddings(model="text-embedding-3-small")
# Cosine will keep te similarity scores between zero and one
chroma_db = Chroma(persist_directory=db_directory, collection_name=collection_name, embedding_function=embedding_function,
collection_metadata={"hnsw:space": "cosine"})
results = chroma_db.get()
total_count = 0
if results is not None:
total_count = len(results)
return total_count

А вот мой сценарий тестирования:
user_directory = "../UserData/user-x"
with open("Topics.txt", "r") as f:
Topics = json.load(f)
print("Total topics: " + str(len(Topics)))
state = {
"errors": "",
"persistent_logs": [],
}
unique_ids = []
for this_topic in Topics:
meta = {"topic_id": this_topic["topic_id"]}
doc_ids, state = add_to_chroma("user-x", "conversations", this_topic, user_directory, state, meta)
if this_topic["topic_id"] not in unique_ids:
unique_ids.append(this_topic["topic_id"])
print("Number of unique Ids: " + str(len(unique_ids)))

if len(state["persistent_logs"]) > 0:
for log in state["persistent_logs"]:
print(log)
print("Total Topics in Chroma " + str(get_current_count("user-x", "topics", user_directory)))

Я никогда не получаю никаких ошибок от Chroma, и в выводе показано 35 записей.
Я пытался использовать внедрения OpenAi, внедрения HuggingFace, JSON и разделители текста, создание документов ChomraDB вручную. Ввод JSON как открытый текст, ввод его как JSON. Ничего не работает.
Есть ли у кого-нибудь идеи?
Извините, вот список:
import json
import uuid
from langchain_chroma import Chroma
from langchain.docstore.document import Document
from langchain_text_splitters import RecursiveCharacterTextSplitter, RecursiveJsonSplitter
from langchain_community.embeddings.sentence_transformer import SentenceTransformerEmbeddings
from langchain_openai import OpenAIEmbeddings
import logging
import os
import traceback


Подробнее здесь: https://stackoverflow.com/questions/786 ... ain-and-py

Вернуться в «Python»