|
|
from langchain_ollama.llms import OllamaLLM |
|
|
from langchain_community.document_loaders import PyPDFLoader |
|
|
from langchain.text_splitter import RecursiveCharacterTextSplitter |
|
|
from langchain.vectorstores import Chroma |
|
|
from langchain_core.prompts import ChatPromptTemplate |
|
|
from langchain.chains.combine_documents import create_stuff_documents_chain |
|
|
from langchain.chains import create_retrieval_chain |
|
|
from langchain_huggingface import HuggingFaceEmbeddings |
|
|
import pandas as pd |
|
|
import os |
|
|
from langchain.schema import Document |
|
|
def load_and_process_pdf(): |
|
|
df = pd.read_excel(os.path.join(os.getcwd(), "chunk_metadata_template.xlsx")) |
|
|
splits = [] |
|
|
for i, row in df.iterrows(): |
|
|
|
|
|
chunk_with_metadata = Document( |
|
|
page_content=row['page_content'], |
|
|
metadata={ |
|
|
'chunk_id': row['chunk_id'], |
|
|
'document_title': row['document_title'], |
|
|
'keywords': row['keywords'], |
|
|
} |
|
|
) |
|
|
|
|
|
splits.append(chunk_with_metadata) |
|
|
return splits |
|
|
|
|
|
def create_vectorstore(splits = load_and_process_pdf()): |
|
|
|
|
|
embeddings = HuggingFaceEmbeddings() |
|
|
|
|
|
vectorstore = Chroma( |
|
|
collection_name="example_collection", |
|
|
embedding_function=embeddings, |
|
|
persist_directory="./chroma_langchain_db" |
|
|
) |
|
|
vectorstore.add_documents(splits) |
|
|
return vectorstore |
|
|
|
|
|
def create_rag_chain(): |
|
|
llm = OllamaLLM(model="gemma2:2b") |
|
|
|
|
|
system_prompt = ( |
|
|
""" |
|
|
<|context|> |
|
|
Bạn là một AI trợ lý chuyên cung cấp về sản phẩm bảo hiểm của công ty MB Ageas Life tại Việt Nam. |
|
|
Hãy trả lời chuyên nghiệp, chính xác, cung cấp thông tin bao quát trước, đưa ví dụ rồi mới đặt câu hỏi gợi mở nếu chưa rõ. Tất cả các thông tin cung cấp đều trong phạm vi MBAL. Những câu hỏi không có đủ thông tin thì mời khách hàng đăng ký để nhận tư vấn trên https://www.mbageas.life/ |
|
|
</s> |
|
|
<|user|> |
|
|
{query} |
|
|
</s> |
|
|
<|assistant|> |
|
|
""" |
|
|
) |
|
|
|
|
|
prompt = ChatPromptTemplate.from_messages( |
|
|
[ |
|
|
("system", system_prompt), |
|
|
("human", "{input}"), |
|
|
] |
|
|
) |
|
|
|
|
|
question_answer_chain = create_stuff_documents_chain(llm, prompt) |
|
|
return question_answer_chain |
|
|
|
|
|
def get_response(rag_chain, vectorstore, question): |
|
|
retriever = vectorstore.as_retriever( |
|
|
search_kwargs={'k': 5} |
|
|
) |
|
|
retrieval_chain = create_retrieval_chain(retriever, rag_chain) |
|
|
response = retrieval_chain.invoke({"input": question}) |
|
|
return response["answer"] |