Создание и использование идентификаторов ChromaDB

Мне интересно, как люди справляются с идентификаторами в Chroma DB. Я планирую хранить фрагменты кода (скажем, отдельные функции или классы) в коллекции, и для каждого из них нужен уникальный идентификатор. Эти документы будут сгенерированы, поэтому первая проблема: как мне случайным образом сгенерировать соответствующий идентификатор.

Я предполагаю, что в какой-то момент мне может понадобиться обновить документ, поэтому мне понадобится идентификатор. Это похоже на проблему с курицей и яйцом. Должен ли я хранить идентификаторы в другой базе данных, например postgres? И как тогда мне узнать, какой идентификатор относится к какому фрагменту? Запросить ChromaDB, чтобы сначала найти идентификатор наиболее связанного документа?

1 ответ

Если вы собираетесь снова ссылаться на векторную базу данных по идентификатору, чтобы найти конкретную запись, которая сообщает мне, что у вас есть идентификаторы записей, хранящиеся где-то еще. В этом случае я бы рекомендовал использовать комбинацию обычной таблицы базы данных и таблицы векторной базы данных. Затем вы можете использовать автоматически сгенерированный идентификатор из таблицы для ссылки на идентификатор вектора.

Вы можете сделать что-то вроде следующего:

  1. Обычная таблица базы данных (таблица A):

    • Вставьте фрагменты кода или документы в обычную таблицу базы данных. Назовем эту таблицу «CodeSnippets».
    • Эта таблица должна иметь автоматически сгенерированный первичный ключ (например, увеличивающееся целое число или UUID), чтобы гарантировать, что каждый документ имеет уникальный идентификатор.
  2. Получить идентификаторы документов:

    • После вставки документа в «CodeSnippets» получите вновь созданный уникальный идентификатор для этого документа.
  3. Таблица Chroma DB (Таблица B):

    • Одновременно добавьте встраивания документов и свяжите их с идентификатором документа из шага 2 с таблицей Chroma DB. Назовем эту таблицу «Вложения».
    • В разделе «Внедрения» вы можете иметь два столбца: один для идентификатора документа (из таблицы A), а другой — для внедрений документа.
  4. Сделанный!

    • Теперь у вас есть система, в которой вы можете легко ссылаться на свои документы по их уникальным идентификаторам как в вашей обычной базе данных, так и в базе данных 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)

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

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