Giới thiệu Truy xuất Ngữ cảnh

Anthropic giới thiệu Truy xuất Ngữ cảnh, một tính năng mới được thiết kế để cải thiện khả năng hiểu và sử dụng ngữ cảnh của các mô hình AI.

  • 15 min read
Anthropic giới thiệu Truy xuất Ngữ cảnh, một tính năng mới được thiết kế để cải thiện khả năng hiểu và sử dụng ngữ cảnh của các mô hình AI.

Giới thiệu về Contextual Retrieval (Truy xuất Ngữ cảnh)

Để mô hình AI hữu ích trong các ngữ cảnh cụ thể, nó thường cần truy cập kiến thức nền. Ví dụ, chatbot hỗ trợ khách hàng cần kiến thức về doanh nghiệp cụ thể mà chúng đang hoạt động, và các bot phân tích pháp lý cần biết về vô số các vụ án trước đây.

Các nhà phát triển thường nâng cao kiến thức của mô hình AI bằng Retrieval-Augmented Generation (RAG). RAG là một phương pháp truy xuất thông tin liên quan từ cơ sở kiến thức và bổ sung nó vào lời nhắc của người dùng, giúp cải thiện đáng kể phản hồi của mô hình. Vấn đề là các giải pháp RAG truyền thống loại bỏ ngữ cảnh khi mã hóa thông tin, điều này thường dẫn đến việc hệ thống không truy xuất được thông tin liên quan từ cơ sở kiến thức.

Trong bài viết này, chúng tôi phác thảo một phương pháp cải thiện đáng kể bước truy xuất trong RAG. Phương pháp này được gọi là “Contextual Retrieval” và sử dụng hai kỹ thuật phụ: Contextual Embeddings (Nhúng Ngữ cảnh) và Contextual BM25. Phương pháp này có thể giảm 49% số lần truy xuất thất bại và, khi kết hợp với việc sắp xếp lại thứ tự (reranking), giảm tới 67%. Đây là những cải tiến đáng kể về độ chính xác truy xuất, điều này trực tiếp chuyển thành hiệu suất tốt hơn trong các tác vụ hạ nguồn.

Bạn có thể dễ dàng triển khai giải pháp Contextual Retrieval của riêng mình với Claude bằng cookbook của chúng tôi.


Ghi chú về việc chỉ sử dụng lời nhắc dài hơn

Đôi khi giải pháp đơn giản nhất là tốt nhất. Nếu cơ sở kiến thức của bạn nhỏ hơn 200.000 token (khoảng 500 trang tài liệu), bạn có thể chỉ cần bao gồm toàn bộ cơ sở kiến thức trong lời nhắc bạn cung cấp cho mô hình, không cần RAG hoặc các phương pháp tương tự.

Vài tuần trước, chúng tôi đã phát hành prompt caching cho Claude, giúp phương pháp này nhanh hơn và tiết kiệm chi phí hơn đáng kể. Giờ đây, các nhà phát triển có thể lưu vào bộ nhớ cache các lời nhắc được sử dụng thường xuyên giữa các lệnh gọi API, giảm độ trễ > 2 lần và chi phí lên tới 90% (bạn có thể xem cách hoạt động bằng cách đọc cookbook prompt caching của chúng tôi).

Tuy nhiên, khi cơ sở kiến thức của bạn phát triển, bạn sẽ cần một giải pháp có khả năng mở rộng hơn. Đó là lúc Contextual Retrieval xuất hiện.

Tổng quan về RAG: Mở rộng quy mô cho các cơ sở kiến thức lớn hơn

Đối với các cơ sở kiến thức lớn hơn không vừa với cửa sổ ngữ cảnh, RAG là giải pháp điển hình. RAG hoạt động bằng cách tiền xử lý cơ sở kiến thức theo các bước sau:

  1. Chia nhỏ cơ sở kiến thức (tập hợp các tài liệu) thành các đoạn văn bản nhỏ hơn, thường không quá vài trăm token.
  2. Sử dụng mô hình nhúng để chuyển đổi các đoạn văn bản này thành các vector nhúng mã hóa ý nghĩa.
  3. Lưu trữ các vector nhúng này trong cơ sở dữ liệu vector cho phép tìm kiếm theo sự tương đồng ngữ nghĩa.

Khi chạy, khi người dùng nhập một truy vấn vào mô hình, cơ sở dữ liệu vector được sử dụng để tìm các đoạn văn bản liên quan nhất dựa trên sự tương đồng ngữ nghĩa với truy vấn. Sau đó, các đoạn văn bản liên quan nhất được thêm vào lời nhắc gửi đến mô hình tạo sinh.

