Thủ thuật
Tối ưu hóa ứng dụng AI với các kỹ thuật truy xuất linh hoạt từ LangChain
(giờ Việt Nam)
Tóm tắt AI
LangChain cung cấp đa dạng phương thức truy xuất từ ngữ nghĩa đến hỗn hợp, giúp nhà phát triển dễ dàng xây dựng các ứng dụng AI cá nhân hóa dựa trên dữ liệu riêng.
Bản dịch AI

TL;DR: Chúng tôi đang điều chỉnh các lớp trừu tượng (abstractions) của mình để giúp các phương thức truy xuất khác ngoài đối tượng LangChain VectorDB có thể được sử dụng dễ dàng hơn trong LangChain. Việc này được thực hiện với mục tiêu: (1) cho phép các bộ truy xuất (retrievers) được xây dựng ở nơi khác có thể được sử dụng trong LangChain một cách thuận tiện hơn, (2) khuyến khích thử nghiệm nhiều hơn với các phương thức truy xuất thay thế (như tìm kiếm kết hợp - hybrid search). Thay đổi này có tính tương thích ngược, vì vậy tất cả các chuỗi (chains) hiện có vẫn sẽ hoạt động như trước. Tuy nhiên, chúng tôi khuyến nghị bạn nên cập nhật từ các chuỗi VectorDB sang các chuỗi Retrieval mới càng sớm càng tốt, vì đây sẽ là những chuỗi được hỗ trợ đầy đủ nhất trong tương lai.
Tài liệu Python
Tài liệu JS
Giới thiệu
Kể từ khi ChatGPT ra đời, mọi người đã bắt đầu xây dựng các phiên bản ChatGPT cá nhân hóa cho dữ liệu của riêng họ. Chúng tôi thậm chí đã viết một bài hướng dẫn về vấn đề này và tổ chức một cuộc thi vài tháng trước. Mong muốn và nhu cầu này làm nổi bật một hạn chế quan trọng của ChatGPT - nó không biết về dữ liệu CỦA BẠN, và hầu hết mọi người sẽ thấy nó hữu ích hơn nếu nó làm được điều đó. Vậy làm thế nào để xây dựng một chatbot hiểu được dữ liệu của bạn?
Cách chính để thực hiện việc này là thông qua một quy trình thường được gọi là "Retrieval Augmented Generation" (Tạo lập có tăng cường truy xuất). Trong quy trình này, thay vì chỉ chuyển câu hỏi của người dùng trực tiếp đến mô hình ngôn ngữ, hệ thống sẽ "truy xuất" bất kỳ tài liệu nào có khả năng liên quan đến việc trả lời câu hỏi, sau đó chuyển các tài liệu đó (cùng với câu hỏi gốc) đến mô hình ngôn ngữ cho bước "tạo lập" (generation).
Cách chính mà hầu hết mọi người - bao gồm cả chúng tôi tại LangChain - đã và đang thực hiện truy xuất là sử dụng tìm kiếm ngữ nghĩa (semantic search). Trong quy trình này, một vectơ số (embedding) được tính toán cho tất cả các tài liệu, và các vectơ đó sau đó được lưu trữ trong một cơ sở dữ liệu vectơ (một cơ sở dữ liệu được tối ưu hóa để lưu trữ và truy vấn vectơ). Các truy vấn đến cũng được vectơ hóa, và các tài liệu được truy xuất là những tài liệu gần với truy vấn nhất trong không gian embedding. Chúng tôi sẽ không đi sâu vào chi tiết ở đây - nhưng đây là một bài hướng dẫn chuyên sâu hơn về chủ đề này, và bên dưới là sơ đồ tóm tắt lại quy trình một cách trực quan.

