Files
povtornyy-ekzamen-faq-bot-c…/SOLUTION.md
T

4.6 KiB
Raw Blame History

SOLUTION.md


Что было реализовано

Файл Что изменено Почему это важно
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

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
)

src/embeddings.py

from langchain_ollama import OllamaEmbeddings
...
ollama_embeddings = OllamaEmbeddings(
    model=settings.ollama_embed_model,
    base_url=f"{settings.ollama_host}:{settings.ollama_port}"
)

src/main.py

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vector_store.db.as_retriever()
)

Ограничения и замечания

  • Запуск Ollama – для работы эмбеддеров необходимо, чтобы Ollama‑сервер был запущен по адресу http://localhost:11434.
  • Persisting – Chroma сохраняет данные в папку ./chroma_db. При удалении этой папки данные будут потеряны.
  • LLM – LLM остаётся OpenAI, так как задание не запрещает его использовать. Если понадобится перейти на локальный LLM, понадобится дополнительная настройка.

Таким образом, проект теперь полностью соответствует требованиям: использует ChromaDB и Ollamaembedtext, содержит нужные зависимости и сохраняет прежнюю API‑интерфейс.