79 lines
2.4 KiB
Markdown
79 lines
2.4 KiB
Markdown
# RAG Agent with ChromaDB and Tavily
|
||
|
||
This repository contains a lightweight RAG (Retrieval‑Augmented Generation) agent that:
|
||
|
||
1. Stores local knowledge in **ChromaDB** using **Ollama** embeddings.
|
||
2. Performs semantic search over the local store.
|
||
3. Falls back to **Tavily** web search for up‑to‑date information.
|
||
4. Decides automatically which source to use and indicates the source in the answer.
|
||
|
||
## Prerequisites
|
||
|
||
* Python 3.10+ (recommended via `pyenv` or `conda`).
|
||
* [Ollama](https://ollama.ai/) installed locally.
|
||
* A Tavily API key – set it in a `.env` file.
|
||
|
||
```bash
|
||
# Pull the required models
|
||
ollama pull llama3
|
||
ollama pull nomic-embed-text
|
||
```
|
||
|
||
## Installation
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
## Usage
|
||
|
||
```bash
|
||
# Create a .env file with your Tavily key
|
||
# TAVILY_API_KEY=YOUR_KEY
|
||
|
||
# Populate the vector store from the documents folder
|
||
python main.py
|
||
```
|
||
|
||
You will be presented with a prompt. Type your question and press **Enter**.
|
||
Type `exit` to quit.
|
||
|
||
## Project Structure
|
||
|
||
```
|
||
├── agent.py # Agent definition
|
||
├── main.py # CLI entry point
|
||
├── tools.py # Local KB and web search tools
|
||
├── vectorstore.py # ChromaDB helpers
|
||
├── requirements.txt
|
||
├── README.md
|
||
└── documents/ # Folder with .txt/.md files to ingest
|
||
```
|
||
|
||
## How It Works
|
||
|
||
1. **Vector Store** – `vectorstore.py` creates a ChromaDB instance backed by
|
||
`OllamaEmbeddings`. Documents from `documents/` are chunked with
|
||
`RecursiveCharacterTextSplitter` and added to the store.
|
||
|
||
2. **Tools** – `tools.py` exposes two LangChain tools:
|
||
* `search_local_kb` – semantic search in ChromaDB.
|
||
* `web_search` – web search via Tavily.
|
||
|
||
3. **Agent** – `agent.py` builds an OpenAI‑functions‑style agent that
|
||
chooses between the two tools based on the user’s query. The system prompt
|
||
instructs the LLM to use `search_local_kb` for knowledge‑base queries and
|
||
`web_search` for recent facts. The answer always contains a source tag.
|
||
|
||
4. **CLI** – `main.py` ties everything together: it loads the vector store,
|
||
creates the agent and runs an interactive chat loop.
|
||
|
||
## Extending
|
||
|
||
* Replace the LLM with any other LangChain‑compatible model.
|
||
* Add more tools (e.g., database queries, file system access).
|
||
* Persist the vector store across runs – it already does this via `persist_directory`.
|
||
|
||
---
|
||
|
||
Happy experimenting! |