buildersai / app /llm /agents /rag.py
Kushal
Initial deployment: FastAPI backend with Docker
f3997d4
Raw
History Blame Contribute Delete
2.7 kB
from typing import Dict, List
import os
from app.llm.client import llm_client
class RAGAgent:
"""Agent for document-based question answering using RAG."""
def __init__(self):
"""Initialize RAG agent with prompt template."""
prompt_path = os.path.join(
os.path.dirname(__file__),
"..",
"prompts",
"rag.txt"
)
with open(prompt_path, "r") as f:
self.system_prompt = f.read()
def answer(self, query: str, context_chunks: List[Dict]) -> Dict[str, any]:
"""
Generate answer based on retrieved document chunks.
Args:
query: User query string
context_chunks: List of retrieved document chunks with metadata
Returns:
Dictionary with 'answer', 'sources', and 'agent' keys
"""
try:
# Format context for LLM
context = self._format_context(context_chunks)
messages = [
{"role": "system", "content": self.system_prompt},
{"role": "user", "content": f"Context:\n{context}\n\nQuery: {query}"}
]
answer = llm_client.get_completion(
messages=messages,
temperature=0.3, # Lower temperature for factual accuracy
max_tokens=1024
)
# Extract unique sources
sources = list({
chunk.get("metadata", {}).get("filename", "Unknown")
for chunk in context_chunks
})
return {
"answer": answer,
"sources": sources,
"agent": "rag"
}
except Exception as e:
print(f"RAG agent error: {e}")
return {
"answer": "I encountered an error while processing your question. Please try again.",
"sources": [],
"agent": "rag"
}
def _format_context(self, chunks: List[Dict]) -> str:
"""Format document chunks for LLM context."""
if not chunks:
return "No relevant documents found."
formatted = []
for i, chunk in enumerate(chunks, 1):
metadata = chunk.get("metadata", {})
content = chunk.get("content", "")
filename = metadata.get("filename", "Unknown")
formatted.append(
f"[Document {i}: {filename}]\n{content}\n"
)
return "\n---\n".join(formatted)
# Global RAG agent instance
rag_agent = RAGAgent()