Trong khi các mô hình nhúng xuất sắc trong việc nắm bắt các mối quan hệ ngữ nghĩa, chúng có thể bỏ lỡ các kết quả khớp chính xác quan trọng. May mắn thay, có một kỹ thuật cũ hơn có thể hỗ trợ trong các tình huống này. BM25 (Best Matching 25) là một hàm xếp hạng sử dụng khớp từ vựng để tìm các kết quả khớp từ hoặc cụm từ chính xác. Nó đặc biệt hiệu quả đối với các truy vấn bao gồm các định danh duy nhất hoặc các thuật ngữ kỹ thuật.

BM25 hoạt động dựa trên khái niệm TF-IDF (Term Frequency-Inverse Document Frequency - Tần suất thuật ngữ-Tần suất nghịch đảo tài liệu). TF-IDF đo lường mức độ quan trọng của một từ đối với một tài liệu trong một tập hợp. BM25 tinh chỉnh điều này bằng cách xem xét độ dài tài liệu và áp dụng hàm bão hòa cho tần suất thuật ngữ, giúp ngăn chặn các từ phổ biến chiếm ưu thế trong kết quả.

Đây là cách BM25 có thể thành công nơi các nhúng ngữ nghĩa thất bại: Giả sử người dùng truy vấn “Mã lỗi TS-999” trong cơ sở dữ liệu hỗ trợ kỹ thuật. Một mô hình nhúng có thể tìm thấy nội dung về mã lỗi nói chung, nhưng có thể bỏ lỡ kết quả khớp chính xác “TS-999”. BM25 tìm kiếm chuỗi văn bản cụ thể này để xác định tài liệu liên quan.

Các giải pháp RAG có thể truy xuất chính xác nhất các đoạn văn bản phù hợp nhất bằng cách kết hợp các kỹ thuật nhúng và BM25 theo các bước sau:

  1. Chia nhỏ cơ sở kiến thức (tập hợp các tài liệu) thành các đoạn văn bản nhỏ hơn, thường không quá vài trăm token.
  2. Tạo mã hóa TF-IDF và nhúng ngữ nghĩa cho các đoạn văn bản này.
  3. Sử dụng BM25 để tìm các đoạn văn bản hàng đầu dựa trên khớp chính xác.
  4. Sử dụng nhúng để tìm các đoạn văn bản hàng đầu dựa trên sự tương đồng ngữ nghĩa.
  5. Kết hợp và loại bỏ các bản sao của kết quả từ (3) và (4) bằng các kỹ thuật kết hợp xếp hạng.
  6. Thêm các đoạn văn bản top-K vào lời nhắc để tạo phản hồi.

Bằng cách tận dụng cả BM25 và mô hình nhúng, các hệ thống RAG truyền thống có thể cung cấp kết quả toàn diện và chính xác hơn, cân bằng giữa khớp thuật ngữ chính xác và hiểu ngữ nghĩa rộng hơn.

Cách tiếp cận này cho phép bạn mở rộng quy mô một cách hiệu quả về chi phí cho các cơ sở kiến thức khổng lồ, vượt xa những gì có thể vừa trong một lời nhắc duy nhất. Nhưng các hệ thống RAG truyền thống này có một hạn chế đáng kể: chúng thường phá hủy ngữ cảnh.

Vấn đề ngữ cảnh trong RAG truyền thống

Trong RAG truyền thống, các tài liệu thường được chia thành các đoạn nhỏ hơn để truy xuất hiệu quả. Mặc dù cách tiếp cận này hoạt động tốt cho nhiều ứng dụng, nó có thể dẫn đến các vấn đề khi các đoạn văn bản riêng lẻ thiếu ngữ cảnh đầy đủ.

Ví dụ, hãy tưởng tượng bạn có một bộ sưu tập thông tin tài chính (ví dụ: các hồ sơ SEC của Hoa Kỳ) được nhúng trong cơ sở kiến thức của bạn và bạn nhận được câu hỏi sau: “Tăng trưởng doanh thu của ACME Corp trong Q2 2023 là bao nhiêu?”

Một đoạn văn bản liên quan có thể chứa văn bản: “Doanh thu của công ty đã tăng 3% so với quý trước.” Tuy nhiên, đoạn văn bản này một mình không chỉ định nó đang đề cập đến công ty nào hoặc khoảng thời gian liên quan, khiến việc truy xuất thông tin chính xác hoặc sử dụng thông tin một cách hiệu quả trở nên khó khăn.

