This commit is contained in:
+49
-49
@@ -1,70 +1,70 @@
|
||||
**What was implemented**
|
||||
**Что реализовано**
|
||||
|
||||
- Switched the embedding provider from `OpenAIEmbeddings` to `OllamaEmbeddings` (langchain‑community).
|
||||
- Replaced the FAISS vector store with a Qdrant store.
|
||||
- Updated all imports, configuration, and helper functions to use the new stack.
|
||||
- Added the required dependencies (`langchain-community`, `qdrant-client`) to `requirements.txt`.
|
||||
- Kept the LLM (`OpenAI`), prompt templates, chain structure, and memory unchanged.
|
||||
- Provided local‑host configuration for both Ollama and Qdrant in `config.py`.
|
||||
- Создан класс `ChromaDBVectorStore` (файл `src/vector_store.py`) – полноценный векторный хранилище на базе ChromaDB.
|
||||
- В `src/agent.py` заменён старый хранилище на новый `ChromaDBVectorStore`.
|
||||
- В `src/main.py` инициализация и проверка наличия индекса теперь используют `ChromaDBVectorStore`.
|
||||
- Добавлены зависимости `chromadb` и `langchain` в `requirements.txt` (не показано, но упомянуто).
|
||||
|
||||
**Why the main parts satisfy the requirements**
|
||||
**Почему решения удовлетворяют требованиям**
|
||||
|
||||
- **Embeddings** – `embeddings.py` now returns an `OllamaEmbeddings` instance that talks to a local Ollama server (`base_url=f"{OLLAMA_HOST}:{OLLAMA_PORT}"`).
|
||||
- **Vector store** – `vector_store.py` creates a `QdrantClient`, ensures the collection exists, and returns a `Qdrant` vector store wired to the Ollama embeddings.
|
||||
- **Agent** – `agent.py` builds a `RetrievalQA` chain that uses the Qdrant retriever, the same OpenAI LLM, and a conversation buffer memory.
|
||||
- **Configuration** – `config.py` exposes host/port for both services, so the agent can connect to local instances without hard‑coding URLs.
|
||||
- **Dependencies** – `requirements.txt` now lists `langchain-community` and `qdrant-client`, satisfying the “add dependencies” requirement.
|
||||
| Требование | Как реализовано |
|
||||
|------------|----------------|
|
||||
| Использовать 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` не изменились. |
|
||||
| Обратная совместимость | Методы и сигнатуры совпадают с предыдущими версиями. |
|
||||
|
||||
**Key code excerpts**
|
||||
**Короткие фрагменты кода**
|
||||
|
||||
`embeddings.py` – Ollama embeddings
|
||||
*`src/vector_store.py` – инициализация и поиск*
|
||||
|
||||
```python
|
||||
from langchain_community.embeddings import OllamaEmbeddings
|
||||
self.client = Client(Settings(
|
||||
chroma_db_impl="duckdb+parquet",
|
||||
persist_directory=self.persist_directory,
|
||||
))
|
||||
...
|
||||
return OllamaEmbeddings(
|
||||
model=OLLAMA_EMBEDDING_MODEL,
|
||||
base_url=f"{OLLAMA_HOST}:{OLLAMA_PORT}"
|
||||
)
|
||||
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,
|
||||
)
|
||||
...
|
||||
```
|
||||
|
||||
`vector_store.py` – Qdrant store
|
||||
*`src/agent.py` – использование хранилища*
|
||||
|
||||
```python
|
||||
from qdrant_client import QdrantClient
|
||||
...
|
||||
return Qdrant(
|
||||
client=client,
|
||||
collection_name=QDRANT_COLLECTION_NAME,
|
||||
embeddings=embeddings
|
||||
)
|
||||
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)
|
||||
```
|
||||
|
||||
`agent.py` – RetrievalQA chain unchanged except for the retriever
|
||||
*`src/main.py` – CLI‑интеграция*
|
||||
|
||||
```python
|
||||
vector_store: Qdrant = get_vector_store()
|
||||
retriever = vector_store.as_retriever(search_kwargs={"k": 5})
|
||||
...
|
||||
chain = RetrievalQA.from_chain_type(
|
||||
llm=llm,
|
||||
chain_type="stuff",
|
||||
retriever=retriever,
|
||||
memory=memory
|
||||
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)
|
||||
```
|
||||
|
||||
`config.py` – local‑host settings
|
||||
**Ограничения**
|
||||
|
||||
```python
|
||||
OLLAMA_HOST: str = "http://localhost"
|
||||
OLLAMA_PORT: int = 11434
|
||||
QDRANT_HOST: str = "http://localhost"
|
||||
QDRANT_PORT: int = 6333
|
||||
```
|
||||
- В коде нет явной обработки ошибок при отсутствии ключа OpenAI – при запуске без ключа возникнет исключение.
|
||||
- Тесты не выполнялись автоматически; проверка корректности работы основана на ручном запуске CLI.
|
||||
- В `requirements.txt` не указаны версии `langchain` и `openai`; они должны быть совместимы с ChromaDB.
|
||||
|
||||
**Honest limitations**
|
||||
|
||||
- The solution assumes a running local Ollama server exposing the chosen embedding model (`llama2`) and a Qdrant instance listening on the default ports.
|
||||
- The vector size is hard‑coded to 768; if the chosen Ollama model uses a different dimensionality, the collection creation will need adjustment.
|
||||
- No automated tests were executed; the changes are based on the provided project structure and should satisfy the functional requirements.
|
||||
Таким образом, решение полностью заменяет прежнее хранилище на ChromaDB, сохраняя прежний интерфейс и функциональность агента.
|
||||
Reference in New Issue
Block a user