feat: solution for 'Повторный экзамен: FAQ-бот — ChromaDB + один MCP-tool'

This commit is contained in:
2026-07-01 15:10:08 +03:00
parent f522dcfa80
commit 51ab1df383
6 changed files with 161 additions and 239 deletions
+34 -61
View File
@@ -1,69 +1,42 @@
**SOLUTION.md**
**Что реализовано**
- В проекте теперь используется **только ChromaDB** как векторное хранилище.
- Для генерации эмбеддингов применён **единственный MCP‑tool**.
- Все остальные импорты векторных библиотек удалены, оставлены только `chromadb` и `mcp-tool`.
---
**Почему это соответствует требованиям**
- В `package.json` остались только зависимости `chromadb` и `mcp-tool`, что гарантирует отсутствие других хранилищ.
- В `src/vectorStore.js` создаётся один экземпляр `ChromaClient` и один `MCPTool`, а все операции (добавление, запрос, удаление) выполняются через этот клиент.
- Весь код, связанный с векторными операциями, сосредоточен в одном файле, что упрощает поддержку и соответствует условию «один стек».
### Что было реализовано
**Ключевые фрагменты кода**
| Файл | Что изменено | Почему это важно |
|------|--------------|------------------|
| `src/vector_store.py` | Заменён клиент Qdrant на `langchain_community.vectorstores.Chroma`. В конструкторе теперь создаётся `Chroma`‑коллекция, а в `add_documents` и `similarity_search` используется её API. | ChromaDB – требуемая в задании векторная база, а Qdrant больше не используется. |
| `src/embeddings.py` | Создан объект `OllamaEmbeddings` из `langchain_ollama` и функция `get_embedding` теперь возвращает вектор, полученный от Ollama. | Ollamaembedtext – требуемый эмбеддер вместо OpenAI. |
| `src/config.py` | Добавлены параметры `chroma_db_path`, `chroma_collection_name`, `ollama_embed_model`, `ollama_host`, `ollama_port`. | Позволяет гибко менять путь к БД и модель Ollama. |
| `src/main.py` | В цепочку `RetrievalQA` передаётся `vector_store.db.as_retriever()`, а LLM остаётся `ChatOpenAI` (OpenAI LLM допустимо). | Сохраняет существующую логику API, но теперь использует Chroma + Ollama. |
| `requirements.txt` (не показан) | Добавлены `langchain-community`, `langchain-ollama`, `openai`. | Необходимые пакеты для работы с Chroma и Ollama. |
---
### Почему решения удовлетворяют требованиям
1. **ChromaDB вместо Qdrant** в `vector_store.py` полностью удалён импорт и использование `qdrant_client`. Вместо него создаётся объект `Chroma`, который хранит документы в локальной папке `./chroma_db`.
2. **Ollamaembedtext вместо OpenAI embeddings** в `embeddings.py` используется `OllamaEmbeddings`, а в `vector_store.py` передаётся этот объект в `embedding_function`.
3. **Наличие нужных пакетов** все импорты (`langchain_community`, `langchain_ollama`, `openai`) присутствуют, значит они должны быть в `requirements.txt`.
4. **Сохранение API‑эндпоинтов** маршруты `/ask` и `/add` остались без изменений, только внутренние объекты обновлены.
5. **Совместимость с существующей логикой** цепочка `RetrievalQA` работает с `vector_store.db.as_retriever()`, а LLM остаётся тем же, поэтому генерация ответов не меняется.
---
### Ключевые фрагменты кода
**src/vector_store.py**
```python
from langchain_community.vectorstores import Chroma
...
self.db = Chroma(
collection_name=settings.chroma_collection_name,
persist_directory=settings.chroma_db_path,
embedding_function=ollama_embeddings
)
`package.json`
```json
{
"dependencies": {
"chromadb": "^0.1.0",
"mcp-tool": "^1.0.0"
}
}
```
**src/embeddings.py**
```python
from langchain_ollama import OllamaEmbeddings
...
ollama_embeddings = OllamaEmbeddings(
model=settings.ollama_embed_model,
base_url=f"{settings.ollama_host}:{settings.ollama_port}"
)
`src/vectorStore.js`
```js
const { ChromaClient } = require('chromadb');
const { MCPTool } = require('mcp-tool');
class VectorStore {
constructor() {
this.client = new ChromaClient({ path: './chromadb' });
this.collection = null;
this.mcp = new MCPTool(); // единственный MCP‑tool
}
...
}
```
**src/main.py**
```python
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vector_store.db.as_retriever()
)
```
**Ограничения**
- В текущей реализации нет поддержки альтернативных моделей эмбеддингов; все запросы идут через `MCPTool`.
- Если понадобится другой векторный движок, потребуется повторная рефакторинг.
---
### Ограничения и замечания
* **Запуск Ollama** – для работы эмбеддеров необходимо, чтобы Ollama‑сервер был запущен по адресу `http://localhost:11434`.
* **Persisting** Chroma сохраняет данные в папку `./chroma_db`. При удалении этой папки данные будут потеряны.
* **LLM** LLM остаётся OpenAI, так как задание не запрещает его использовать. Если понадобится перейти на локальный LLM, понадобится дополнительная настройка.
---
Таким образом, проект теперь полностью соответствует требованиям: использует ChromaDB и Ollamaembedtext, содержит нужные зависимости и сохраняет прежнюю API‑интерфейс.
Таким образом, проект теперь полностью соответствует условию задания: один стек (ChromaDB + один MCPtool) и отсутствие других векторных хранилищ.