Bạn có một bộ tài liệu nhưng nó tốn khá nhiều thời gian để bạn có thể đọc được hết tài liệu này. Dừng lo vì trong bài viết này mình sẽ hưỡng dẫn mọi người xây dựng chatbot sử dụng kỹ thuật RAG (Retrieval Augmented Generation) hỗ trợ, giảm thời gian mà vẫn nắm được nội dung trong tài liệu.
1. Mô hình ngôn ngữ lớn (Large Language Models – LLM)
Mô hình ngôn ngữ lớn là một nhánh trong lĩnh vực xử lý ngôn ngữ tự nhiên (Natural Language Processing – NLP). Mô hình này chuyên tạo văn bản bằng cách phân tích và xử lý các bộ dữ liệu khổng lồ. Điểm mạnh của mô hình ngôn ngữ lớn là khả năng hiểu và tạo ra các đoạn văn bản một cách linh hoạt. Mô hình ngôn ngữ lớn sử dụng một mô hình được gọi là “Tranformer”. Tranformer sẽ học về ngữ cảnh, ngữ nghĩa ở trong dữ liệu như văn bản
Một ví dụ điển hình cũng như nổi tiếng về chatbot sử dụng LLM là ChatGPT, tích hợp trong GPT-3.5 và GPT-4 tới đây có thể là GPT-5
Vấn đề của các mô hình ngôn ngữ lớn hiện tại là hạn chế về kiến thức. Do hiện tại các tri thức trong mô hình sẽ bị giới hạn bởi lượng dữ liệu được huấn luyện, nên nếu câu hỏi nằm ngoài dữ liệu được huấn luyện thì nội dung trả lại sẽ không chính xác. Ví dụ với GPT-3.5 dữ liệu được huấn luyện đến tháng 1 năm 2022, điều này nghĩa là nếu nội dung câu hỏi của bạn thuộc năm 2023 thì GPT-3.5 sẽ trả lại một nội dung không chính xác. Vấn đề nữa là thỉnh thoảng mô hình sẽ tạo ra các thông tin không chính xác hoặc gây hiểu nhầm do thiếu kiến trúc chuyên sâu, hay còn được biết là “ảo giác” – hallucination. Điều này là do LLM không được huấn luyện với các nội dung kiến thức chuyên sâu về một lĩnh vực nào đó chẳng hạn như các quy tắc trong pháp lý hoặc lĩnh vực như y tế, những nội dung này thường nằm ngoài phạm vi dữ liệu huấn luyện.
2. Giới thiệu RAG
Để khắc phục các vấn đề trên, trong bài viết này chúng ta sẽ sử dụng kỹ thuật RAG. RAG, viết tắt của Retrieval-Augmented Generation, cho phép truy xuất thông tin từ tri thức bên ngoài để bổ sung cho mô hình ngôn ngữ. Một cách hiểu đơn giản, RAG đối với LLM sẽ giống như làm bài kiểm tra nhưng lại được mang tài liệu vào phòng thi. Việc truy xuất thông tin này giúp cung cấp các câu trả lời chi tiết và uy tín hơn là chỉ dựa trên tri thức của mô hình.
3. Các công cụ sử dụng
- LangChain là một framework mã nguồn mở (open-source) được viết bằng Python và JavaScript, được thiết kế để xây dựng các ứng dụng tập trung vào mô hình ngôn ngữ. LangChain cung cấp các thành phần cho phép những người không chuyên về AI vẫn có thể triển khai được các mô hình ngôn ngữ vào ứng dụng của họ.
- Hugging Face là một platform mã nguồn mở tập trung vào khoa học dữ liệu và học máy. Nền tảng cho phép người dùng chia sẻ mô hình học máy của họ. Với Hugging Face, bạn có thể tìm thấy rất nhiều mô hình học máy đã được huấn luyện trước, bao gồm xử lý ngôn ngữ tự nhiên(NLP), thị giác máy tình (Commputer Vision), …
- Qdrant: vector database – Vector database lưu trữ dữ liệu dưới dạng vec-tơ, là một mạng số như [2,6,55,-8,…]. Với vector database cho phép tìm kiếm sự tương đồng hiệu quả, do các dữ liệu tương tự nhau sẽ được nhóm lại và cho phép các mô hình hoặc ứng dụng truy xuất thông tin một cách hiệu quả. Qdrant là một vector database mã nguồn mở cho phép lưu trữ các ‘phần nhúng thần kinh’ cùng với siêu dữ liệu, hay còn gọi là tải trọng (payload). Payload không chỉ để giữ một số thuộc tính bổ sung của một điểm(point) cụ thể mà còn có thể được sử dụng để lọc. Qdrant cung cấp một cơ chế lọc độc đáo được tích hợp sẵn trong giai đoạn tìm kiếm vectơ, điều này khiến nó thực sự hiệu quả.
- Google Colab là nền tảng miễn phí dựa trên đám mây do Google cung cấp, cho phép người dùng viết và thực thi Python và R trong môi trường Jupyter Notebook. Được thiết kế để hỗ trợ các nhiệm vụ học máy và khoa học dữ liệu bằng cách cung cấp môi trường ảo, ngoài ra bạn có thể sử dụng tài nguyên GPU miễn phí.
4. Thực hành nào!!!
Truy cập vào Google Colab và tạo một notebook mới
Tiếp tục chọn “Connect” hoặc mọi người có thể tùy chỉnh môi trường cũng như chọn các phần cứng với “Change runtime type”
Cài đặt các thư viện phụ thuộc:
langchain
pypdf
qdrant-client
gpt4all
ctransformers
Chọn một mô hình ngôn ngữ lớn trên Hugging Face, ở đây mình sẽ sử dụng mô hình vinallama-7b-chat-GGUF. Sử dụng câu lệnh sau để tải trên Google Colab
!wget https://huggingface.co/vilm/vinallama-7b-chat-GGUF/resolve/main/vinallama-7b-chat_q5_0.gguf
Khởi tạo các hàm chức năng
from langchain.text_splitter import RecursiveCharacterTextSplitter, CharacterTextSplitter from langchain_community.document_loaders import PyPDFLoader, DirectoryLoader from langchain_community.vectorstores import Qdrant from langchain_community.embeddings import GPT4AllEmbeddings from langchain_community.llms import CTransformers from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate
Đường dẫn dưới đây sẽ phụ thuộc vào cách các bạn đặt tên và nơi bạn tải mô hình xuống
pdf_data_path = "data" model_file = "/content/vinallama-7b-chat_q5_0.gguf"
def create_db_from_pdf(): loader = DirectoryLoader(pdf_data_path, glob="*.pdf", loader_cls=PyPDFLoader) documents = loader.load() text_spilit = RecursiveCharacterTextSplitter(chunk_size=512, chunk_overlap=50) chunks = text_spilit.split_documents(documents) embedding_model = GPT4AllEmbeddings() db = Qdrant.from_documents(chunks, embedding_model, path="data", collection_name="my_documents") return db # Load LLM def load_llm(model_file):\ #for cpu llm = CTransformers( model=model_file, model_type="llama", max_new_tokens=1024, temperature=0.01 ) return llm def creat_prompt(template): prompt = PromptTemplate(template = template, input_variables=["context", "question"]) return prompt # Tao simple chain def create_qa_chain(prompt, llm, db): llm_chain = RetrievalQA.from_chain_type( llm = llm, chain_type= "stuff", retriever = db.as_retriever(search_kwargs = {"k":3}, max_tokens_limit=1024), return_source_documents = False, chain_type_kwargs= {'prompt': prompt} ) return llm_chain
Tạo prompt (prompt này được cung cấp trên Hugging Face của mô hình ngôn ngữ)
template = """<|im_start|>system\nBản là một trợ lí AI hữu ích về pháp luật. Hãy trả lời câu hỏi chính xác, nếu bạn không biết câu trả lời, hãy nói không biết, đừng cố tạo ra câu trả lời\n {context}<|im_end|>\n<|im_start|>user\n{question}<|im_end|>\n<|im_start|>assistant""" prompt = creat_prompt(template)
Ví dụ:
Mình có tài liệu về luật nghĩa vụ quân sự, tại đây. Và hỏi xem luật này áp dụng với đối tượng nào
Lưu ý:
Mình đã thử tải mô hình lên trên GPU, nhưng do tham số của mô hình quá lớn nên không thể tải lên. Do đó, mình sử dụng thư viện Ctranformer để tải mô hình lên CPU nên lúc thực hiện tạo câu trả lời sẽ tốn một khoảng thời gian để có thể tạo được câu trả lời.
5. Tổng kết
Như vậy trong bài hôm nay, mình đã giới thiệu với mọi người về mô hình ngôn ngữ lớn, là kỹ thuật RAG cũng như hướng dẫn mọi người cách khởi tạo một chatbot đơn giản với langchain.
Ngoài cách trên thì mọi người hoàn toàn có thể sử dụng dịch vụ của các bên cung cấp sẵn. Nhưng hãy luôn cẩn thận với dữ liệu mà mọi người tải lên, các bên cung cấp dịch vụ hoàn toàn có thể thu thập dữ liệu phục vụ cho mục đích huấn luyện về sau hoặc cũng có thể sử dụng vào các mục đích khác mà chúng ta không lường trước.