ดัชนีสรุปเอกสารใหม่สำหรับระบบ QA ที่ขับเคลื่อนด้วย LLM
ในบล็อกโพสต์นี้ เราขอแนะนำโครงสร้างข้อมูล LlamaIndex ใหม่: ดัชนีสรุปเอกสาร เราอธิบายวิธีที่สามารถช่วยนำเสนอประสิทธิภาพการดึงข้อมูลที่ดีขึ้นเมื่อเทียบกับการค้นหาความหมายแบบดั้งเดิม พร้อมทั้งแนะนำตัวอย่าง
พื้นหลัง
หนึ่งในกรณีการใช้งานหลักของ Large Language Models (LLM) คือการตอบคำถามเกี่ยวกับข้อมูลของคุณเอง ในการทำเช่นนี้ เราจับคู่ LLM กับโมเดล "การดึงข้อมูล" ที่สามารถดำเนินการดึงข้อมูลผ่านคลังข้อมูลความรู้ และดำเนินการสังเคราะห์การตอบสนองเหนือข้อความที่ดึงมาโดยใช้ LLM กรอบโดยรวมนี้เรียกว่า Retrieval-Augmented Generation
ผู้ใช้ส่วนใหญ่ที่สร้างระบบ QA ที่ขับเคลื่อนด้วย LLM ในปัจจุบันมักจะทำรูปแบบต่อไปนี้:
- นำเอกสารต้นฉบับ แบ่งแต่ละรายการออกเป็นส่วนข้อความ
- เก็บข้อความในฐานข้อมูลเวกเตอร์
- ในช่วงเวลาสืบค้น ให้ดึงข้อความโดยการฝังตัวกรองคำหลักที่คล้ายคลึงกันและ/หรือ
- ดำเนินการสังเคราะห์การตอบสนอง
ข้อ จำกัด ของแนวทางที่มีอยู่
มีข้อจำกัดบางประการในการดึงข้อมูลแบบฝังโดยใช้กลุ่มข้อความ
- กลุ่มข้อความขาดบริบทส่วนกลาง บ่อยครั้งที่คำถามต้องการบริบทนอกเหนือจากสิ่งที่จัดทำดัชนีในกลุ่มเฉพาะ
- การปรับเกณฑ์คะแนน top-k / ความคล้ายคลึงกันอย่างระมัดระวัง ทำให้ค่าน้อยเกินไปและคุณจะพลาดบริบท ทำให้มูลค่าสูงเกินไปและต้นทุน/เวลาแฝงอาจเพิ่มขึ้นเมื่อมีบริบทที่ไม่เกี่ยวข้องมากขึ้น
- การฝังไม่ได้เลือกบริบทที่เกี่ยวข้องมากที่สุดสำหรับคำถามเสมอไป การฝังจะถูกกำหนดแยกกันโดยเนื้อแท้ระหว่างข้อความและบริบท
ดัชนีสรุปเอกสาร
เราเสนอดัชนีใหม่ในLlamaIndexซึ่งจะแยก/จัดทำดัชนีสรุปข้อความที่ไม่มีโครงสร้างสำหรับแต่ละเอกสาร ดัชนีนี้สามารถช่วยปรับปรุงประสิทธิภาพการดึงข้อมูลนอกเหนือจากแนวทางการดึงข้อมูลที่มีอยู่ ช่วยในการจัดทำดัชนีข้อมูลมากกว่ากลุ่มข้อความเดียวและมีความหมายมากกว่าแท็กคำหลัก นอกจากนี้ยังช่วยให้สามารถดึงข้อมูลในรูปแบบที่ยืดหยุ่นมากขึ้น: เราสามารถทำได้ทั้งการดึงข้อมูล LLM และการดึงตามการฝัง
มันทำงานอย่างไร
ระหว่างการสร้าง เราจะนำเข้าเอกสารแต่ละฉบับ และใช้ LLM เพื่อดึงข้อมูลสรุปจากแต่ละเอกสาร เรายังแยกเอกสารออกเป็นส่วนข้อความ (โหนด) ทั้งข้อมูลสรุปและโหนดจะถูกจัดเก็บไว้ในสิ่งที่เป็นนามธรรม ของ Document Store เรารักษาการแมปจากข้อมูลสรุปไปยังเอกสาร/โหนดต้นทาง
ในช่วงเวลาสืบค้น เราเรียกค้นเอกสารที่เกี่ยวข้องกับการสืบค้นตามข้อมูลสรุป โดยใช้วิธีการต่อไปนี้:
- LLM-based Retrieval:เรานำเสนอชุดสรุปเอกสารให้กับ LLM และขอให้ LLM พิจารณาว่าเอกสารใดมีความเกี่ยวข้อง + คะแนนความเกี่ยวข้อง
- การดึงตามการฝัง:เราดึงเอกสารที่เกี่ยวข้องตามความคล้ายคลึงกันของการฝังโดยสรุป
การจัด เก็บข้อมูลสรุปสำหรับเอกสารยังเปิดใช้งานการดึงตาม LLM แทนที่จะป้อนเอกสารทั้งหมดให้กับ LLM ในตอนเริ่มต้น เราสามารถให้ LLM ตรวจสอบสรุปเอกสารที่กระชับก่อนเพื่อดูว่าเกี่ยวข้องกับข้อความค้นหาหรือไม่ สิ่งนี้ใช้ประโยชน์จากความสามารถในการให้เหตุผลของ LLM ซึ่งล้ำหน้ากว่าการค้นหาแบบฝัง แต่หลีกเลี่ยงค่าใช้จ่าย/เวลาแฝงในการป้อนเอกสารทั้งหมดไปยัง LLM
ข้อมูลเชิงลึกเพิ่มเติม
การค้นคืนเอกสารพร้อมการสรุปถือเป็น "จุดกึ่งกลาง" ระหว่างการค้นหาความหมายและการสรุปแบบเดรัจฉานในเอกสารทั้งหมด เราค้นหาเอกสารตามความเกี่ยวข้องโดยสรุปกับข้อความค้นหาที่กำหนด จากนั้นส่งคืน *โหนด* ทั้งหมดที่ตรงกับเอกสารที่ดึงมา
ทำไมเราควรทำเช่นนี้? วิธีการดึงข้อมูลนี้ให้บริบทแก่ผู้ใช้มากกว่า top-k เหนือกลุ่มข้อความ โดยการดึงบริบทในระดับเอกสาร แต่ก็เป็นวิธีที่ยืดหยุ่น/อัตโนมัติมากกว่าการสร้างแบบจำลองหัวข้อ ไม่ต้องกังวลว่าข้อความของคุณจะมีแท็กคำหลักที่ถูกต้องหรือไม่!
ตัวอย่าง
มาดูตัวอย่างที่แสดงดัชนีสรุปเอกสารเหนือบทความ Wikipedia เกี่ยวกับเมืองต่างๆ
ส่วนที่เหลือของคู่มือนี้แสดงข้อมูลโค้ดที่เกี่ยวข้อง คุณสามารถดูคำแนะนำทั้งหมดได้ที่นี่ (และนี่คือลิงก์สมุดบันทึก )
เราสามารถสร้างGPTDocumentSummaryIndex
ชุดเอกสารและส่งผ่านResponseSynthesizer
วัตถุเพื่อสังเคราะห์บทสรุปสำหรับเอกสาร
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 ระดับสูง
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)
วิธีการสรุปอัตโนมัติสำหรับข้อความใด ๆ นั้นน่าตื่นเต้นมาก เราตื่นเต้นที่จะพัฒนาส่วนขยายในสองด้าน:
- สำรวจการสรุปอัตโนมัติในเลเยอร์ต่างๆ ต่อไป ขณะนี้อยู่ในระดับเอกสาร แต่การสรุปกลุ่มข้อความขนาดใหญ่ให้มีขนาดเล็กลงล่ะ (เช่นหนึ่งซับ).
- สำรวจการดึงข้อมูลตาม LLM ต่อไป ซึ่งการสรุปจะช่วยปลดล็อก
คู่มือสรุปเอกสาร
ลิงค์โน๊ตบุ๊ค