Giới Thiệu
Tăng cường sinh bằng truy xuất (Retrieval-Augmented Generation, RAG) là một phương pháp cải thiện các mô hình ngôn ngữ lớn (LLM) bằng cách xây dựng kết quả đầu liệu của chúng dựa trên các nguồn kiến thức bên ngoài. Thay vì chỉ dựa vào nội dung mà mô hình ghi nhớ trong quá trình huấn luyện (có thể đã lỗi thời hoặc hạn chế), các hệ thống RAG truy xuất các tài liệu hoặc dữ liệu liên quan từ kho kiến thức và cung cấp ngữ cảnh cho LLM trong quá trình sinh. Điều này cho phép mô hình tạo ra các phản hồi chính xác, cập nhật và đặc thù ngành mà không cần tinh chỉnh rộng rãi.
Một đường ống RAG tiêu chuẩn thường bao gồm hai thành phần chính: mô-đun truy xuất thông tin (thường sử dụng embedding và cơ sở dữ liệu vector) và mô-đun sinh (LLM). Ví dụ, khi nhận một truy vấn từ người dùng, hệ thống tạo embedding cho truy vấn đó, tìm các vector tương tự (tài liệu) trong kho kiến thức, sau đó gửi các đoạn truy xuất được cùng với truy vấn đến LLM để tạo ra câu trả lời có ngữ cảnh.
Hạn Chế Của RAG Truyền Thống
Tuy nhiên, RAG truyền thống có những hạn chế nhất định. Nó thường tuân theo quy trình làm việc tuyến tính tĩnh: một bước truy xuất theo sau bởi một bước sinh duy nhất. Nếu bước truy xuất ban đầu không tìm thấy thông tin hữu ích, thì câu trả lời cuối cùng rất có thể sẽ không như ý. Ngoài ra, RAG thông thường sử dụng nguyên văn truy vấn của người dùng để tìm kiếm tương đồng, điều này có thể không tối ưu nếu cách diễn đạt truy vấn khác với tài liệu liên quan.
Các hệ thống RAG truyền thống cũng không có cơ chế tích hợp để suy luận, lập kế hoạch hoặc điều chỉnh chiến lược. Do đó, chúng gặp khó khăn với các truy vấn phức tạp hoặc nhiều bước, có thể yêu cầu tìm kiếm từ nhiều nguồn, sử dụng các công cụ khác nhau, hoặc cải tiến lặp đi lặp lại. Trong thực tế, điều này có nghĩa là các hệ thống RAG tiêu chuẩn có thể gặp lỗi với các câu hỏi mơ hồ, đa chiều hoặc trong các tác vụ với nguồn dữ liệu động.
Agent RAG: Tiến Trình Tiếp Theo
Chào mừng đến với thế giới của Agent RAG - một范式 thế hệ tiếp theo, tích hợp các tác nhân AI vào đường ống RAG để vượt qua những thách thức này. Một hệ thống Agent RAG cung cấp cho LLM khả năng tự chủ: khả năng quyết định hành động, chẳng hạn như khi nào truy xuất thông tin, truy xuất cái gì, cách tích hợp kết quả, và thậm chí khi nào yêu cầu làm rõ.
Bằng cách kết hợp các nguyên tắc của hệ thống dựa trên tác nhân (ví dụ: lập kế hoạch, sử dụng công cụ và tự cải tiến), Agent RAG hỗ trợ các quy trình truy xuất thích ứng và thông minh hơn. Bài viết này sẽ khám phá sự khác biệt giữa Agent RAG và RAG tiêu chuẩn, đi sâu vào kiến trúc của nó, và cung cấp chi tiết về việc triển khai. Chúng ta cũng sẽ nghiên cứu các trường hợp sử dụng trong thực tế, thảo luận các yếu tố hiệu suất, và tóm tắt những thách thức và xu hướng tương lai.
Sự Khác Biệt Giữa Agent RAG và RAG Tiêu Chuẩn
Agent RAG được xây dựng dựa trên nền tảng của RAG tiêu chuẩn, nhưng giới thiệu khả năng ra quyết định tự chủ trong quá trình truy xuất và sinh. Trước hết, việc trực quan hóa đường ống RAG tiêu chuẩn và sau đó so sánh nó với phương pháp dựa trên tác nhân sẽ rất hữu ích.
Trong một hệ thống RAG thông thường, quá trình này là trực tiếp và phản ứng: với mỗi truy vấn, truy xuất một lần và sinh một lần. Ngược lại, đường ống Agent RAG chèn một tác nhân thông minh có thể điều khiển và sắp xếp các bước này một cách năng động. Tác nhân (thường là chính LLM với các chỉ định đặc biệt) có thể quyết định có nên, khi nào và như thế nào để truy xuất thông tin, có thể thực hiện nhiều chu trình truy xuất-sinh, hoặc sử dụng các công cụ khác ngoài kho lưu trữ vector.
Các khác biệt chính giữa RAG tiêu chuẩn và Agent RAG bao gồm:
- Quy trình làm việc: RAG tiêu chuẩn tuân theo chu trình truy xuất và sinh một lần cố định. Agent RAG sử dụng quy trình làm việc linh hoạt, lặp lại được hướng dẫn bởi suy luận của tác nhân. Tác nhân có thể thực hiện nhiều bước truy xuất/sinh, phân tách vấn đề, hoặc thay đổi chiến lược giữa chừng.
- Ra quyết định và thích ứng: Trong RAG tiêu chuẩn, hệ thống luôn truy xuất rồi dừng lại, không có khái niệm kiểm tra xem câu trả lời đã đủ tốt chưa. Một hệ thống tác nhân là thích ứng: tác nhân có thể đánh giá kết quả trung gian và quyết định truy xuất thêm thông tin hoặc sử dụng công cụ khác nếu ngữ cảnh hiện tại dường như không đủ.
- Sử dụng công cụ và nguồn dữ liệu: RAG truyền thống thường kết nối LLM với một nguồn kiến thức duy nhất (ví dụ: một cơ sở dữ liệu tài liệu vector). Agent RAG linh hoạt hơn nhiều: tác nhân có thể tận dụng nhiều cơ sở kiến thức và công cụ. Ví dụ, tác nhân có thể truy xuất từ chỉ mục tài liệu riêng, gọi API tìm kiếm web để lấy thông tin bên ngoài, hoặc thậm chí sử dụng máy tính hoặc API khác - tất cả trong một phiên làm việc.
- Tự phản ánh và độ chính xác: Mô hình RAG tiêu chuẩn không tự xác minh câu trả lời của mình; tính đúng sai do người dùng hoặc nhà phát triển quyết định. Agent RAG có thể kết hợp tự phản ánh và vòng lặp phản hồi. Ví dụ, sau khi truy xuất ngữ cảnh và soạn thảo câu trả lời, tác nhân có thể kiểm tra xem câu hỏi đã được trả lời đầy đủ chưa, hoặc có khoảng trống nào không, rồi quyết định lấy thêm thông tin hoặc cải thiện truy vấn.
- Khả năng mở rộng và độ phức tạp: Vì Agent RAG có thể liên quan đến nhiều tác nhân và công cụ làm việc cùng nhau, nó có khả năng mở rộng cao hơn - xử lý nhiều loại truy vấn và nguồn dữ liệu hơn. Tuy nhiên, cái giá phải trả là tăng độ phức tạp của hệ thống.
- Đa phương thức: RAG truyền thống thường xử lý truy xuất dựa trên văn bản. Agent RAG có các tác nhân LLM tiên tiến có thể kết hợp dữ liệu đa phương thức. Nhờ các LLM đa phương thức gần đây, ngoài văn bản, tác nhân còn có thể truy xuất và suy luận về hình ảnh, âm thanh hoặc các loại dữ liệu khác.
Khám Phá Kiến Trúc Agent RAG
Bây giờ, chúng ta hãy đi sâu vào kiến trúc của các hệ thống Agent RAG. Ở cấp độ cao, kiến trúc Agent RAG giới thiệu một lớp tác nhân trên các thành phần truy xuất và sinh thông thường. Lớp tác nhân này có thể được thực hiện như một tác năng mạnh mẽ duy nhất, hoặc như một tập hợp các tác năng chuyên biệt làm việc cùng nhau (hệ thống đa tác nhân).
Trong kiến trúc Agent RAG một tác nhân, tác nhân đóng vai trò một bộ định tuyến hoặc bộ điều khiển thông minh cho quy trình làm việc truy vấn. Các thành phần liên quan bao gồm:
- Truy vấn người dùng: Câu hỏi hoặc tác vụ được đưa ra bằng ngôn ngữ tự nhiên.
- Tác nhân (LLM): Một LLM (hoặc kết hợp LLM với một số logic lập trình) được thiết kế để quyết định hành động. Tác nhân này có thể truy cập một hoặc nhiều công cụ - ví dụ: công cụ tra cứu cơ sở dữ liệu vector, công cụ tìm kiếm web, v.v.
- Nguồn kiến thức/Công cụ: Các công cụ có thể bao gồm cơ sở dữ liệu vector (dùng cho truy xuất tài liệu dựa trên embedding), công cụ tìm kiếm từ khóa, API (ví dụ: API thời tiết, máy tính, giao diện cơ sở dữ liệu SQL), hoặc thậm chí các tác nhân phụ thuộc.
- Mô hình sinh: Cuối cùng là bước sinh của LLM. Trong nhiều triển khai, chính tác nhân là LLM tạo ra câu trả lời (sau khi thu thập đủ thông tin).
Quy trình trong hệ thống một tác nhân thường diễn ra như sau (đối với một truy vấn nhất định):
- Quyết định của tác nhân - nhu cầu truy xuất: Tác nhân kiểm tra truy vấn (nếu có nhiều vòng, có thể kiểm tra cả ngữ hội thoại cho đến nay) và quyết định có cần thông tin bên ngoài hay không.
- Quyết định của tác nhân - chọn công cụ/nguồn dữ liệu: nếu cần truy xuất, tác nhân sẽ chọn công cụ hoặc nguồn dữ liệu sẽ sử dụng.
- Soạn thảo truy vấn truy xuất: Tác nhân soạn thảo truy vấn, đưa nó vào công cụ truy xuất đã chọn.
- Truy xuất và quan sát: Công cụ truy xuất (ví dụ: tìm kiếm vector) trả về một số tài liệu hoặc dữ liệu ứng cử viên. Tác nhân "quan sát" các kết quả này.
- Sinh câu trả lời: Khi tác nhân thu thập đủ thông tin hỗ trợ (hoặc xác định việc truy xuất không hữu ích), nó sẽ sử dụng LLM để tạo ra câu trả lời cuối cùng.
Trong mã hoặc giả mã, một vòng lặp tác nhân đơn giản hóa có thể trông như thế này:
while True:
hanh_dong = tac_nen.lap_ke_hoach(buoc_tiep_theo, van_de_hien_tai)
if hanh_dong.loai == "TIM_KIEM":
cong_cu = hanh_dong.chon_cong_cu # ví dụ: "CSDLVector" hoặc "TimKiemWeb"
truy_van = hanh_dong.soan_thao_truy_van
ket_qua = cong_cu.chay(truy_van)
tac_nen.quan_sat(ket_qua)
elif hanh_dong.loai == "TRA_LOI":
cau_tra_loi_cuoi_cung = tac_nen.sinh_cau_tra_loi(van_de_hien_tai)
break
Vòng lặp này sẽ tiếp tục cho đến khi tác nhân quyết định nó đã sẵn sàng để xuất ra một câu trả lời (hoặc đạt đến giới hạn số bước tối đa vì lý do bảo mật).
Chi Tiết Triển Khai
Để xây dựng một hệ thống Agent RAG, chúng ta sẽ làm theo một quy trình từng bước với các đoạn mã. Chúng ta sẽ giả định bạn có kiến thức về Python và các framework AI phổ biến. Trong ví dụ này, chúng ta sẽ sử dụng LangChain, một framework nguồn mở để xây dựng các ứng dụng LLM.
Xây dựng kho kiến thức truy xuất
Đầu tiên, bạn cần một kho kiến thức để truy xuất - thường là một kho lưu trữ vector cho tài liệu. Phần này về cơ bản giống với thiết lập RAG tiêu chuẩn. Bạn sẽ chuẩn bị một ngữ liệu dữ liệu văn bản (tài liệu, bài viết wiki, pdf, v.v.), chia chúng thành các đoạn, tạo embedding cho chúng và lập chỉ mục chúng trong một cơ sở dữ liệu vector (FAISS, Chroma, Weaviate, Qdrant, v.v.).
from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import FAISS # Giả sử chúng ta có một danh sách các tài liệu (chuỗi) trong danh_sach_tai_lieu bo_cat_van_ban = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) tai_lieu = bo_cat_van_ban.create_documents(danh_sach_tai_lieu) # Tạo embedding và lập chỉ mục trong FAISS mo_hinh_embedding = OpenAIEmbeddings() # sử dụng embedding OpenAI (cần khóa API) kho_luu_tru_vector = FAISS.from_documents(tai_lieu, mo_hinh_embedding)
Định nghĩa công cụ cho Tác nhân
Tiếp theo, chúng ta định nghĩa các công cụ mà tác nhân có thể sử dụng. Ít nhất, chúng ta sẽ có một công cụ truy xuất để gói gọi đến kho lưu trữ vector. Chúng ta cũng có thể thêm các công cụ khác - để minh họa, hãy bao gồm một công cụ tìm kiếm web.
from langchain.agent import Tool
# Định nghĩa hàm để truy vấn kho vector
def tim_kiem_vector(truy_van: str) -> str:
"""Tìm kiếm CSDL vector để lấy tài liệu liên quan và trả về chuỗi đã nối của kết quả."""
ket_qua = kho_luu_tru_vector.similarity_search(truy_van, k=3)
# Nối nội dung của các tài liệu đã truy xuất (có thể có metadata hoặc định dạng đoạn trích)
return "\n".join([doc.page_content for doc in ket_qua])
# Tạo công cụ truy xuất
cong_cu_truy_xuat = Tool(
name="CSDLVector",
func=tim_kiem_vector,
description="Truy xuất các tài liệu liên quan từ cơ sở kiến thức."
)
# (Tùy chọn) Định nghĩa công cụ thứ hai, ví dụ: tìm kiếm web
def tim_kiem_web(truy_van: str) -> str:
# Đây là một chỗ chứa cho một cuộc gọi API tìm kiếm web thực tế.
# Trong thực tế, sử dụng API như SerpAPI hoặc Bing API.
return gia_mao_tim_kiem_web(truy_van)
cong_cu_tim_kiem = Tool(
name="TimKiemWeb",
func=tim_kiem_web,
description="Tìm kiếm web để lấy thông tin cập nhật."
)
Khởi tạo Tác nhân
Bây giờ chúng ta thiết lập tác nhân chính. Chúng ta chọn một LLM để cung cấp sức mạnh suy luận cho tác nhân - ví dụ: mô hình GPT-4 của OpenAI hoặc LLM cục bộ. Sau đó, chúng ta khởi tạo một tác nhân có thể truy cập các công cụ đã định nghĩa ở trên.
from langchain.chat_models import ChatOpenAI
from langchain.agents import initialize_agent
# Khởi tạo mô hình ngôn ngữ cho tác nhân (sử dụng mô hình chat trong trường hợp này)
mo_hinh_llm = ChatOpenAI(model_name="gpt-4", temperature=0) # hoặc LLM khác
# Tạo tác nhân với các công cụ. Chúng ta sử dụng cài đặt verbose để quan sát quá trình suy nghĩ của nó.
tac_nen = initialize_agent(
tools=[cong_cu_truy_xuat, cong_cu_tim_kiem],
llm=mo_hinh_llm,
agent="zero-shot-react-description", # Yêu cầu LangChain sử dụng tác nhân dựa trên ReAct
verbose=True
)
Đặt câu hỏi (Tác nhân trong hành động)
Tác nhân của chúng ta đã sẵn sàng, bây giờ chúng ta có thể đưa ra một truy vấn từ người dùng và nhận được câu trả lời:
truy_van = "Những khác biệt chính giữa RAG tiêu chuẩn và Agent RAG là gì?"
phan_hoi = tac_nen.run(truy_van)
print("Câu trả lời của tác nhân:", phan_hoi)
Trong quá trình thực hiện, tác nhân sẽ quyết định nội bộ cách trả lời câu hỏi. Rất có thể, nó sẽ首先 sử dụng công cụ CSDLVector, và truy vấn với một câu hỏi được soạn thảo lại như "sự khác biệt giữa RAG tiêu chuẩn và Agent RAG".
So Sánh Hiệu Suất và Khả Năng Mở Rộng
Khi độ phức tạp của Agent RAG tăng lên, một câu hỏi tự nhiên là: ảnh hưởng đến hiệu suất là gì? Chúng ta có đạt được lợi ích có đo lường được không? Câu trả lời phụ thuộc vào khía cạnh hiệu suất chúng ta đang xem xét - chất lượng câu trả lời, độ trễ/throughput và khả năng mở rộng mỗi khía cạnh bị ảnh hưởng khác nhau.
- Chất lượng câu trả lời và tỷ lệ thành công: Động lực chính của Agent RAG là tăng tỷ lệ thành công cho các truy vấn phức tạp. Bằng cho phép nhiều lần thử truy xuất và công thức truy vấn thông minh hơn, Agent RAG có thể tìm thấy thông tin liên quan mà RAG một lần có thể bỏ lỡ. Về mặt thực nghiệm, điều này thường dẫn đến độ chính xác câu trả lời cao hơn, giảm "tôi không biết" hoặc câu trả lời ảo.
- Chi phí tính toán và độ trễ: Agent RAG về bản chất là tài nguyên tập trung. Gọi LLM tác nhân để suy luận trong nhiều bước có nghĩa là nhiều lần gọi LLM (mỗi lần sử dụng công cụ thường yêu cầu suy nghĩ LLM trước và sau) và nhiều hoạt động truy xuất hơn. Điều này làm tăng độ trễ cho mỗi truy vấn và cũng làm tăng chi phí tính toán (nếu sử dụng LLM qua API).
- Khả năng mở rộng nguồn dữ liệu: Mặt tích cực là Agent RAG có thể mở rộng đến hệ sinh thái dữ liệu phong phú hơn. Vì nó có thể điều phối nhiều nguồn, bạn có thể liên tục thêm công cụ/chỉ mục vào kho vũ khí của tác nhân để mở rộng kiến thức của nó.
Thách Thức và Tương Lai Của Agent RAG
Mặc dù Agent RAG rất mạnh mẽ, nhưng chúng không không có thách thức. Khi thiết kế và triển khai các hệ thống này, chúng ta phải nhận thức được những hạn chế này. Đồng thời, tương lai của Agent RAG rất đáng phấn khích, với các nghiên cứu tích cực và phát triển nhanh chóng đang giải quyết nhiều vấn đề này.
Thách thức chính:
- Độ phức tạp và khả năng gỡ lỗi: Như đã đề cập, các hệ thống Agent RAG phức tạp hơn các đường ống tiêu chuẩn. Quản lý nhiều tác nhân hoặc công cụ và tương tác của chúng có thể khó khăn.
- Độ trễ và chi phí: Bản chất lặp lại làm tăng chi phí suy luận. Điều này có thể là rào cản với các ứng dụng thời gian thực hoặc ứng dụng ngân sách hạn chế.
- Chất lượng dữ liệu và giới hạn kiến thức: RAG và Agent RAG phụ thuộc rất nhiều vào chất lượng dữ liệu cơ bản. Nếu kho kiến thức không đầy đủ hoặc chứa lỗi/định kiến, tác nhân có thể truy xuất thông tin gây hiểu lầm, sau đó sử dụng nó một cách tự tin, làm phức tạp hóa lỗi.
- An ninh và đạo đức: Với quyền tự chủ lớn hơn, nếu không được sandbox hóa đúng cách, tác nhân có thể thực hiện các hoạt động không mong muốn. Ví dụ, nếu được cung cấp một công cụ có thể thực thi mã hoặc gửi yêu cầu, nó nên có ràng buộc để ngăn lạm dụng.
Xu hướng và phát triển tương lai:
- Các framework tác nhân tốt hơn: Chúng ta kỳ vọng thấy các framework trưởng thành hơn, giúp việc xây dựng và ràng buộc tác nhân trở nên dễ dàng hơn. Ví dụ, thư viện Autogen của Microsoft cho phép định nghĩa các cuộc hội thoại đa tác nhân và sử dụng công cụ có cấu trúc hơn.
- Tích hợp thuật toán lập kế hoạch: Có nghiên cứu đang kết hợp lập kế hoạch cổ điển hoặc học tăng cường với các tác nhân dựa trên LLM. Agent RAG có thể được hưởng lợi từ các thuật toán lập kế hoạch không-LLM để quyết định trình tự truy xuất một cách hệ thống hơn.
- Học từ phản hồi: Hiện tại, hầu hết các tác nhân được tạo ra thủ công bằng cách sử dụng prompt. Tương lai, chúng ta có thể thấy các tác nhân dựa trên học, trong đó chiến lược tác nhân được tinh chỉnh dựa trên phản hồi hoặc minh họa.
- Đa phương thức và suy luận đa bước: Khi LLM có được khả năng đa phương thức, Agent RAG có thể mở rộng sang các phương thức này. Chúng ta có thể thấy một tác nhân có thể truy xuất hình ảnh hoặc biểu đồ làm ngữ cảnh và tích hợp chúng vào câu trả lời.
- Tích hợp với đồ thị kiến thức và AI biểu tượng: Một xu hướng khác là kết hợp các tác nhân LLM với đồ thị kiến thức hoặc cơ sở dữ liệu để có thêm suy luận dựa trên kiến thức. Agent RAG có thể sử dụng đồ thị kiến thức để xác minh tính nhất quán của câu trả lời.
Kết Luận
Agent RAG đại diện cho một bước tiến lớn so với các mô hình tăng cường sinh tiêu chuẩn, tiêm vào đường ống sự thích ứng và thông minh cần thiết. Bằng cách trao cho LLM khả năng lập kế hoạch, gọi công cụ và lặp lại, chúng ta nhận được các hệ thống có thể xử lý các truy vấn phức tạp hơn, tích hợp liền mạch nhiều nguồn dữ liệu và không ngừng tự cải thiện kết quả của chúng.
Agent RAG đẩy ranh giới của các hệ thống AI, không chỉ có thể tạo ra câu trả lời từ thông tin được truy xuất, mà còn có thể quản lý toàn bộ quy trình truy xuất-sinh một cách thông minh. Đối với các kỹ sư AI/học máy, việc nắm vững mô hình này mở ra khả năng xây dựng các trợ lý và ứng dụng thông minh mà trước đây không thể tưởng tượng được - những trợ lý và ứng dụng có thể thực sự tự chủ nghiên cứu, suy luận và phản hồi.