Tóm tắt Văn bản Sử dụng Chuỗi Ngôn ngữ
Mỗi Mô hình Ngôn ngữ Lớn (LLM) khác nhau có giới hạn độ dài khác nhau cho số từ của đầu vào. Nếu cần tóm tắt một bài báo dài, nhưng độ dài của bài báo vượt quá giới hạn tối đa của mô hình, chúng ta không thể đưa toàn bộ bài báo trực tiếp vào mô hình Trí tuệ nhân tạo (AI). Trong những tình huống như vậy, LangChain cung cấp các chiến lược và đóng gói để xử lý vấn đề này. Chương này chủ yếu giới thiệu cách LangChain giải quyết việc tóm tắt văn bản.
Tiền xử lý dữ liệu
Đầu tiên, chúng ta chuẩn bị dữ liệu thử nghiệm. Trong ví dụ này, chúng ta tải một tài liệu dài và sau đó chia tài liệu đó thành nhiều đoạn nhỏ.
- Chú ý: Tải dữ liệu tệp cục bộ ở đây chỉ để minh họa. Trong các kịch bản kinh doanh thực tế, bạn có thể tải dữ liệu văn bản từ cơ sở dữ liệu của riêng bạn.
from langchain import OpenAI, PromptTemplate, LLMChain
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains.mapreduce import MapReduceChain
from langchain.prompts import PromptTemplate
llm = OpenAI(temperature=0)
text_splitter = CharacterTextSplitter()
with open("../../state_of_the_union.txt") as f:
state_of_the_union = f.read()
texts = text_splitter.split_text(state_of_the_union)
from langchain.docstore.document import Document
docs = [Document(page_content=t) for t in texts[:3]]
Bắt đầu
Cách dễ nhất để tóm tắt văn bản dài là sử dụng tác vụ load_summarize_chain
do LangChain cung cấp để thực hiện tác vụ tóm tắt văn bản.
from langchain.chains.summarize import load_summarize_chain
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)
Việc sử dụng chuỗi tóm tắt văn bản được đóng gói do LangChain cung cấp rất đơn giản. Tuy nhiên, nếu bạn cần điều chỉnh một số tham số, vui lòng tham khảo nội dung sau đây. Ví dụ, ví dụ trên sử dụng một biểu tượng từ máy móc tích hợp, có thể không thân thiện với người dùng tiếng Trung. Bạn có thể thay đổi nó thành biểu tượng từ máy móc của riêng bạn và cũng vậy.
Giải thích tham số chain_type
LangChain đã thiết kế 4 phương pháp xử lý cho trường hợp mà từ gợi của tác vụ Chuỗi vượt quá giới hạn độ dài token của LLM.
Các loại chain_type có thể là:
- stuff
- map_reduce
- refine
- map_rerank
Loại stuff
Đây là loại mặc định của LangChain, which sends all document content to the LLM model to summarize at once. Do đó, nó được gọi là chế độ đóng gói. Nếu nội dung tài liệu quá dài, nó chắc chắn sẽ vượt quá giới hạn token của LLM.
Loại map_reduce
Phương pháp này trước tiên gửi từng đoạn văn bản đến mô hình LLM để tóm tắt một cách riêng lẻ, sau đó kết hợp tất cả các tóm tắt và cuối cùng cung cấp một tóm tắt tổng thể cho trí tuệ nhân tạo, mà tương tự như khái niệm của các thư viện hàm bản đồ-rút gọn trong nhiều ngôn ngữ lập trình.
Loại refine
Phương pháp này tạo ra một bản tóm tắt văn bản một cách tóm tắt. Trước tiên, nó gửi nội dung của tài liệu đầu tiên đến mô hình LLM để tóm tắt, sau đó gửi tóm tắt của nội dung tài liệu đầu tiên + nội dung của tài liệu thứ hai đến mô hình LLM để tóm tắt, và cứ thế để thu được một bản tóm tắt cuối cùng cho văn bản dài.
Loại map_rerank
Đây được sử dụng trong các tác vụ trả lời câu hỏi. Nó lựa chọn các đoạn văn bản có mối liên hệ cao với câu hỏi và sau đó gửi chúng đến mô hình LLM để trả lời câu hỏi.
Ví dụ về tác vụ stuff
Dưới đây là một ví dụ về việc tóm tắt một bài báo bằng cách sử dụng loại stuff
, phù hợp cho những bài báo không vượt quá giới hạn về số từ của LLM:
chain = load_summarize_chain(llm, chain_type="stuff")
chain.run(docs)
Biểu tượng Từ Tùy chỉnh
Đối với loại stuff
, dưới đây là một ví dụ về biểu tượng từ tùy chỉnh:
prompt_template = """Tóm tắt nội dung sau:
{text}
Tóm tắt:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
chain = load_summarize_chain(llm, chain_type="stuff", prompt=PROMPT)
chain.run(docs)
Ví dụ về nhiệm vụ map_reduce
map_reduce
tóm tắt bài báo, và tất nhiên, phương pháp này sẽ dẫn đến nhiều lần gọi mô hình AI.
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)
Lời nhắc tùy chỉnh cho Nhiệm vụ map_reduce
prompt_template = """Tóm tắt nội dung sau đây:
{text}
Tóm tắt:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
chain = load_summarize_chain(OpenAI(temperature=0), chain_type="map_reduce", return_intermediate_steps=True, map_prompt=PROMPT, combine_prompt=PROMPT)
chain({"input_documents": docs}, return_only_outputs=True)
Ví dụ về nhiệm vụ refine
Đơn giản thay đổi tham số chain_type
thành refine
.
chain = load_summarize_chain(llm, chain_type="refine")
chain.run(docs)
Mẫu Từ khóa Tùy chỉnh cho Nhiệm vụ Refine
Dưới đây là ví dụ về từ khóa tùy chỉnh cho nhiệm vụ refine
:
prompt_template = """Tóm tắt nội dung sau đây:
{text}
Tóm tắt:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
refine_template = (
"Nhiệm vụ của bạn là tạo ra một bản tóm tắt văn bản cuối cùng\n"
"Dưới đây là thông tin tóm tắt hiện tại: {existing_answer}\n"
"Cải thiện tóm tắt hiện tại dựa trên thông tin nền mới\n"
"Thông tin nền như sau\n"
"------------\n"
"{text}\n"
"------------\n"
"Dựa trên thông tin nền, cải thiện tóm tắt hiện tại\n"
"Trả về thông tin tóm tắt hiện tại nếu thông tin nền không hữu ích."
)
refine_prompt = PromptTemplate(
input_variables=["existing_answer", "text"],
template=refine_template,
)
chain = load_summarize_chain(OpenAI(temperature=0), chain_type="refine", return_intermediate_steps=True, question_prompt=PROMPT, refine_prompt=refine_prompt)
chain({"input_documents": docs}, return_only_outputs=True)