Cách phân tích tài liệu thông qua LangChain và OpenAPI

by Administrator
0 comment

Việc phân tích tài liệu là một khía cạnh quan trọng trong việc đưa ra quyết định thông minh dựa trên thông tin chi tiết được trích xuất. Tuy nhiên, việc xử lý thông tin nhạy cảm có thể gây lo lắng về tính riêng tư. Nhưng, không cần lo lắng nữa! Với sự kết hợp giữa công cụ LangChain và OpenAI API, bạn có thể phân tích tài liệu cục bộ mà không cần phải tải chúng lên internet.

Hãy cùng tìm hiểu chi tiết hướng dẫn dưới đây để xây dựng một công cụ phân tích tài liệu mạnh mẽ, chỉ với một lượng mã nhỏ và một số thư viện hữu ích của LangChain và OpenAPI.

Thiết lập môi trường

Đầu tiên, chúng ta cần tạo một môi trường ảo Python mới để đảm bảo không có xung đột giữa các phiên bản thư viện. Sau đó, chạy lệnh dưới đây trên terminal để cài đặt các thư viện cần thiết:

pip install langchain openai tiktoken faiss-cpu pypdf

Dưới đây là một số thư viện và công dụng của chúng:

  • LangChain: Thư viện này cho phép tạo và quản lý chuỗi ngôn ngữ để phân tích và xử lý văn bản. Nó cung cấp các mô-đun để tải tài liệu, chia tách văn bản, nhúng và lưu trữ vectơ.
  • OpenAI: Thư viện này được sử dụng để chạy các truy vấn và thu thập kết quả từ một mô hình ngôn ngữ.
  • Tiktoken: Thư viện này giúp bạn đếm số lượng “token” (đơn vị văn bản) trong một văn bản cụ thể. Điều này giúp bạn theo dõi số lượng token khi tương tác với OpenAPI, vì phí dịch vụ được tính dựa trên số lượng token bạn sử dụng.
  • FAISS: Thư viện này cho phép bạn tạo và quản lý bộ lưu trữ vectơ, giúp truy xuất nhanh các vectơ tương tự dựa trên việc nhúng chúng.
  • PyPDF: Thư viện này dùng để trích xuất văn bản từ tệp PDF. Nó giúp tải và truy xuất nội dung từ file PDF để xử lý sâu hơn.

Sau khi bạn đã cài đặt thành công tất cả các thư viện, môi trường của bạn đã sẵn sàng.

Lấy khóa OpenAI API

Để tạo truy vấn cho OpenAI API, bạn cần cung cấp một khóa API như một phần của truy vấn này. Khóa này giúp nhà cung cấp API xác minh rằng các truy vấn đến từ một nguồn hợp pháp và bạn có quyền truy cập đến những tính năng của nó.

Để lấy khóa API OpenAI, bạn cần truy cập vào nền tảng OpenAI và thực hiện các bước sau:

  1. Đăng nhập vào tài khoản OpenAI của bạn.
  2. Trên trang hồ sơ cá nhân của bạn, ở góc phải phía trên cùng, nhấp vào nút “View API keys”. Trang khóa API sẽ hiển thị.

Khóa API

  1. Nhấp vào nút “Create new secret key”. Đặt tên cho khóa và nhấp vào nút “Create new secret key”. OpenAI sẽ tạo một khóa API cho bạn. Hãy sao chép và lưu trữ khóa này ở một nơi an toàn. Vì mục đích bảo mật, bạn sẽ không thể xem lại khóa này từ tài khoản OpenAI. Nếu bạn mất khóa bí mật này, bạn sẽ phải tạo một khóa mới.

Nhập các thư viện cần thiết

Để sử dụng các thư viện đã được cài đặt trong môi trường ảo, bạn cần nhập chúng vào chương trình. Hãy sử dụng các dòng mã sau:

from langchain.document_loaders import PyPDFLoader, TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

Lưu ý rằng bạn đang nhập các thư viện phụ thuộc từ LangChain. Điều này cho phép bạn sử dụng các tính năng cụ thể của framework LangChain.

Tải tài liệu để phân tích

Tiếp theo, chúng ta sẽ tải tài liệu cần phân tích. Bắt đầu bằng cách tạo một biến để chứa khóa API. Chúng ta sẽ sử dụng biến này trong việc xác thực của chương trình.

# Hardcoded API key
openai_api_key = "Your API key"

Lưu ý rằng không nên hard code khóa API nếu bạn định chia sẻ mã nguồn với bên thứ ba. Đối với mã nguồn cuối cùng với mục đích phân phối, hãy sử dụng một biến môi trường thay thế.

Tiếp theo, chúng ta sẽ tạo một hàm để tải tài liệu. Hàm này sẽ tải một tệp PDF hoặc văn bản và trả về một danh sách các tài liệu đã tải. Nếu không có tài liệu nào được tìm thấy, hàm sẽ tạo một ValueError.