Giới thiệu về Contextual Retrieval

Contextual Retrieval giải quyết vấn đề này bằng cách thêm ngữ cảnh giải thích cụ thể cho từng đoạn văn bản vào đầu mỗi đoạn văn bản trước khi nhúng (“Contextual Embeddings”) và tạo chỉ mục BM25 (“Contextual BM25”).

Hãy quay lại ví dụ về bộ sưu tập hồ sơ SEC của chúng tôi. Đây là một ví dụ về cách một đoạn văn bản có thể được chuyển đổi:

contextualized_chunk = “This chunk is from an SEC filing on ACME corp’s performance in Q2 2023; the previous quarter’s revenue was $314 million. The company’s revenue grew by 3% over the previous quarter." Copy

Cần lưu ý rằng các phương pháp khác để sử dụng ngữ cảnh nhằm cải thiện truy xuất đã được đề xuất trong quá khứ. Các đề xuất khác bao gồm: thêm tóm tắt tài liệu chung vào các đoạn văn bản (chúng tôi đã thử nghiệm và thấy lợi ích rất hạn chế), nhúng tài liệu giả định, và lập chỉ mục dựa trên tóm tắt (chúng tôi đã đánh giá và thấy hiệu suất thấp). Các phương pháp này khác với những gì được đề xuất trong bài đăng này.

Triển khai Contextual Retrieval

Tất nhiên, sẽ tốn rất nhiều công sức để chú thích thủ công hàng nghìn hoặc thậm chí hàng triệu đoạn văn bản trong một cơ sở kiến thức. Để triển khai Contextual Retrieval, chúng ta dựa vào Claude. Chúng tôi đã viết một lời nhắc hướng dẫn mô hình cung cấp ngữ cảnh súc tích, đặc trưng cho từng đoạn văn bản, giải thích đoạn văn bản đó bằng cách sử dụng ngữ cảnh của toàn bộ tài liệu. Chúng tôi đã sử dụng lời nhắc Claude 3 Haiku sau đây để tạo ngữ cảnh cho mỗi đoạn văn bản:

Ngữ cảnh được tạo ra, thường từ 50-100 token, được thêm vào đầu đoạn văn bản trước khi nhúng và trước khi tạo chỉ mục BM25.

Luồng tiền xử lý trông như thế nào trong thực tế:

Nếu bạn quan tâm đến việc sử dụng Contextual Retrieval, bạn có thể bắt đầu với cookbook của chúng tôi.

Sử dụng Prompt Caching để giảm chi phí của Contextual Retrieval

Contextual Retrieval có thể đạt được với chi phí thấp một cách độc đáo với Claude, nhờ tính năng lưu vào bộ nhớ cache lời nhắc đặc biệt mà chúng tôi đã đề cập ở trên. Với prompt caching, bạn không cần phải truyền tài liệu tham chiếu cho mỗi đoạn văn bản. Bạn chỉ cần tải tài liệu vào bộ nhớ cache một lần và sau đó tham chiếu nội dung đã được lưu vào bộ nhớ cache trước đó. Giả sử các đoạn văn bản 800 token, tài liệu 8k token, hướng dẫn ngữ cảnh 50 token và 100 token ngữ cảnh cho mỗi đoạn, chi phí một lần để tạo các đoạn văn bản có ngữ cảnh là 1,02 đô la cho mỗi triệu token tài liệu.

Phương pháp luận

Chúng tôi đã thử nghiệm trên nhiều miền kiến thức khác nhau (cơ sở mã, tiểu thuyết, bài báo ArXiv, bài báo Khoa học), mô hình nhúng, chiến lược truy xuất và chỉ số đánh giá. Chúng tôi đã bao gồm một vài ví dụ về các câu hỏi và câu trả lời mà chúng tôi đã sử dụng cho mỗi miền trong Phụ lục II.

Các biểu đồ dưới đây cho thấy hiệu suất trung bình trên tất cả các miền kiến thức với cấu hình nhúng hiệu suất cao nhất (Gemini Text 004) và truy xuất top-20-chunks. Chúng tôi sử dụng 1 trừ recall@20 làm chỉ số đánh giá của mình, đo lường tỷ lệ phần trăm các tài liệu liên quan không được truy xuất trong top 20 đoạn văn bản. Bạn có thể xem toàn bộ kết quả trong phụ lục - việc thêm ngữ cảnh cải thiện hiệu suất trong mọi kết hợp nhúng-nguồn mà chúng tôi đã đánh giá.

