Chỉ mục tóm tắt tài liệu mới cho các hệ thống đảm bảo chất lượng do LLM cung cấp
Trong bài đăng trên blog này, chúng tôi giới thiệu một cấu trúc dữ liệu LlamaIndex hoàn toàn mới: Chỉ mục Tóm tắt Tài liệu. Chúng tôi mô tả cách nó có thể giúp mang lại hiệu suất truy xuất tốt hơn so với tìm kiếm ngữ nghĩa truyền thống và cũng xem qua một ví dụ.
Lý lịch
Một trong những trường hợp sử dụng cốt lõi của Mô hình ngôn ngữ lớn (LLM) là trả lời câu hỏi đối với dữ liệu của riêng bạn. Để thực hiện điều này, chúng tôi ghép nối LLM với một mô hình “truy xuất” có thể thực hiện truy xuất thông tin qua kho dữ liệu kiến thức và thực hiện tổng hợp phản hồi đối với các văn bản đã truy xuất bằng LLM. Khung tổng thể này được gọi là Thế hệ tăng cường truy xuất.
Hầu hết người dùng xây dựng các hệ thống QA do LLM cung cấp ngày nay có xu hướng thực hiện một số dạng sau:
- Lấy tài liệu nguồn, chia nhỏ từng tài liệu thành các đoạn văn bản
- Lưu trữ các đoạn văn bản trong một db vector
- Trong thời gian truy vấn, hãy truy xuất các đoạn văn bản bằng cách nhúng các bộ lọc tương tự và/hoặc bộ lọc từ khóa.
- Thực hiện tổng hợp phản ứng
Hạn chế của các phương pháp hiện có
Có một số hạn chế của việc nhúng truy xuất bằng cách sử dụng các đoạn văn bản.
- Đoạn văn bản thiếu bối cảnh toàn cầu. Thông thường, câu hỏi yêu cầu ngữ cảnh ngoài nội dung được lập chỉ mục trong một đoạn cụ thể.
- Điều chỉnh cẩn thận các ngưỡng điểm tương tự/k hàng đầu. Đặt giá trị quá nhỏ và bạn sẽ bỏ lỡ ngữ cảnh. Đặt giá trị quá lớn và chi phí/độ trễ có thể tăng lên với ngữ cảnh không liên quan hơn.
- Các phần nhúng không phải lúc nào cũng chọn ngữ cảnh phù hợp nhất cho câu hỏi. Các phần nhúng vốn đã được xác định riêng biệt giữa văn bản và ngữ cảnh.
Mục lục tóm tắt tài liệu

