from flask import Flask, jsonify , request from openai import embeddings from flask_apscheduler import APScheduler from src.helper import download_hugging_face_embeddings from langchain_pinecone import PineconeVectorStore from langchain_openai import ChatOpenAI from langchain.chains import create_retrieval_chain from langchain.chains.combine_documents import create_stuff_documents_chain from configs import * from langchain_core.prompts import ChatPromptTemplate from src.prompt import * from store_index import * from sentence_transformers import CrossEncoder app = Flask(__name__) scheduler = APScheduler() scheduler.init_app(app) embeddings = download_hugging_face_embeddings() docsearch = PineconeVectorStore.from_existing_index( index_name=INDEX_NAME, #nếu mà đã chạy tạo db rồi thì thay bằng "chatbot" embedding=embeddings ) retriever = docsearch.as_retriever(search_type="similarity", search_kwargs={"k":40}) #search_type="similarity tìm kiếm theo cosin , #as_retrieve biến docsearch thành bộ tìm kiếm , .. k =3 -> tìm 3 giá trị gần nhất cross_encoder = CrossEncoder(MODEL_CROSS_ENCODER_NAME) llm = ChatOpenAI( model=MODEL_LLM_NAME, openai_api_key=DEEPSEEK_API_KEY, openai_api_base="https://openrouter.ai/api/v1", temperature=0.4, max_tokens=2048 ) #độ sáng tạo là 0.4 và số kí tự tối đa là 500 prompt = ChatPromptTemplate.from_messages( [ ("system", system_prompt), ("human", "{input}") # dữ liệu vào ] ) question_answer_chain = create_stuff_documents_chain(llm,prompt) def rerank_documents(query, docs, top_n=5): pairs = [[query, doc.page_content] for doc in docs] scores = cross_encoder.predict(pairs) reranked = sorted(zip(docs, scores), key=lambda x: x[1], reverse=True) return [doc for doc, _ in reranked[:top_n]] @app.route('/') def index(): return '''
App is running!
Use /chat_chatbot
with POST method to interact with the chatbot.