Cải thiện hiệu suất

Các thí nghiệm của chúng tôi cho thấy rằng:

  • Contextual Embeddings giảm tỷ lệ thất bại truy xuất top-20-chunk xuống 35% (5,7% → 3,7%).
  • Kết hợp Contextual Embeddings và Contextual BM25 giảm tỷ lệ thất bại truy xuất top-20-chunk xuống 49% (5,7% → 2,9%).

Cân nhắc về triển khai

Khi triển khai Contextual Retrieval, có một vài điểm cần lưu ý:

  1. Ranh giới đoạn văn bản: Cân nhắc cách bạn chia tài liệu thành các đoạn văn bản. Lựa chọn kích thước đoạn văn bản, ranh giới đoạn văn bản và chồng lấp đoạn văn bản có thể ảnh hưởng đến hiệu suất truy xuất1.
  2. Mô hình nhúng: Mặc dù Contextual Retrieval cải thiện hiệu suất trên tất cả các mô hình nhúng chúng tôi đã thử nghiệm, một số mô hình có thể hưởng lợi nhiều hơn những mô hình khác. Chúng tôi thấy GeminiVoyage embeddings đặc biệt hiệu quả.
  3. Lời nhắc ngữ cảnh tùy chỉnh: Mặc dù lời nhắc chung mà chúng tôi cung cấp hoạt động tốt, bạn có thể đạt được kết quả tốt hơn nữa với các lời nhắc được tùy chỉnh cho miền hoặc trường hợp sử dụng cụ thể của bạn (ví dụ: bao gồm một bảng thuật ngữ các thuật ngữ chính có thể chỉ được định nghĩa trong các tài liệu khác trong cơ sở kiến thức).
  4. Số lượng đoạn văn bản: Thêm nhiều đoạn văn bản vào cửa sổ ngữ cảnh làm tăng cơ hội bạn bao gồm thông tin liên quan. Tuy nhiên, nhiều thông tin hơn có thể gây xao nhãng cho mô hình, vì vậy có một giới hạn cho điều này. Chúng tôi đã thử gửi 5, 10 và 20 đoạn văn bản, và thấy rằng việc sử dụng 20 là hiệu quả nhất trong số các tùy chọn này (xem phụ lục để so sánh) nhưng bạn nên thử nghiệm trên trường hợp sử dụng của mình.

Luôn chạy đánh giá: Việc tạo phản hồi có thể được cải thiện bằng cách chuyển đoạn văn bản có ngữ cảnh và phân biệt giữa nội dung nào là ngữ cảnh và nội dung nào là đoạn văn bản.

Tăng cường hiệu suất hơn nữa với Reranking

Trong bước cuối cùng, chúng ta có thể kết hợp Contextual Retrieval với một kỹ thuật khác để đạt được nhiều cải tiến hiệu suất hơn. Trong RAG truyền thống, hệ thống AI tìm kiếm cơ sở kiến thức của mình để tìm các đoạn văn bản có khả năng liên quan. Với các cơ sở kiến thức lớn, truy xuất ban đầu này thường trả về nhiều đoạn văn bản - đôi khi hàng trăm - với mức độ liên quan và tầm quan trọng khác nhau.

Reranking là một kỹ thuật lọc được sử dụng phổ biến để đảm bảo chỉ các đoạn văn bản liên quan nhất được gửi đến mô hình. Reranking cung cấp phản hồi tốt hơn và giảm chi phí cũng như độ trễ vì mô hình xử lý ít thông tin hơn. Các bước chính là:

  1. Thực hiện truy xuất ban đầu để lấy các đoạn văn bản có khả năng liên quan nhất (chúng tôi sử dụng top 150).
  2. Truyền top-N đoạn văn bản, cùng với truy vấn của người dùng, qua mô hình reranking.
  3. Sử dụng mô hình reranking, gán cho mỗi đoạn văn bản một điểm số dựa trên mức độ liên quan và tầm quan trọng của nó đối với lời nhắc, sau đó chọn top-K đoạn văn bản (chúng tôi sử dụng top 20).
  4. Truyền top-K đoạn văn bản vào mô hình làm ngữ cảnh để tạo kết quả cuối cùng.

Cải thiện hiệu suất

Có nhiều mô hình reranking trên thị trường. Chúng tôi đã chạy các bài kiểm tra của mình với Cohere reranker. Voyage cũng cung cấp reranker, mặc dù chúng tôi không có thời gian để kiểm tra nó. Các thí nghiệm của chúng tôi cho thấy, trên nhiều miền khác nhau, việc thêm bước reranking sẽ tối ưu hóa truy xuất hơn nữa.

