Создание и использование идентификаторов ChromaDB
Мне интересно, как люди справляются с идентификаторами в Chroma DB. Я планирую хранить фрагменты кода (скажем, отдельные функции или классы) в коллекции, и для каждого из них нужен уникальный идентификатор. Эти документы будут сгенерированы, поэтому первая проблема: как мне случайным образом сгенерировать соответствующий идентификатор.
Я предполагаю, что в какой-то момент мне может понадобиться обновить документ, поэтому мне понадобится идентификатор. Это похоже на проблему с курицей и яйцом. Должен ли я хранить идентификаторы в другой базе данных, например postgres? И как тогда мне узнать, какой идентификатор относится к какому фрагменту? Запросить ChromaDB, чтобы сначала найти идентификатор наиболее связанного документа?
1 ответ
Если вы собираетесь снова ссылаться на векторную базу данных по идентификатору, чтобы найти конкретную запись, которая сообщает мне, что у вас есть идентификаторы записей, хранящиеся где-то еще. В этом случае я бы рекомендовал использовать комбинацию обычной таблицы базы данных и таблицы векторной базы данных. Затем вы можете использовать автоматически сгенерированный идентификатор из таблицы для ссылки на идентификатор вектора.
Вы можете сделать что-то вроде следующего:
Обычная таблица базы данных (таблица A):
- Вставьте фрагменты кода или документы в обычную таблицу базы данных. Назовем эту таблицу «CodeSnippets».
- Эта таблица должна иметь автоматически сгенерированный первичный ключ (например, увеличивающееся целое число или UUID), чтобы гарантировать, что каждый документ имеет уникальный идентификатор.
Получить идентификаторы документов:
- После вставки документа в «CodeSnippets» получите вновь созданный уникальный идентификатор для этого документа.
Таблица Chroma DB (Таблица B):
- Одновременно добавьте встраивания документов и свяжите их с идентификатором документа из шага 2 с таблицей Chroma DB. Назовем эту таблицу «Вложения».
- В разделе «Внедрения» вы можете иметь два столбца: один для идентификатора документа (из таблицы A), а другой — для внедрений документа.
Сделанный!
- Теперь у вас есть система, в которой вы можете легко ссылаться на свои документы по их уникальным идентификаторам как в вашей обычной базе данных, так и в базе данных Chroma.
Вот упрощенный пример с использованием Python и гипотетической библиотеки баз данных (например, SQLAlchemy для баз данных SQL):
# Step 1: Insert data into the regular database (Table A)
# Assuming you have a SQLAlchemy model called CodeSnippet
from chromadb.utils import embedding_functions
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import chromadb
Base = declarative_base()
class CodeSnippet(Base):
__tablename__ = 'CodeSnippets'
id = Column(Integer, primary_key=True, autoincrement=True)
code = Column(String)
# Add other metadata columns as needed
engine = create_engine('sqlite:///database.db')
Base.metadata.create_all(engine)
# Create a session
Session = sessionmaker(bind=engine)
session = Session()
# Insert a code snippet into Table A
new_snippet = CodeSnippet(code='print("Hello World")')
session.add(new_snippet)
session.commit()
# Step 2: Retrieve the newly generated document ID
document_id = str(new_snippet.id)
# Step 3: Add embeddings to Chroma DB (Table B)
client = chromadb.PersistentClient("./data")
sentence_transformer_ef = embedding_functions.SentenceTransformerEmbeddingFunction(
model_name="all-MiniLM-L6-v2"
)
collection = client.get_or_create_collection("code_snippets", embedding_function=sentence_transformer_ef)
collection.add([document_id], documents=[new_snippet.code])
# Step 4: You can now easily reference the document by its ID in both databases
# For example, you can retrieve the code snippet from Table A by its ID
result = session.query(CodeSnippet).filter(CodeSnippet.id == document_id).first()
print(result.code)
# Or you can retrieve the code snippet from Table B by its ID
result = collection.get(document_id)
print(result)
Такой подход гарантирует, что у вас есть четкое сопоставление между данными вашего документа и внедрениями, что позволяет избежать упомянутой вами проблемы курицы и яйца.