From 2b4836ba70b2abb2ccbea07fe297878eed766b31 Mon Sep 17 00:00:00 2001 From: letai2001 Date: Mon, 6 Oct 2025 23:41:52 +0700 Subject: [PATCH] s3 --- .env | 2 + .../__pycache__/retriever.cpython-313.pyc | Bin 3480 -> 3460 bytes src/chatbot/llm_client.py | 72 ++++-------------- src/chatbot/prompt_builder.py | 10 --- src/chatbot/rag_pipeline.py | 55 ++----------- src/chatbot/retriever.py | 6 +- src/core/__pycache__/config.cpython-313.pyc | Bin 2893 -> 3043 bytes .../__pycache__/qdrant_admin.cpython-313.pyc | Bin 5734 -> 5734 bytes .../__pycache__/vector_store.cpython-313.pyc | Bin 4077 -> 4077 bytes .../ingest_semantic.cpython-313.pyc | Bin 3716 -> 3716 bytes 10 files changed, 25 insertions(+), 120 deletions(-) diff --git a/.env b/.env index cabe96c..277e49e 100644 --- a/.env +++ b/.env @@ -11,3 +11,5 @@ EMBED_DIM=768 QDRANT_URL=http://localhost:6333 QDRANT_COLLECTION=text_chunks +GEMINI_API_KEY = "AIzaSyDWqNUBKhaZjbFI8CW52_hKr46JtWABkGU" +GEMINI_MODEL = "models/gemini-2.0-flash-001" \ No newline at end of file diff --git a/src/chatbot/__pycache__/retriever.cpython-313.pyc b/src/chatbot/__pycache__/retriever.cpython-313.pyc index b8840d2eedae027da5f9380fd0bd21ab720fe138..376eff9fad5eebef7d5f9d6ec8899f3bde6c4f8a 100644 GIT binary patch delta 48 zcmbOs-6GBVnU|M~0SE%!A7#AT$eYg1SH str: + genai.configure(api_key=api_key) + self.model = genai.GenerativeModel(model) + + def generate(self, prompt: str) -> str: """ - Gửi prompt tới vLLM API và trả về câu trả lời. + Gửi prompt vào Gemini và trả về nội dung text. """ - url = f"{self.base_url}/v1/chat/completions" - - messages = [] - if system_prompt: - messages.append({"role": "system", "content": system_prompt}) - messages.append({"role": "user", "content": prompt}) - - payload: Dict[str, Any] = { - "model": self.model, - "messages": messages, - "temperature": self.temperature, - "max_tokens": self.max_tokens, - "stream": False, - } - try: - response = requests.post(url, json=payload, timeout=60) - response.raise_for_status() - data = response.json() - return data["choices"][0]["message"]["content"].strip() + response = self.model.generate_content(prompt) + return response.text.strip() if response.text else "" except Exception as e: - print(f"[LLMClient] ❌ Error calling vLLM: {e}") - return f"[Error] {e}" - - -# ---- Test nhanh ---- -if __name__ == "__main__": - client = LLMClient() - prompt = "Viết đoạn mô tả ngắn về hành tinh Sao Hỏa." - answer = client.generate(prompt) - print("🪐 Kết quả từ LLM:") - print(answer) + print(f"[GeminiLLMClient] Lỗi khi gọi Gemini API: {e}") + return "" diff --git a/src/chatbot/prompt_builder.py b/src/chatbot/prompt_builder.py index 4831350..7b0f4e6 100644 --- a/src/chatbot/prompt_builder.py +++ b/src/chatbot/prompt_builder.py @@ -70,14 +70,4 @@ class PromptBuilder: return prompt -# 🔍 Kiểm tra nhanh -if __name__ == "__main__": - fake_docs = [ - {"file_name": "doc1.txt", "text": "Điện thoại Vivo V27 có camera 64MP.", "score": 0.87}, - {"file_name": "doc2.txt", "text": "Máy có pin 4600mAh, sạc nhanh 66W.", "score": 0.83}, - ] - builder = PromptBuilder() - query = "Điện thoại Vivo V27 pin bao nhiêu?" - prompt = builder.build_prompt(query, fake_docs) - print(prompt) diff --git a/src/chatbot/rag_pipeline.py b/src/chatbot/rag_pipeline.py index 4a3eabb..94b2cd8 100644 --- a/src/chatbot/rag_pipeline.py +++ b/src/chatbot/rag_pipeline.py @@ -11,59 +11,18 @@ Kết nối các module: """ from typing import List, Dict, Any +from src.chatbot.llm_client import LLMClient from src.chatbot.retriever import Retriever from src.chatbot.prompt_builder import PromptBuilder -from src.chatbot.llm_client import LLMClient - class RAGPipeline: def __init__(self): - # Khởi tạo các thành phần chính self.retriever = Retriever() self.prompt_builder = PromptBuilder() - self.llm_client = LLMClient() + self.llm = LLMClient() - def query(self, user_query: str, top_k: int = 5) -> Dict[str, Any]: - """ - Xử lý một truy vấn RAG hoàn chỉnh: - - Lấy top_k văn bản liên quan - - Xây prompt hoàn chỉnh - - Gọi LLM sinh câu trả lời - """ - print(f"\n[🔍] Nhận truy vấn: {user_query}") - - # 1️⃣ Retrieve context từ Qdrant - context_docs = self.retriever.search(user_query, top_k=top_k) - if not context_docs: - return {"answer": "❌ Không tìm thấy thông tin phù hợp trong cơ sở tri thức."} - - print(f"[📚] Lấy được {len(context_docs)} đoạn văn liên quan.") - - # 2️⃣ Build prompt từ user_query + context - prompt = self.prompt_builder.build_prompt(user_query, context_docs) - - # 3️⃣ Gọi LLM - answer = self.llm_client.generate(prompt) - - # 4️⃣ Trả về kết quả tổng hợp - return { - "query": user_query, - "context_used": context_docs, - "prompt": prompt, - "answer": answer, - } - - -# ---- Test thủ công ---- -if __name__ == "__main__": - rag = RAGPipeline() - query = "Hành tinh Sao Mộc có những đặc điểm nổi bật nào?" - result = rag.query(query, top_k=3) - - print("\n=== 💬 Kết quả Chatbot ===") - print("Câu hỏi:", result["query"]) - print("\n🧠 Context dùng:") - for i, ctx in enumerate(result["context_used"], 1): - print(f"{i}. {ctx['text'][:200]}...") - print("\n🤖 Trả lời:") - print(result["answer"]) + def run(self, user_query: str) -> str: + docs = self.retriever.retrieve(user_query) + prompt = self.prompt_builder.build(user_query, docs) + answer = self.llm.generate(prompt) + return answer diff --git a/src/chatbot/retriever.py b/src/chatbot/retriever.py index bd57b9c..c966378 100644 --- a/src/chatbot/retriever.py +++ b/src/chatbot/retriever.py @@ -1,7 +1,3 @@ -# -*- coding: utf-8 -*- -""" -Retriever: Tìm kiếm các đoạn văn bản liên quan trong Qdrant. -""" from typing import List, Dict, Any from sentence_transformers import SentenceTransformer @@ -63,7 +59,7 @@ class Retriever: if __name__ == "__main__": # Test nhanh retriever = Retriever(top_k=3) - query = "Mahola ca sĩ nam Phi là ai?" + query = "Mahola la ai" results = retriever.search(query) for i, r in enumerate(results, 1): print(f"\n[{i}] Score={r['score']:.4f}") diff --git a/src/core/__pycache__/config.cpython-313.pyc b/src/core/__pycache__/config.cpython-313.pyc index ce4c97f70f144b25895ce0667b1a3c536570b930..5a907c7260a836a5ebf7287a5278b6dacb431420 100644 GIT binary patch delta 242 zcmX>r_E?nhQVl9B=|ef^yLxPhM1OE*{kp{lcOuUSyMe;yZ086h$I{*Lx delta 90 zcmaDXepZa{GcPX}0}yO^|1je*??gTc#=MQ{*-RW#3`OGUOqz0=S20;JZI)-<$;{|E q`6kC>Mv2LLIol>zamjOO0kts#ak0wg#av2^T%TEZ8BL4ifg%9AUKhpy diff --git a/src/core/__pycache__/qdrant_admin.cpython-313.pyc b/src/core/__pycache__/qdrant_admin.cpython-313.pyc index b281c35e59f0c9ae14be423cc4db7089b1cd6532..44342b7aa9cb89c18695500196f41ed2a44bf4a8 100644 GIT binary patch delta 19 ZcmaE+^Gt{9GcPX}0}xy^-N+Rq1^_>G1$h7f delta 19 ZcmaE+^Gt{9GcPX}0}y;N*~k?m1^_@d1(^T< diff --git a/src/core/__pycache__/vector_store.cpython-313.pyc b/src/core/__pycache__/vector_store.cpython-313.pyc index 0953476253a23bafaf1cbcf56f13c48c838e65d6..8d4b7dab0cd60f98aee0bc77a73d15df71b3ee4c 100644 GIT binary patch delta 19 ZcmaDW|5l#sGcPX}0}vRSZ{&K+4*)zA1yKM1 delta 19 ZcmaDW|5l#sGcPX}0}v?dZ{&K+4*)xi1vvl! diff --git a/src/ingest/__pycache__/ingest_semantic.cpython-313.pyc b/src/ingest/__pycache__/ingest_semantic.cpython-313.pyc index 07eba5ae0093f7c312c9fc079d42b6b4065a8406..165b8fa179aa3d742eb7160f0043206525acd441 100644 GIT binary patch delta 19 ZcmZpXZIR{r%*)Hg00dV|H*!_+0RS)c1h4=A delta 19 ZcmZpXZIR{r%*)Hg00butHgZ+*0RS(Q1fKu^