Cách Agentic RAG Giảm Ảo Giác và Cải Thiện Truy Xuất
Khám phá cách Agentic RAG có thể giảm ảo giác và cải thiện việc truy xuất bằng cách định dạng lại các truy vấn, tinh chỉnh kết quả và khai thác các mô hình ngôn ngữ lớn hơn. Mở khóa các phản hồi toàn diện và liên quan hơn cho các ứng dụng RAG của bạn.
17 tháng 2, 2025

Mở khóa sức mạnh của Retrieval Augmented Generation (RAG) với Agents. Khám phá cách để tăng cường đường ống RAG của bạn và giảm thiểu ảo giác bằng cách giới thiệu các tác nhân thông minh có thể phân tích truy vấn, tinh chỉnh tìm kiếm và tạo ra các phản hồi chính xác và toàn diện hơn. Bài đăng blog này cung cấp một hướng dẫn thực tế về việc triển khai RAG có tác nhân, trang bị cho bạn các công cụ để nâng cao các ứng dụng xử lý ngôn ngữ tự nhiên của bạn.
Cách Đại lý Có thể Sửa Chữa Ảo Giác trong RAG
Xây dựng một Đường ống RAG Agentic
Tạo ra một Công cụ Truy xuất
Tích hợp Mô hình Ngôn ngữ
Triển khai Đại lý Agentic
So sánh RAG Tiêu chuẩn và RAG Agentic
Kết luận
Cách Đại lý Có thể Sửa Chữa Ảo Giác trong RAG
Cách Đại lý Có thể Sửa Chữa Ảo Giác trong RAG
Bước lấy thông tin trong quá trình tạo ra nội dung được tăng cường bằng việc truy xuất (RAG) phụ thuộc rất nhiều vào cách người dùng đặt câu hỏi. Nếu truy vấn không được định dạng tốt, việc truy xuất thông tin có thể gặp khó khăn, ngay cả khi thông tin mà người dùng đang tìm kiếm có trong cơ sở kiến thức. Trong RAG truyền thống, chúng ta nhận được một truy xuất ngắn, nhưng chúng ta có thể khắc phục điều này bằng cách sử dụng RAG có tác nhân.
Để hiểu cách RAG có tác nhân có thể giúp, hãy xem xét cài đặt RAG truyền thống để truy xuất. Truy vấn của người dùng được chạy qua một bước tìm kiếm dựa trên sự tương tự ngữ nghĩa để tìm các phần liên quan nhất trong cơ sở thông tin. Nhưng điều gì sẽ xảy ra nếu câu hỏi không được đặt đúng cách? Trong trường hợp đó, đường ống RAG của bạn sẽ rất có thể bị ảo giác, nghĩa là nó sẽ bắt đầu tạo ra các câu trả lời, hoặc mô hình ngôn ngữ sẽ nói với người dùng rằng nó không thể tìm thấy thông tin, mặc dù thông tin thực sự có trong cơ sở kiến thức.
Chúng ta có thể khắc phục điều này bằng cách đưa các tác nhân vào đường ống RAG và cho họ khả năng không chỉ phân tích truy vấn ban đầu mà còn phân tích các phản hồi được tạo ra bởi đường ống RAG. Đây là cách nó thường hoạt động:
- Truy vấn ban đầu được chuyển qua một tác nhân.
- Tác nhân sẽ định dạng lại truy vấn ban đầu.
- Truy vấn được định dạng lại được chuyển qua cơ sở kiến thức và một bước tìm kiếm dựa trên sự tương tự ngữ nghĩa được thực hiện để truy xuất các tài liệu liên quan nhất.
- Trước khi chuyển các tài liệu liên quan đến mô hình ngôn ngữ, tác nhân phân tích lại những tài liệu hoặc phần đó và định dạng lại truy vấn nếu nghĩ rằng các tài liệu đã truy xuất không thể trả lời câu hỏi.
- Dựa trên truy vấn được định dạng lại, quá trình được lặp lại cho đến khi tác nhân hài lòng với cả các tài liệu đã truy xuất và truy vấn được định dạng lại.
- Ngữ cảnh cuối cùng sau đó được chuyển đến mô hình ngôn ngữ để tạo ra câu trả lời.
Trong trường hợp này, tác nhân có thể lập kế hoạch, phân tích và thực hiện để triển khai vòng lặp có tác nhân trong đường ống RAG của bạn. Bạn có nhiều lựa chọn, chẳng hạn như các khuôn khổ như Crew AI, AutoGPT hoặc LangGraph từ LangChain, mà bạn có thể sử dụng để xây dựng các tác nhân. Trong video này, chúng tôi sẽ sử dụng Transformers Agents, một tính năng ít được biết đến trong gói Transformers cho phép bạn tạo ra các tác nhân riêng của mình.
Xây dựng một Đường ống RAG Agentic
Xây dựng một Đường ống RAG Agentic
Bước lấy thông tin trong quá trình tạo ra nội dung được tăng cường bằng việc truy xuất, hay RAG, phụ thuộc rất nhiều vào cách người dùng đặt câu hỏi. Nếu truy vấn không được định dạng tốt, việc truy xuất thông tin có thể gặp khó khăn, ngay cả khi thông tin mà người dùng đang tìm kiếm có trong cơ sở kiến thức. Trong RAG truyền thống, chúng ta nhận được một truy xuất ngắn, nhưng chúng ta có thể khắc phục điều này bằng cách sử dụng RAG có tác nhân.
Để hiểu cách RAG có tác nhân có thể giúp, hãy xem xét cài đặt RAG truyền thống để truy xuất. Truy vấn của người dùng được chạy qua một bước tìm kiếm dựa trên sự tương tự ngữ nghĩa để tìm các phần liên quan nhất trong cơ sở thông tin. Nhưng điều gì sẽ xảy ra nếu câu hỏi không được đặt đúng cách? Trong trường hợp đó, đường ống RAG của bạn sẽ rất có thể bị ảo giác, nghĩa là nó sẽ bắt đầu tạo ra các câu trả lời, hoặc mô hình ngôn ngữ lớn sẽ nói với người dùng rằng nó không thể tìm thấy thông tin, mặc dù thông tin thực sự có trong cơ sở kiến thức.
Chúng ta có thể khắc phục điều này bằng cách đưa các tác nhân vào đường ống RAG và cho họ khả năng không chỉ phân tích truy vấn ban đầu mà còn phân tích các phản hồi được tạo ra bởi đường ống RAG. Đây là cách nó thường hoạt động:
- Truy vấn ban đầu được chuyển qua một tác nhân.
- Tác nhân sẽ định dạng lại truy vấn ban đầu.
- Truy vấn được định dạng lại được chuyển qua cơ sở kiến thức và một bước tìm kiếm dựa trên sự tương tự ngữ nghĩa được thực hiện để truy xuất các tài liệu liên quan nhất.
- Trước khi chuyển các tài liệu liên quan đến mô hình ngôn ngữ lớn, tác nhân phân tích lại những tài liệu hoặc phần đó và định dạng lại truy vấn nếu nghĩ rằng các tài liệu đã truy xuất không thể trả lời câu hỏi.
- Dựa trên truy vấn được định dạng lại, quá trình được lặp lại cho đến khi tác nhân hài lòng với cả các tài liệu đã truy xuất và truy vấn được định dạng lại.
- Ngữ cảnh cuối cùng sau đó được chuyển đến mô hình ngôn ngữ lớn để tạo ra câu trả lời.
Để triển khai vòng lặp có tác nhân trong đường ống RAG của bạn, bạn có nhiều lựa chọn, chẳng hạn như các khuôn khổ như Crew AI, Auto, hoặc LangGraph từ LangChain. Trong trường hợp này, chúng tôi sẽ sử dụng Transformers Agents, một tính năng ít được biết đến trong gói Transformers cho phép bạn tạo ra các tác nhân riêng của mình.
Tạo ra một Công cụ Truy xuất
Tạo ra một Công cụ Truy xuất
Để tạo ra một công cụ truy xuất cho đường ống RAG có tác nhân, chúng ta định nghĩa một lớp RetrievalTool
với cấu trúc sau:
class RetrievalTool:
"""Using semantic similarity, retrieves some documents from the knowledge base that have the closest embeddings to the input."""
def __init__(self, vector_db):
self.vector_db = vector_db
def __call__(self, query: str) -> List[str]:
"""
Retrieve up to 7 most similar chunks from the vector DB for the given query.
Args:
query (str): A query to perform retrieval on. This should be semantically close to the target documents.
Returns:
List[str]: A list of up to 7 most similar chunks from the vector DB.
"""
results = self.vector_db.similarity_search(query, k=7)
return [chunk.page_content for chunk in results]
Lớp RetrievalTool
nhận một đối tượng vector_db
làm đầu vào, đây là bộ lưu trữ vector (ví dụ: Faiss, Chroma, Pinecone) được sử dụng để lưu trữ các embedding của tài liệu.
Phương thức __call__
của lớp nhận một chuỗi query
làm đầu vào và trả về một danh sách tối đa 7 phần tương tự nhất từ bộ vector DB. Nó sử dụng phương thức similarity_search
của đối tượng vector_db
để tìm các phần tương tự nhất dựa trên độ tương tự cosin.
Công cụ truy xuất này sau đó có thể được sử dụng như một phần của đường ống RAG có tác nhân, nơi tác nhân có thể phân tích truy vấn ban đầu, định dạng lại nó và chuyển nó qua công cụ truy xuất để lấy các phần liên quan nhất từ cơ sở kiến thức.
Tích hợp Mô hình Ngôn ngữ
Tích hợp Mô hình Ngôn ngữ
Để tích hợp mô hình ngôn ngữ vào đường ống RAG có tác nhân, chúng ta cần thiết lập LLM sẽ được sử dụng cả bởi tác nhân và để tạo ra phản hồi cuối cùng. Chúng ta có hai lựa chọn:
-
Sử dụng Hugging Face Engine: Điều này cho phép chúng ta gọi trực tiếp các điểm cuối API của các LLM khác nhau có sẵn thông qua kiến trúc không máy chủ của Hugging Face. Chúng ta có thể sử dụng các mô hình như Llama 38B hoặc 70B, nhưng những cái này thường yêu cầu một gói đăng ký Hugging Face Pro.
-
Sử dụng OpenAI: Trong ví dụ này, chúng ta sẽ sử dụng động cơ OpenAI. Quy trình có thể được điều chỉnh để thiết lập bất kỳ LLM nào khác.
Để thiết lập động cơ OpenAI, chúng ta tạo ra một lớp gọi là OpenAIEngine
sử dụng các hàm message_rle
và gpt_generate_message_list
từ động cơ LLM của Transformer Agents. Lớp này xử lý việc làm sạch các tin nhắn đầu vào và sử dụng điểm cuối hoàn thành trò chuyện của OpenAI để tạo ra các phản hồi.
Tiếp theo, chúng ta tạo ra tác nhân thực sự. Tác nhân có quyền truy cập vào công cụ truy xuất mà chúng ta đã tạo trước đó, LLM mà chúng ta muốn sử dụng (trong trường hợp này là OpenAIEngine
) và số lần lặp lại tối đa mà chúng ta muốn tác nhân thực hiện trước khi dừng vòng lặp có tác nhân.
Chúng tôi cũng cung cấp một lời nhắc hệ thống cho tác nhân, cung cấp cho nó hướng dẫn về cách sử dụng thông tin trong cơ sở kiến thức để cung cấp một câu trả lời toàn diện cho câu hỏi của người dùng. Lời nhắc khuyến khích tác nhân thử lại quá trình truy xuất với các truy vấn khác nhau nếu nó không thể tìm thấy thông tin cần thiết.
Với tác nhân và LLM được thiết lập, bây giờ chúng ta có thể chạy vòng lặp có tác nhân để trả lời các câu hỏi của người dùng. Tác nhân sẽ lặp đi lặp lại để định dạng lại truy vấn, truy xuất thông tin liên quan từ cơ sở kiến thức và tạo ra phản hồi cuối cùng bằng cách sử dụng LLM. Cách tiếp cận này dẫn đến các câu trả lời chi tiết và liên quan hơn so với đường ống RAG tiêu chuẩn.
Triển khai Đại lý Agentic
Triển khai Đại lý Agentic
Để triển khai tác nhân có tác nhân, chúng tôi sẽ sử dụng tính năng Transformers Agents trong gói Transformers. Điều này cung cấp một cách tiếp cận có mô-đun và rõ ràng để tạo ra các tác nhân tùy chỉnh.
Đầu tiên, chúng tôi cần cài đặt các gói cần thiết, bao gồm pandas, Langchain, gói Langchain Community, Sentence Transformers và Transformers Agents.
Tiếp theo, chúng tôi nhập các mô-đun và gói cần thiết. Chúng tôi sẽ
Câu hỏi thường gặp
Câu hỏi thường gặp

