| """ |
| tools/rag_tool.py — RAG Retrieval Aracı |
| |
| AGENTIC PATTERN: Tool Use + Long-Term Memory |
| ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ |
| FAQ agent bu tool'u çağırarak ChromaDB'den ilgili chunk'ları getirir. |
| Tool; embed et → ara → döndür işlemini kapsüller. |
| FAQ agent'ı sadece READ yetkisine sahiptir; slot okuyamaz/yazamaz. |
| """ |
| from langchain_core.tools import tool |
| from memory.vector_store import search_faq |
| from config import RAG_TOP_K |
|
|
|
|
| @tool |
| def retrieve_faq(query: str, top_k: int = RAG_TOP_K) -> dict: |
| """ |
| Kullanıcı sorusuna en alakalı SSS içeriklerini getirir. |
| |
| Args: |
| query: Kullanıcının sorusu |
| top_k: Kaç chunk getirileceği (varsayılan config'den) |
| |
| Returns: |
| {"chunks": [{"text": str, "title": str, "distance": float}], |
| "context": str} # LLM'e doğrudan verilecek birleşik metin |
| """ |
| chunks = search_faq(query, top_k=top_k) |
|
|
| if not chunks: |
| return { |
| "chunks": [], |
| "context": "Bu konuda SSS dokümanında bilgi bulunamadı.", |
| } |
|
|
| |
| context_parts = [] |
| for i, chunk in enumerate(chunks, 1): |
| context_parts.append(f"[{i}] {chunk['title']}\n{chunk['text']}") |
|
|
| return { |
| "chunks": chunks, |
| "context": "\n\n".join(context_parts), |
| } |
|
|