Chúng tôi đề xuất một chỉ mục mới trong LlamaIndex sẽ trích xuất/lập chỉ mục một bản tóm tắt văn bản không có cấu trúc cho mỗi tài liệu . Chỉ mục này có thể giúp nâng cao hiệu suất truy xuất ngoài các phương pháp truy xuất hiện có. Nó giúp lập chỉ mục nhiều thông tin hơn một đoạn văn bản đơn lẻ và mang nhiều ý nghĩa ngữ nghĩa hơn các thẻ từ khóa. Nó cũng cho phép hình thức truy xuất linh hoạt hơn: chúng tôi có thể thực hiện cả truy xuất LLM và truy xuất dựa trên nhúng.
Làm thế nào nó hoạt động
Trong thời gian xây dựng, chúng tôi nhập từng tài liệu và sử dụng LLM để trích xuất bản tóm tắt từ mỗi tài liệu. Chúng tôi cũng chia tài liệu thành các đoạn văn bản (nút). Cả phần tóm tắt và các nút đều được lưu trữ trong bản tóm tắt Kho tài liệu của chúng tôi . Chúng tôi duy trì một ánh xạ từ bản tóm tắt đến tài liệu/nút nguồn.
Trong thời gian truy vấn, chúng tôi truy xuất các tài liệu liên quan đến truy vấn dựa trên tóm tắt của chúng, sử dụng các phương pháp sau:
- Truy xuất dựa trên LLM: Chúng tôi trình bày các bộ tóm tắt tài liệu cho LLM và yêu cầu LLM xác định tài liệu nào có liên quan + điểm phù hợp của chúng.
- Truy xuất dựa trên nhúng: Chúng tôi truy xuất các tài liệu có liên quan dựa trên sự tương đồng về nhúng tóm tắt (với điểm cắt top-k).
Lưu trữ tóm tắt cho một tài liệu cũng cho phép truy xuất dựa trên LLM . Thay vì cung cấp toàn bộ tài liệu cho LLM ngay từ đầu, trước tiên chúng ta có thể yêu cầu LLM kiểm tra bản tóm tắt tài liệu ngắn gọn để xem liệu nó có liên quan đến truy vấn hay không. Điều này tận dụng các khả năng lý luận của LLM tiên tiến hơn so với tra cứu dựa trên nhúng, nhưng tránh được chi phí/độ trễ khi cung cấp toàn bộ tài liệu cho LLM
Thông tin chi tiết bổ sung
Truy xuất tài liệu với bản tóm tắt có thể được coi là "điểm trung gian" giữa tìm kiếm ngữ nghĩa và tóm tắt brute-force trên tất cả các tài liệu. Chúng tôi tra cứu tài liệu dựa trên mức độ liên quan của bản tóm tắt với truy vấn đã cho, sau đó trả về tất cả *nút* tương ứng với tài liệu đã truy xuất.
Tại sao chúng ta nên làm điều này? Phương pháp truy xuất này cung cấp cho người dùng nhiều ngữ cảnh hơn so với top-k trên một đoạn văn bản, bằng cách truy xuất ngữ cảnh ở cấp độ tài liệu. Tuy nhiên, đó cũng là một cách tiếp cận linh hoạt/tự động hơn so với mô hình chủ đề; không còn lo lắng về việc liệu văn bản của bạn có các thẻ từ khóa phù hợp hay không!
Ví dụ
Hãy xem qua một ví dụ hiển thị chỉ mục tóm tắt tài liệu, qua các bài viết trên Wikipedia về các thành phố khác nhau.
Phần còn lại của hướng dẫn này trình bày các đoạn mã có liên quan. Bạn có thể tìm hướng dẫn đầy đủ tại đây (và đây là liên kết sổ tay ).
Chúng ta có thể xây dựng GPTDocumentSummaryIndex
trên một tập hợp các tài liệu và chuyển vào một ResponseSynthesizer
đối tượng để tổng hợp các bản tóm tắt cho các tài liệu.
from llama_index import (
SimpleDirectoryReader,
LLMPredictor,
ServiceContext,
ResponseSynthesizer
)
from llama_index.indices.document_summary import GPTDocumentSummaryIndex
from langchain.chat_models import ChatOpenAI
# load docs, define service context
...
# build the index
response_synthesizer = ResponseSynthesizer.from_args(response_mode="tree_summarize", use_async=True)
doc_summary_index = GPTDocumentSummaryIndex.from_documents(
city_docs,
service_context=service_context,
response_synthesizer=response_synthesizer
)
summary = doc_summary_index.get_document_summary("Boston")
from llama_index.indices.document_summary import DocumentSummaryIndexRetriever
retriever = DocumentSummaryIndexRetriever(
doc_summary_index,
# choice_select_prompt=choice_select_prompt,
# choice_batch_size=choice_batch_size,
# format_node_batch_fn=format_node_batch_fn,
# parse_choice_select_answer_fn=parse_choice_select_answer_fn,
# service_context=service_context
)
retrieved_nodes = retriever.retrieve("What are the sports teams in Toronto?")
print(retrieved_nodes[0].score)
print(retrieved_nodes[0].node.get_text())The retriever will retrieve a set of relevant nodes for a given index.
8.0
Toronto ( (listen) tə-RON-toh; locally [təˈɹɒɾ̃ə] or [ˈtɹɒɾ̃ə]) is the capital city of the Canadian province of Ontario. With a recorded population of 2,794,356 in 2021, it is the most populous city in Canada...
API cấp cao
query_engine = doc_summary_index.as_query_engine(
response_mode="tree_summarize", use_async=True
)
response = query_engine.query("What are the sports teams in Toronto?")
print(response)
# use retriever as part of a query engine
from llama_index.query_engine import RetrieverQueryEngine
# configure response synthesizer
response_synthesizer = ResponseSynthesizer.from_args()
# assemble query engine
query_engine = RetrieverQueryEngine(
retriever=retriever,
response_synthesizer=response_synthesizer,
)
# query
response = query_engine.query("What are the sports teams in Toronto?")
print(response)
Cách tiếp cận tự động tóm tắt trên bất kỳ đoạn văn bản nào thực sự thú vị. Chúng tôi rất vui được phát triển các tiện ích mở rộng trong hai lĩnh vực:
- Tiếp tục khám phá tự động tóm tắt trong các lớp khác nhau. Hiện tại nó ở cấp độ tài liệu, nhưng tóm tắt một đoạn văn bản lớn thành một đoạn văn bản nhỏ hơn thì sao? (ví dụ: một lớp lót).
- Tiếp tục khám phá truy xuất dựa trên LLM, phần tóm tắt này giúp mở khóa.
Hướng dẫn tóm tắt tài liệu
Liên kết máy tính xách tay