+1

Cách sử dụng LangChain và GPT để phân tích nhiều tài liệu

Trong khoảng một năm trở lại đây, cộng đồng lập trình viên đã chứng kiến sự bùng nổ của các công cụ, ứng dụng và quy trình mới đầy sáng tạo để làm việc với các mô hình ngôn ngữ lớn (LLM) và AI tạo sinh.

Một ví dụ đặc biệt linh hoạt là dự án LangChain. Mục tiêu tổng quát của dự án này là cung cấp khả năng tích hợp dễ dàng với nhiều mô hình LLM khác nhau. Hệ sinh thái LangChain cũng là nơi phát triển của một số lượng ngày càng tăng các dự án (đôi khi mang tính thử nghiệm) nhằm đẩy mạnh giới hạn của LLM.

Hãy dành thời gian duyệt qua trang web của LangChain để hiểu rõ hơn về những khả năng mà nó mang lại. Bạn sẽ thấy có rất nhiều công cụ được thiết kế để giúp bạn xây dựng các ứng dụng mạnh mẽ hơn.

Bạn cũng có thể sử dụng nó như một giải pháp thay thế để kết nối AI ưa thích của bạn với internet trực tiếp. Cụ thể, bài viết này sẽ hướng dẫn bạn cách sử dụng LangChain để truy cập, tóm tắt và phân tích các tài liệu trực tuyến dài và phức tạp một cách lập trình.

Để thực hiện tất cả những điều này, bạn sẽ cần một môi trường thực thi Python (như Jupyter Lab) và một khóa API OpenAI hợp lệ.

Bạn cũng có thể tham khảo bài viết: LangChain là gì? Thông tin cần biết trước khi ứng dụng mã nguồn mở LangChain

Chuẩn bị môi trường và nạp tài liệu

Một ứng dụng phổ biến của LangChain là tải nhiều tệp PDF song song và yêu cầu GPT phân tích và so sánh nội dung của chúng.

Như bạn có thể tự mình thấy trong tài liệu LangChain, các mô-đun hiện có có thể được tải để cho phép đọc PDF và phân tích ngôn ngữ tự nhiên. Tôi sẽ hướng dẫn bạn qua một ví dụ trường hợp sử dụng dựa trên ví dụ trong tài liệu đó.

Dưới đây là cách bắt đầu:

import os
os.environ['OPENAI_API_KEY'] = "sk-xxx"
from pydantic import BaseModel, Field
from langchain.chat_models import ChatOpenAI
from langchain.agents import Tool
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.document_loaders import PyPDFLoader
from langchain.chains import RetrievalQA

Đoạn mã này sẽ xây dựng môi trường của bạn và thiết lập các công cụ cần thiết để:

  • Kích hoạt OpenAI Chat (ChatOpenAI)
  • Hiểu và xử lý văn bản (OpenAIEmbeddings, CharacterTextSplitter, FAISS, RetrievalQA)
  • Quản lý một tác tử AI (Tool)

Tiếp theo, bạn sẽ tạo và định nghĩa một lớp DocumentInput và một giá trị có tên llm để thiết lập một số tham số GPT quen thuộc, cả hai sẽ được gọi sau:

class DocumentInput(BaseModel):
    question: str = Field()
llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo-0613")

Tải tài liệu của bạn

Tiếp theo, bạn sẽ tạo một vài mảng. Ba biến path trong mảng files chứa các URL cho các báo cáo tài chính gần đây do ba công ty phần mềm/dịch vụ CNTT phát hành: Alphabet (Google), Cisco và IBM.

Chúng ta sẽ yêu cầu GPT xem xét dữ liệu của ba công ty đồng thời, so sánh kết quả và thực hiện tất cả mà không cần phải tải xuống các tệp PDF về môi trường cục bộ.

Bạn thường có thể tìm thấy các hồ sơ pháp lý như vậy trong phần Quan hệ Nhà đầu tư trên trang web của công ty.

tools = []
files = [
    {
        "name": "alphabet-earnings",
        "path": "https://abc.xyz/investor/static/pdf/2023Q1\
        _alphabet_earnings_release.pdf",
    },
    {
        "name": "Cisco-earnings",
        "path": "https://d18rn0p25nwr6d.cloudfront.net/CIK-00\
            00858877/5b3c172d-f7a3-4ecb-b141-03ff7af7e068.pdf",
    },
    {
        "name": "IBM-earnings",
        "path": "https://www.ibm.com/investor/att/pdf/IBM_\
            Annual_Report_2022.pdf",
    },
    ]

Vòng lặp for này sẽ lặp qua từng giá trị của mảng files mà tôi vừa trình bày. Đối với mỗi lần lặp, nó sẽ sử dụng PyPDFLoader để tải tệp PDF được chỉ định, loader và CharacterTextSplitter để phân tích văn bản và các công cụ còn lại để sắp xếp dữ liệu và áp dụng các nhúng. Sau đó, nó sẽ gọi lớp DocumentInput mà chúng ta đã tạo trước đó:

for file in files:
    loader = PyPDFLoader(file["path"])
    pages = loader.load_and_split()
    text_splitter = CharacterTextSplitter(chunk_size=1000, \
        chunk_overlap=0)
    docs = text_splitter.split_documents(pages)
    embeddings = OpenAIEmbeddings()
    retriever = FAISS.from_documents(docs, embeddings).as_retriever()
# Wrap retrievers in a Tool
tools.append(
    Tool(
        args_schema=DocumentInput,
        name=file["name"],
        func=RetrievalQA.from_chain_type(llm=llm, \
            retriever=retriever),
    )
)

Gửi yêu cầu tới mô hình

Tại thời điểm này, cuối cùng chúng ta đã sẵn sàng để tạo một tác tử và cung cấp cho nó yêu cầu của chúng ta dưới dạng input.

llm = ChatOpenAI(
    temperature=0,
    model="gpt-3.5-turbo-0613",
)
agent = initialize_agent(
    agent=AgentType.OPENAI_FUNCTIONS,
    tools=tools,
    llm=llm,
    verbose=True,
)
    agent({"input": "Based on these SEC filing documents, identify \
        which of these three companies - Alphabet, IBM, and Cisco \
        has the greatest short-term debt levels and which has the \
        highest research and development costs."})

Kết quả chúng ta nhận được ngắn gọn và súc tích:

‘output’: ‘Dựa trên các tài liệu nộp cho SEC:\n\n- Công ty có mức nợ ngắn hạn lớn nhất là IBM, với mức nợ ngắn hạn là 4.760 triệu USD.\n- Công ty có chi phí nghiên cứu và phát triển cao nhất là Alphabet, với chi phí nghiên cứu và phát triển là 11.468 triệu USD.’

Như bạn đã thấy, LangChain cho phép bạn tích hợp nhiều công cụ vào các hoạt động AI tạo sinh, cho phép truy cập chương trình nhiều lớp vào internet trực tiếp và các yêu cầu LLM phức tạp hơn. Với những công cụ này, bạn sẽ có thể tự động áp dụng sức mạnh của các công cụ AI vào các tài sản dữ liệu trong thế giới thực theo thời gian thực. Hãy tự mình thử nghiệm nhé.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí