From 65558fb22a4378199f542729230a89000b7cf07c Mon Sep 17 00:00:00 2001 From: kuzakhmetovartur Date: Tue, 30 Jun 2026 00:21:29 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20solution=20for=20'=D0=90=D0=B3=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=20=D1=81=20RAG-=D0=BF=D0=B0=D0=BC=D1=8F=D1=82?= =?UTF-8?q?=D1=8C=D1=8E'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 82 ++++++++++------------------------- requirements.txt | 7 ++- src/main.py | 108 ++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 134 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index 72636fa..ffe64a0 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,14 @@ -# Agent with RAG Memory +# RAG Agent with LangChain, Qdrant, and Ollama -This project demonstrates a simple RAG (Retrieval-Augmented Generation) agent that uses LangChain tools to perform basic operations via an interactive command line interface (CLI). +This repository contains a minimal example of a Retrieval-Augmented Generation (RAG) agent built with **LangChain**, **Qdrant**, and **Ollama**. The agent retrieves relevant documents from a local Qdrant vector store and generates answers using an Ollama language model. -## Features +## Prerequisites -- **Add Numbers** – Add two integers using the `add_numbers` tool. -- **Search Items** – Search a predefined list of strings for a query using the `search_item` tool. -- **Interactive CLI** – Use `/add`, `/search`, and `/quit` commands to interact with the agent. +- **Python 3.10+** +- **Qdrant** server running locally (default port `6333`). + - Create a collection named `rag_collection` and populate it with embeddings. +- **Ollama** server running locally (default port `11434`). + - Ensure the model `llama3.1` (or any other supported model) is available. ## Installation @@ -17,7 +19,7 @@ cd agent-s-rag-pamyatyu # Create a virtual environment (optional but recommended) python -m venv .venv -source .venv/bin/activate # On Windows use `.venv\\Scripts\\activate` +source .venv/bin/activate # On Windows: .venv\\Scripts\\activate # Install dependencies pip install -r requirements.txt @@ -25,72 +27,34 @@ pip install -r requirements.txt ## Usage -Run the CLI: - ```bash python -m src.main ``` -You will see a prompt: - -``` -Welcome to the RAG Agent CLI! -Available commands: - /add - Add two numbers. - /search - Search items in memory. - /quit - Exit the program. -``` - -### Commands - -- **/add** - Add two integers. - - ```text - >> /add 5 7 - Result: 12 - ``` - -- **/search** - Search the internal memory for a query string. - - ```text - >> /search python - Matches found: - 1. Python programming - ``` - -- **/quit** - Exit the program. - - ```text - >> /quit - Goodbye! - ``` +You will be prompted to enter a question. The agent will retrieve relevant documents from Qdrant and generate an answer using Ollama. Type `exit` or `quit` to terminate the program. ## Project Structure ``` agent-s-rag-pamyatyu/ -├── src/ -│ ├── __init__.py -│ ├── cli.py -│ ├── main.py -│ └── tools.py -├── README.md ├── requirements.txt -└── pyproject.toml +├── src/ +│ └── main.py +└── README.md ``` -## Dependencies +- `requirements.txt` – lists all Python dependencies, including `langchain-qdrant` and `langchain-ollama`. +- `src/main.py` – contains the RAG agent implementation. +- `README.md` – this documentation file. -- `langchain` – The core library for building language model agents. -- `python-dotenv` – (Optional) For loading environment variables if needed. +## Troubleshooting + +- **Missing dependencies**: Ensure you ran `pip install -r requirements.txt`. +- **Qdrant connection errors**: Verify Qdrant is running and the collection name matches `rag_collection`. +- **Ollama connection errors**: Verify Ollama is running and the model name is correct. ## License -MIT License +This project is provided as-is for educational purposes. Feel free to modify and extend it. ---- - -Feel free to extend the tools or the CLI to suit your needs! \ No newline at end of file +--- \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 62ea0c5..f45cb02 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,5 @@ -langchain>=0.0.0 -python-dotenv>=0.21.0 \ No newline at end of file +langchain>=0.2.0 +langchain-qdrant>=0.1.0 +langchain-ollama>=0.1.0 +qdrant-client>=1.0.0 +pydantic>=2.0.0 \ No newline at end of file diff --git a/src/main.py b/src/main.py index a2b3356..ffe6bf1 100644 --- a/src/main.py +++ b/src/main.py @@ -1,7 +1,111 @@ -from .cli import run_cli +""" +Simple RAG agent using LangChain, Qdrant, and Ollama. + +This script demonstrates how to set up a retrieval-augmented generation (RAG) pipeline +with a local Qdrant vector store and an Ollama LLM. It can be run directly: + + python -m src.main + +The script will prompt the user for a question and return an answer based on the +documents stored in Qdrant. + +Prerequisites: +- Qdrant server running locally (default port 6333). +- Ollama server running locally (default port 11434). +- A Qdrant collection named "rag_collection" populated with embeddings. +""" + +import os +import sys +from typing import Optional + +try: + from langchain_ollama import OllamaLLM + from langchain_qdrant import QdrantStore + from langchain.chains import RetrievalQA + from langchain.memory import ConversationBufferMemory +except ImportError as e: + print("Required packages are missing. Please run 'pip install -r requirements.txt'.") + sys.exit(1) + + +def get_llm() -> OllamaLLM: + """ + Create an Ollama LLM instance. + """ + # Ollama defaults to http://localhost:11434 + return OllamaLLM(model="llama3.1") + + +def get_vector_store() -> QdrantStore: + """ + Connect to the local Qdrant instance and load the collection. + """ + # Qdrant defaults to http://localhost:6333 + return QdrantStore( + url="http://localhost:6333", + collection_name="rag_collection", + embedding_function=None, # embeddings are already stored + ) + + +def build_qa_chain(llm: OllamaLLM, vector_store: QdrantStore) -> RetrievalQA: + """ + Build a RetrievalQA chain that uses the vector store for context retrieval. + """ + memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True) + + return RetrievalQA.from_chain_type( + llm=llm, + chain_type="stuff", + retriever=vector_store.as_retriever(search_kwargs={"k": 4}), + memory=memory, + return_source_documents=True, + ) + def main() -> None: - run_cli() + """ + Main entry point: prompt user for a question and print the answer. + """ + print("Initializing RAG agent...") + try: + llm = get_llm() + vector_store = get_vector_store() + qa_chain = build_qa_chain(llm, vector_store) + except Exception as exc: + print(f"Failed to initialize components: {exc}") + sys.exit(1) + + print("RAG agent ready. Type your question (or 'exit' to quit).") + while True: + try: + user_input = input("\n> ").strip() + except (EOFError, KeyboardInterrupt): + print("\nExiting.") + break + + if user_input.lower() in {"exit", "quit"}: + print("Goodbye!") + break + + if not user_input: + print("Please enter a non-empty question.") + continue + + try: + result = qa_chain({"question": user_input}) + answer = result.get("answer", "No answer returned.") + sources = result.get("source_documents", []) + print("\nAnswer:") + print(answer) + if sources: + print("\nSources:") + for doc in sources: + print(f"- {doc.metadata.get('source', 'unknown')}") + except Exception as exc: + print(f"Error during query: {exc}") + if __name__ == "__main__": main() \ No newline at end of file