Các vấn đề
Quy trình này hoạt động khá hiệu quả, và rất nhiều thành phần cũng như lớp trừu tượng mà chúng tôi đã xây dựng (embeddings, vectorstores) đều nhằm mục đích hỗ trợ quy trình này.
Nhưng chúng tôi đã nhận thấy hai vấn đề.
Thứ nhất: có rất nhiều biến thể khác nhau trong cách bạn thực hiện bước truy xuất này. Mọi người muốn làm nhiều thứ hơn là chỉ tìm kiếm ngữ nghĩa. Cụ thể là:
Thứ hai: chúng tôi cũng nhận ra rằng mọi người có thể xây dựng một bộ truy xuất bên ngoài LangChain - ví dụ như OpenAI đã phát hành ChatGPT Retrieval Plugin của họ. Chúng tôi muốn giúp người dùng sử dụng bất kỳ bộ truy xuất nào họ đã tạo trong LangChain một cách dễ dàng nhất có thể.
Chúng tôi nhận ra mình đã mắc sai lầm - bằng cách tập trung các lớp trừu tượng vào VectorDBQA, chúng tôi đã hạn chế việc sử dụng các chuỗi của mình, khiến chúng trở nên khó sử dụng (1) đối với những người dùng muốn thử nghiệm với các phương thức truy xuất khác, (2) đối với những người dùng đã tạo bộ truy xuất bên ngoài hệ sinh thái LangChain.
Giải pháp
Vậy chúng tôi đã khắc phục điều này như thế nào?
Trong các bản phát hành Python và TypeScript gần đây nhất, chúng tôi đã:
Mở rộng giao diện Retriever:
Tất cả những điều này được thực hiện với mục tiêu cuối cùng là giúp các bộ truy xuất thay thế (ngoài LangChain VectorStore) có thể được sử dụng dễ dàng hơn trong các chuỗi và tác nhân (agents), đồng thời khuyến khích sự đổi mới trong các phương thức truy xuất thay thế.
Hỏi & Đáp
H: Sự khác biệt giữa chỉ mục (index) và bộ truy xuất (retriever) là gì?
Đ: Chỉ mục là một cấu trúc dữ liệu hỗ trợ tìm kiếm hiệu quả, còn bộ truy xuất là thành phần sử dụng chỉ mục đó để tìm và trả về các tài liệu liên quan nhằm phản hồi truy vấn của người dùng. Chỉ mục là thành phần chính mà bộ truy xuất dựa vào để thực hiện chức năng của nó.
H: Nếu trước đây tôi đã sử dụng VectorStore trong chuỗi VectorDBQA (hoặc các chuỗi kiểu VectorDB khác), thì bây giờ tôi sử dụng gì trong chuỗi RetrievalQA?
Đ: Bạn có thể sử dụng VectorStoreRetriever, thứ mà bạn có thể tạo từ một vectorstore hiện có bằng cách thực hiện vectorstore.as_retriever.
H: Chuỗi VectorDBQA (hoặc các chuỗi kiểu VectorDB khác) có còn tồn tại không?
Đ: Có, mặc dù chúng tôi sẽ không tập trung vào nó nữa. Mọi sự phát triển trong tương lai sẽ được thực hiện trên chuỗi RetrievalQA.
H: Tôi có thể đóng góp một phương thức truy xuất mới cho thư viện không?
Đ: Có! Chúng tôi đã bắt đầu một module langchain/retrievers mới dành riêng cho mục đích này.
H: Những ví dụ thực tế nào mà điều này cho phép thực hiện?
Đ: Ví dụ chính là khả năng trả lời câu hỏi tốt hơn dựa trên tài liệu của bạn. Tuy nhiên, nếu bạn bắt đầu nạp và sau đó truy xuất các tin nhắn trước đó, điều này có thể được coi là bộ nhớ dài hạn tốt hơn cho AI.
Bài viết được AI dịch và tổng hợp tự động từ LangChain: Blog. Liên kết bài gốc ở phía trên. Dữ liệu đồng bộ qua API công khai được ghi nguồn tại AI HOT (canonical) ↗. AIHOT.vn luôn dẫn nguồn đầy đủ — nếu bạn thấy điểm cần chỉnh sửa, hãy gửi ý kiến tại trang phản hồi.