Cụ thể, chúng tôi phát hiện ra rằng Reranked Contextual Embedding và Contextual BM25 đã giảm tỷ lệ thất bại truy xuất top-20-chunk xuống 67% (5,7% → 1,9%).

Cân nhắc về chi phí và độ trễ

Một cân nhắc quan trọng với reranking là tác động đến độ trễ và chi phí, đặc biệt khi reranking một số lượng lớn các đoạn văn bản. Bởi vì reranking thêm một bước bổ sung khi chạy, nó chắc chắn sẽ thêm một chút độ trễ, ngay cả khi reranker chấm điểm tất cả các đoạn văn bản song song. Có một sự đánh đổi cố hữu giữa việc reranking nhiều đoạn văn bản hơn để có hiệu suất tốt hơn so với reranking ít hơn để có độ trễ và chi phí thấp hơn. Chúng tôi khuyên bạn nên thử nghiệm với các cài đặt khác nhau trên trường hợp sử dụng cụ thể của bạn để tìm ra sự cân bằng phù hợp.

Kết luận

Chúng tôi đã thực hiện một số lượng lớn các thử nghiệm, so sánh các tổ hợp khác nhau của tất cả các kỹ thuật được mô tả ở trên (mô hình nhúng, sử dụng BM25, sử dụng contextual retrieval, sử dụng reranker và tổng số kết quả top-K được truy xuất), trên nhiều loại tập dữ liệu khác nhau. Đây là bản tóm tắt những gì chúng tôi đã tìm thấy:

  1. Embeddings + BM25 tốt hơn chỉ dùng embeddings.
  2. Voyage và Gemini có embeddings tốt nhất trong số những cái chúng tôi đã thử nghiệm.
  3. Truyền top-20 đoạn văn bản cho mô hình hiệu quả hơn chỉ top-10 hoặc top-5.
  4. Thêm ngữ cảnh vào các đoạn văn bản cải thiện đáng kể độ chính xác truy xuất.
  5. Reranking tốt hơn không reranking.
  6. Tất cả các lợi ích này cộng lại: để tối đa hóa cải thiện hiệu suất, chúng ta có thể kết hợp contextual embeddings (từ Voyage hoặc Gemini) với contextual BM25, cộng với một bước reranking và thêm 20 đoạn văn bản vào lời nhắc.

Chúng tôi khuyến khích tất cả các nhà phát triển làm việc với các cơ sở kiến thức sử dụng cookbook của chúng tôi để thử nghiệm các phương pháp này nhằm mở khóa các cấp độ hiệu suất mới.

Phụ lục I

Dưới đây là phân tích kết quả trên các tập dữ liệu, nhà cung cấp nhúng, việc sử dụng BM25 ngoài embeddings, việc sử dụng contextual retrieval và việc sử dụng reranking cho Retrievals @ 20.

Xem Phụ lục II để biết phân tích cho Retrievals @ 10 và @ 5 cũng như các câu hỏi và câu trả lời ví dụ cho mỗi tập dữ liệu.

Lời cảm ơn

Nghiên cứu và viết bởi Daniel Ford. Cảm ơn Orowa Sikder, Gautam Mittal và Kenneth Lien đã có những phản hồi quan trọng, Samuel Flamini đã triển khai các cookbook, Lauren Polansky đã điều phối dự án và Alex Albert, Susan Payne, Stuart Ritchie và Brad Abrams đã định hình bài đăng blog này.

Recommended for You

Anthropic Ký cam kết của Nhà Trắng với Thanh niên Hoa Kỳ- Đầu tư vào Giáo dục AI

Anthropic Ký cam kết của Nhà Trắng với Thanh niên Hoa Kỳ- Đầu tư vào Giáo dục AI

Anthropic tham gia cùng Nhà Trắng và các tổ chức khác trong cam kết đầu tư vào giáo dục AI cho giới trẻ Mỹ, thúc đẩy tương lai của lực lượng lao động.

Anthropic bổ nhiệm Guillaume Princen làm Trưởng bộ phận EMEA và công bố hơn 100 vị trí mới trong khu vực

Anthropic bổ nhiệm Guillaume Princen làm Trưởng bộ phận EMEA và công bố hơn 100 vị trí mới trong khu vực

Anthropic chào đón Guillaume Princen đảm nhận vai trò Trưởng bộ phận EMEA, đồng thời công bố kế hoạch tuyển dụng mở rộng trong khu vực.