Cấu hình ứng dụng Semantic Search với LlamaIndex
Chuẩn bị script Python cho Semantic Search
Chúng ta sẽ tạo một script Python độc lập để thực hiện tìm kiếm ngữ nghĩa. Script này sẽ kết nối với PostgreSQL đã cấu hình ở phần trước, sử dụng index vector để tìm các đoạn văn bản tương tự với câu hỏi đầu vào.
Tạo file /app/semantic_search.py với nội dung hoàn chỉnh sau. File này bao gồm logic kết nối, hàm tìm kiếm và hàm gọi LLM để tổng hợp câu trả lời (RAG).
cat > /app/semantic_search.py
Sau khi tạo file, hãy cấp quyền thực thi và kiểm tra cú pháp Python bằng lệnh python3 -m py_compile /app/semantic_search.py. Kết quả mong đợi là không có thông báo lỗi nào, file được biên dịch thành bytecode.
Cài đặt các thư viện phụ thuộc còn thiếu
Script trên yêu cầu các thư viện để kết nối PostgreSQL và chạy model HuggingFace. Chúng ta cần cài đặt thêm psycopg2-binary và transformers nếu chưa có.
Chạy lệnh sau trong môi trường virtualenv đã tạo ở Phần 4:
pip install psycopg2-binary transformers accelerate
Kết quả mong đợi: Pip sẽ tải và cài đặt các gói, hiển thị dòng Successfully installed .... Đảm bảo không có lỗi ImportError khi import các module trong script.
Tối ưu hóa tham số tìm kiếm
Điều chỉnh top_k và distance metric
Tham số top_k quyết định số lượng kết quả trả về, ảnh hưởng trực tiếp đến độ chính xác và tốc độ. Tham số similarity_cutoff (ngưỡng điểm số) giúp lọc bỏ các kết quả không liên quan.
Để kiểm tra hiệu quả của các tham số này, chúng ta sẽ tạo một script test nhỏ để chạy nhiều lần với các giá trị khác nhau và so sánh điểm số (score).
Tạo file /app/test_optimization.py:
cat > /app/test_optimization.py 0.7]
print(f"Tổng số kết quả: {len(all_res)}, Kết quả độ tin cậy cao (>0.7): {len(high_confidence)}")
if __name__ == "__main__":
run_optimization_test()
EOF
Chạy script test bằng lệnh python3 /app/test_optimization.py. Kết quả mong đợi: Bạn sẽ thấy sự khác biệt về số lượng kết quả và điểm số khi thay đổi top_k và cutoff. Các kết quả có score cao thường liên quan sát hơn đến từ khóa chính.
Verify kết quả tối ưu
Để xác nhận việc tối ưu hoạt động đúng, hãy so sánh kết quả tìm kiếm của câu hỏi mơ hồ (ví dụ: "database setup") với câu hỏi cụ thể ("install pgvector").
Thực hiện lệnh python3 /app/semantic_search.py "install pgvector" và python3 /app/semantic_search.py "database setup". Quan sát điểm số (score): câu hỏi cụ thể phải có score cao hơn và nội dung trả về chính xác hơn.
Triển khai RAG (Retrieval-Augmented Generation)
Kết hợp LLM để tổng hợp câu trả lời
Bước quan trọng nhất của Semantic Search là biến các đoạn văn bản rời rạc thành một câu trả lời mạch lạc. Chúng ta sẽ sử dụng pattern RAG: Retrieve (lấy dữ liệu từ pgvector) -> Augment (đính kèm vào prompt) -> Generate (LLM tạo câu trả lời).
Trong script semantic_search.py đã có hàm generate_rag_response. Hàm này sử dụng một LLM (ở đây là HuggingFaceLLM) để đọc context và trả lời.
Tuy nhiên, để chạy ổn định trên server không có GPU mạnh, chúng ta sẽ cấu hình lại để dùng LLM qua API (ví dụ: OpenAI hoặc một endpoint HuggingFace inference) hoặc dùng một model nhỏ chạy CPU. Dưới đây là cách cấu hình sử dụng API để đảm bảo tốc độ và độ chính xác.
Chỉnh sửa hàm generate_rag_response trong file /app/semantic_search.py để dùng OpenAI (hoặc model tương thích OpenAI). Giả sử bạn có key API.
Tạo file cấu hình riêng /app/config.py để quản lý key:
cat > /app/config.py
Cập nhật hàm generate_rag_response trong /app/semantic_search.py để tích hợp logic này:
sed -i '/def generate_rag_response/,/^if __name__ == "__main__":/{
/from llama_index.llms.huggingface import HuggingFaceLLM/c\
from llama_index.llms.openai import OpenAI\
from llama_index.llms.huggingface import HuggingFaceLLM\
from config import USE_LOCAL_LLM, OPENAI_API_KEY, LLM_MODEL_NAME
/llm = HuggingFaceLLM(/,/)/c\
if USE_LOCAL_LLM:\
llm = HuggingFaceLLM(model_name="HuggingFaceH4/zephyr-7b-beta", max_new_tokens=256, device_map="auto")\
else:\
llm = OpenAI(model=LLM_MODEL_NAME, api_key=OPENAI_API_KEY)
}' /app/semantic_search.py
Lệnh sed trên sẽ tự động chèn logic chọn LLM vào file. Nếu muốn chỉnh sửa thủ công, hãy mở file và thay thế phần khởi tạo llm bằng đoạn code kiểm tra USE_LOCAL_LLM.
Để chạy với LLM qua API, bạn cần thiết lập biến môi trường:
export OPENAI_API_KEY="sk-your-actual-api-key-here"
Kết quả mong đợi: Khi chạy script, nếu có key, nó sẽ gọi API nhanh chóng và trả về câu trả lời tự nhiên. Nếu không có key, nó sẽ fallback về model local (có thể báo lỗi nếu thiếu GPU hoặc chạy rất chậm).
Verify kết quả RAG
Để kiểm tra tính chính xác của RAG, hãy đặt một câu hỏi mà câu trả lời nằm trong dữ liệu đã index nhưng cần tổng hợp từ nhiều đoạn.
Thực hiện lệnh python3 /app/semantic_search.py "Tóm tắt quy trình cài đặt PostgreSQL và pgvector". Kết quả mong đợi: Script trả về một đoạn văn bản hoàn chỉnh, tổng hợp các bước từ "cài đặt PostgreSQL", "tạo extension", đến "chạy lệnh create extension", thay vì chỉ liệt kê rời rạc các đoạn code.
Quan sát phần "Kết quả tìm kiếm ngữ nghĩa" để thấy các đoạn văn bản được chọn có chứa thông tin liên quan, và phần "Câu trả lời tổng hợp" phải logic, không bị lặp lại hoặc sai sự thật so với context.
Điều hướng series:
Mục lục: Series: Triển khai Database AI với pgvector, LlamaIndex và Ubuntu 24.04
« Phần 6: Kết nối LlamaIndex với PostgreSQL pgvector
Phần 8: Tối ưu hiệu năng và xử lý sự cố trong môi trường sản xuất »