def load_document(filename):
   if filename.endswith(".pdf"):
       loader = PyPDFLoader(filename)
       documents = loader.load()
   elif filename.endswith(".txt"):
       loader = TextLoader(filename)
       documents = loader.load()
   else:
       raise ValueError("Invalid file type")

   # Chia nhỏ tài liệu thành các phần nhỏ hơn dựa trên ký tự
   text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=30, separator="n")
   return text_splitter.split_documents(documents=documents)

Hàm này sẽ chia nhỏ tài liệu thành các phần nhỏ hơn dựa trên kí tự. Điều này giúp quản lý phần nhỏ hơn và vẫn giữ được các liên kết giữa các phần văn bản. Điều này rất hữu ích khi phân tích văn bản và truy xuất thông tin từ tài liệu.

Truy vấn tài liệu

Để lấy thông tin chi tiết từ tài liệu đã được tải lên, chúng ta cần có một cách để truy vấn các phần nhỏ của tài liệu. Bạn có thể làm điều này bằng cách tạo một hàm nhận một chuỗi truy vấn và một “retriever”. “Retriever” là một phiên bản của các vector được lưu trữ.

def query_pdf(query, retriever):
   qa = RetrievalQA.from_chain_type(llm=OpenAI(openai_api_key=openai_api_key), chain_type="stuff", retriever=retriever)
   result = qa.run(query)
   print(result)

Hàm này sử dụng phiên bản RetrievalQA được tạo ra để chạy truy vấn và in kết quả.

Tạo hàm chính

Hàm chính sẽ điều khiển luồng chương trình chính. Nó sẽ lấy thông tin đầu vào từ người dùng về tên tệp tài liệu cần phân tích và sau đó tải tài liệu đó. Tiếp theo, nó sẽ tạo một phiên bản OpenAIEmbeddings để nhúng văn bản và xây dựng một lưu trữ vectơ dựa trên tài liệu đã tải và các nhúng. Sau đó, lưu trữ vector sẽ được lưu trong một tệp cục bộ.

Sau đó, với lưu trữ vector đã lưu, chúng ta sẽ nhập một vòng lặp để người dùng có thể nhập các truy vấn. Hàm main này sẽ chuyển các truy vấn này vào hàm query_pdf cùng với trình truy vấn của lưu trữ vector đã lưu. Vòng lặp này sẽ tiếp tục cho tới khi người dùng nhập “exit”.

def main():
   filename = input("Nhập tên tài liệu (.pdf hoặc .txt): ")
   docs = load_document(filename)
   embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
   vectorstore = FAISS.from_documents(docs, embeddings)
   vectorstore.save_local("faiss_index_document")
   persisted_vectorstore = FAISS.load_local("faiss_index_document", embeddings)
   query = input("Nhập truy vấn của bạn (nhập 'exit' để thoát): ")

   while query != "exit":
       query_pdf(query, persisted_vectorstore.as_retriever())
       query = input("Nhập truy vấn của bạn (nhập 'exit' để thoát): ")

if __name__ == "__main__":
    main()

Phương pháp nhúng này ghi lại các mối quan hệ ngữ nghĩa giữa các từ. Vector là một cách để biểu diễn các đoạn văn bản. Mã nguồn này chuyển đổi dữ liệu văn bản trong tài liệu thành các vector bằng cách nhúng được thực hiện bởi OpenAIEmbeddings. Sau đó, nó lưu trữ các vector này bằng FAISS, để truy xuất và so sánh các vector tương tự. Điều này cho phép chúng ta phân tích tài liệu đã tải lên.

Cuối cùng, chúng ta sử dụng phần if __name__ == "__main__" để gọi hàm chính khi chương trình được chạy độc lập:

if __name__ == "__main__":
    main()

Ứng dụng này là một ứng dụng dòng lệnh. Bạn có thể sử dụng thêm Streamlit để thêm giao diện web cho ứng dụng.

Triển khai phân tích tài liệu

Để triển khai phân tích tài liệu, hãy lưu trữ tài liệu bạn muốn phân tích cùng với mã nguồn trong thư mục cùng với dự án của bạn. Sau đó, chạy chương trình. Nó sẽ yêu cầu bạn nhập tên tài liệu mà bạn muốn phân tích. Hãy nhập tên tệp đầy đủ và sau đó nhập các truy vấn cho chương trình phân tích.

Phân tích PDF

Ảnh trên hiển thị kết quả phân tích cho một tệp PDF.

Phân tích văn bản

Ảnh dưới đây hiển thị kết quả phân tích cho tệp văn bản chứa mã nguồn.

Hãy đảm bảo rằng tệp bạn muốn phân tích có định dạng PDF hoặc văn bản. Nếu tài liệu có định dạng khác, bạn có thể chuyển đổi chúng thành định dạng PDF bằng các công cụ trực tuyến.

Hy vọng hướng dẫn này đã giúp bạn xây dựng một công cụ phân tích tài liệu mạnh mẽ. Hãy thử nghiệm chúng và khám phá thêm các khả năng tuyệt vời của LangChain và OpenAPI!

You may also like