Trình chuyển đổi tài liệu

Trình chuyển đổi tài liệu của LangChain chủ yếu hoạt động để phân đoạn nội dung của văn bản, chia một bài viết lớn thành nhiều đoạn nội dung nhỏ hơn. Điều này được thực hiện vì các mô hình lớn thường có giới hạn về độ dài các dấu nhắc và không thể đưa toàn bộ nội dung cho trí tuệ nhân tạo. Ngay cả khi một số mô hình lớn cho phép độ dài dấu nhắc rất lớn, nhìn từ góc độ chi phí, việc truyền nội dung dài như vậy cho trí tuệ nhân tạo không thực tế. Cuối cùng, càng dài nội dung, chi phí gọi API càng cao (thậm chí đối với các mô hình mã nguồn mở triển khai cục bộ, nội dung dài đòi hỏi bộ nhớ GPU nhiều hơn và tạo kết quả suy luận chậm hơn). Cách tiếp cận hợp lý là nối các đoạn nội dung liên quan như thông tin nền và dấu nhắc khi yêu cầu mô hình trí tuệ nhân tạo.

LangChain có nhiều trình chuyển đổi tài liệu tích hợp có thể dễ dàng chia, kết hợp và lọc nội dung tài liệu.

Bộ chia văn bản

Khi xử lý các khối văn bản lớn, bạn cần phải chia văn bản thành các phần nhỏ. Mặc dù có vẻ đơn giản, nhưng có nhiều phức tạp tiềm ẩn ở đây. Lý tưởng, bạn muốn giữ các đoạn văn cùng một ý nghĩa ngữ nghĩa lại với nhau. Thuật ngữ "cùng một ý nghĩa ngữ nghĩa" ở đây có thể phụ thuộc vào loại văn bản.

Ở mức cao, bộ chia văn bản hoạt động như sau:

  1. Chia văn bản thành các khối nhỏ, có ý nghĩa ngữ nghĩa (thường là các câu).
  2. Bắt đầu kết hợp các khối nhỏ này thành các khối lớn hơn cho đến khi đạt đến một kích thước nhất định (được đo lường bằng một số hàm).
  3. Khi kích thước này được đạt đến, xem xét khối đó như một đoạn văn riêng biệt và bắt đầu tạo một khối văn bản mới với một số chồng chéo (để duy trì ngữ cảnh giữa các khối).

Điều này có nghĩa là bạn có thể tùy chỉnh bộ chia văn bản theo hai trục khác nhau:

  1. Cách chia văn bản
  2. Cách đo đạc kích thước của các khối

Ví dụ

Bộ chia văn bản mặc định được khuyến nghị là RecursiveCharacterTextSplitter. Bộ chia văn bản này chấp nhận một danh sách các ký tự. Nó cố gắng tạo các khối dựa trên ký tự đầu tiên, nhưng nếu bất kỳ khối nào quá lớn, nó sẽ tiếp tục di chuyển đến ký tự tiếp theo, và cứ thế. Mặc định, các ký tự mà nó cố gắng chia là ["\\n\\n", "\n", " ", ""].

Ngoài việc kiểm soát những ký tự nào có thể chia, bạn cũng có thể kiểm soát một số vấn đề khác:

  • length_function: Cách tính toán độ dài của một khối. Mặc định, chỉ có đếm số ký tự, nhưng thường truyền bộ đếm token vào đây.
  • chunk_size: Kích thước tối đa của các khối của bạn (đo bằng hàm độ dài).
  • chunk_overlap: Sự chồng chéo tối đa giữa các khối. Duy trì một số chồng chéo có thể giúp duy trì tính liên tục giữa các khối (ví dụ, thực hiện một cửa sổ trượt).
  • add_start_index: Có thêm vị trí bắt đầu của mỗi khối trong tài liệu gốc vào siêu dữ liệu hay không.
with open('../../state_of_the_union.txt') as f:
    state_of_the_union = f.read()
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size = 100,
    chunk_overlap  = 20,
    length_function = len,
    add_start_index = True,
)
texts = text_splitter.create_documents([state_of_the_union])
print(texts[0])
print(texts[1])
page_content='..ignored text..' metadata={'start_index': 0}
    page_content='..ignored text..' metadata={'start_index': 82}

Các biến đổi khác

Lọc tài liệu lặp lại, Dịch tài liệu, Trích xuất siêu dữ liệu và Thêm metadata và Nhiều Tùy chọn khác

Ngoài việc chia tài liệu, chúng ta cũng có thể thực hiện các biến đổi khác trên nội dung tài liệu. Sử dụng EmbeddingsRedundantFilter, chúng ta có thể xác định tài liệu tương tự và lọc nội dung lặp lại. Thông qua tích hợp như doctran, chúng ta có thể thực hiện các hoạt động như dịch tài liệu từ một ngôn ngữ sang ngôn ngữ khác, trích xuất các thuộc tính cần thiết và thêm chúng vào siêu dữ liệu, cũng như chuyển đổi cuộc trò chuyện thành một tập hợp các tài liệu được định dạng thành câu hỏi/đáp.