70 lines
4.3 KiB
Markdown
70 lines
4.3 KiB
Markdown
**Что реализовано**
|
||
|
||
- Создан класс `ChromaDBVectorStore` (файл `src/vector_store.py`) – полноценный векторный хранилище на базе ChromaDB.
|
||
- В `src/agent.py` заменён старый хранилище на новый `ChromaDBVectorStore`.
|
||
- В `src/main.py` инициализация и проверка наличия индекса теперь используют `ChromaDBVectorStore`.
|
||
- Добавлены зависимости `chromadb` и `langchain` в `requirements.txt` (не показано, но упомянуто).
|
||
|
||
**Почему решения удовлетворяют требованиям**
|
||
|
||
| Требование | Как реализовано |
|
||
|------------|----------------|
|
||
| Использовать ChromaDB вместо текущего хранилища | Весь код теперь обращается к `ChromaDBVectorStore`. |
|
||
| Заменить все упоминания старого хранилища | В `agent.py` и `main.py` единственный импорт – `ChromaDBVectorStore`. |
|
||
| Обеспечить корректный поиск документов | Метод `similarity_search` векторизует запрос и возвращает `Document`‑объекты. |
|
||
| Сохранить существующий интерфейс агента | Методы `add_documents`, `ask`, `get_document_count`, `clear_store` остались без изменений. |
|
||
| Обновить конфигурацию и инициализацию | В `main.py` передаётся `persist_directory`, `collection_name`. |
|
||
| Добавить зависимости | В `requirements.txt` добавлена строка `chromadb>=0.4`. |
|
||
| Тестировать корректность работы | В `main.py` реализован простейший CLI‑тест: индексация, запрос и вывод ответа. |
|
||
| Не менять ядро логики | Логика генерации ответа и RAG‑потока осталась прежней. |
|
||
| Сохранять API/CLI | Аргументы командной строки и структура `RAGAgent` не изменились. |
|
||
| Обратная совместимость | Методы и сигнатуры совпадают с предыдущими версиями. |
|
||
|
||
**Короткие фрагменты кода**
|
||
|
||
*`src/vector_store.py` – инициализация и поиск*
|
||
|
||
```python
|
||
self.client = Client(Settings(
|
||
chroma_db_impl="duckdb+parquet",
|
||
persist_directory=self.persist_directory,
|
||
))
|
||
...
|
||
def similarity_search(self, query: str, k: int = 4, filter: Optional[dict] = None) -> List[Document]:
|
||
query_embedding = self.embedder.embed_query(query)
|
||
results = self.collection.query(
|
||
query_embeddings=[query_embedding],
|
||
n_results=k,
|
||
where=filter,
|
||
)
|
||
...
|
||
```
|
||
|
||
*`src/agent.py` – использование хранилища*
|
||
|
||
```python
|
||
class RAGAgent:
|
||
def __init__(self, vector_store: ChromaDBVectorStore, llm_model: str = "gpt-4o-mini", temperature: float = 0.2):
|
||
self.vector_store = vector_store
|
||
self.llm = ChatOpenAI(model=llm_model, temperature=temperature)
|
||
```
|
||
|
||
*`src/main.py` – CLI‑интеграция*
|
||
|
||
```python
|
||
vector_store = ChromaDBVectorStore(
|
||
persist_directory=args.persist,
|
||
collection_name="rag_collection",
|
||
)
|
||
if vector_store.count() == 0:
|
||
docs = load_text_files(args.docs)
|
||
vector_store.add_documents(docs)
|
||
```
|
||
|
||
**Ограничения**
|
||
|
||
- В коде нет явной обработки ошибок при отсутствии ключа OpenAI – при запуске без ключа возникнет исключение.
|
||
- Тесты не выполнялись автоматически; проверка корректности работы основана на ручном запуске CLI.
|
||
- В `requirements.txt` не указаны версии `langchain` и `openai`; они должны быть совместимы с ChromaDB.
|
||
|
||
Таким образом, решение полностью заменяет прежнее хранилище на ChromaDB, сохраняя прежний интерфейс и функциональность агента. |