Danh sách bài viết

Chương 6: LangChain vs. LlamaIndex vs. OpenAI Assistants - Hướng Dẫn Từ Cài Đặt Đến Ứng Dụng Thực Tế

Ghi chú

Chọn đoạn văn bản trong bài viết để ghi chú.

1. Giới thiệu về LangChain

1.1 LangChain là gì

LangChain là một framework mã nguồn mở được thiết kế để đơn giản hóa việc phát triển, đưa vào sản xuất và triển khai các ứng dụng được hỗ trợ bởi các Mô hình Ngôn ngữ Lớn (LLMs). Nó cung cấp một tập hợp các khối xây dựng, thành phần và tích hợp giúp đơn giản hóa mọi giai đoạn trong vòng đời của ứng dụng sử dụng LLM.

Các tính năng chính:

  • Các trừu tượng hóa và Ngôn ngữ Biểu thức LangChain (LCEL) để tạo chuỗi.
  • Tích hợp với bên thứ ba và các gói đối tác để dễ dàng mở rộng.
  • Các chuỗi (chains), tác tử (agents), và chiến lược truy xuất để xây dựng kiến trúc nhận thức.
  • LangGraph: để tạo các ứng dụng nhiều tác tử, có trạng thái và mạnh mẽ.
  • LangServe: để triển khai các chuỗi LangChain dưới dạng REST API.

Hệ sinh thái LangChain rộng hơn còn bao gồm LangSmith, một nền tảng dành cho nhà phát triển để gỡ lỗi, kiểm thử, đánh giá và giám sát các ứng dụng LLM.

1.2 Vai trò của LangChain trong Retrieval-Augmented Generation (RAG)

Retrieval-Augmented Generation (RAG) là một kỹ thuật hữu ích để giải quyết một trong những thách thức chính liên quan đến các Mô hình Ngôn ngữ Lớn (LLMs): hiện tượng "ảo giác" (hallucinations). Bằng cách tích hợp các nguồn tri thức bên ngoài, hệ thống RAG có thể cung cấp cho các LLM thông tin phù hợp và chính xác trong quá trình tạo nội dung. Điều này đảm bảo rằng đầu ra được tạo ra có độ chính xác cao hơn, đáng tin cậy hơn và phù hợp với ngữ cảnh hơn. Chúng ta sẽ đi sâu hơn về các phương pháp RAG trong chương 7 và 8.

LangChain cung cấp các trừu tượng hóa hữu ích để xây dựng hệ thống RAG. Với các thành phần truy xuất của LangChain, các nhà phát triển có thể dễ dàng tích hợp các nguồn dữ liệu bên ngoài, chẳng hạn như tài liệu hoặc cơ sở dữ liệu, vào các ứng dụng sử dụng LLM. Điều này cho phép các mô hình truy cập và sử dụng thông tin phù hợp trong quá trình tạo nội dung, từ đó tạo ra đầu ra chính xác hơn.

1.3 Các Khái Niệm và Thành Phần Chính của LangChain

  • Prompts: LangChain cung cấp công cụ để tạo và làm việc với các mẫu prompt. Mẫu prompt là các công thức được định nghĩa sẵn để tạo prompt cho các mô hình ngôn ngữ.
  • Output Parsers: Output parsers là các lớp giúp cấu trúc lại phản hồi của mô hình ngôn ngữ. Chúng chịu trách nhiệm lấy đầu ra của một LLM và chuyển đổi nó thành định dạng phù hợp hơn.
  • Retrievers: Retrievers nhận một chuỗi truy vấn làm đầu vào và trả về danh sách các Tài liệu (Documents) làm đầu ra. LangChain cung cấp nhiều loại truy xuất nâng cao và cũng tích hợp với nhiều dịch vụ truy xuất từ bên thứ ba.
  • Document Loaders: Một Document là một đoạn văn bản kèm theo siêu dữ liệu liên quan. Document loaders cung cấp phương thức “load” để tải dữ liệu dưới dạng tài liệu từ một nguồn được cấu hình.
  • Text Splitters: Text splitters chia một tài liệu hoặc văn bản thành các đoạn nhỏ hơn hoặc các phân đoạn. LangChain có nhiều bộ chuyển đổi tài liệu tích hợp sẵn có thể chia nhỏ, kết hợp và lọc tài liệu.
  • Indexes: Một index trong LangChain là một cấu trúc dữ liệu giúp tổ chức và lưu trữ dữ liệu để phục vụ việc tìm kiếm nhanh và hiệu quả.
  • Embeddings models: Lớp Embeddings được thiết kế để tương tác với các mô hình nhúng văn bản. Nó cung cấp một giao diện chuẩn cho nhiều nhà cung cấp mô hình nhúng khác nhau như OpenAI, Cohere, Hugging Face, v.v.
  • Vector Stores: Một vector store lưu trữ dữ liệu đã được nhúng và thực hiện tìm kiếm theo vector. Việc nhúng và lưu trữ các vector nhúng là một trong những cách phổ biến nhất để lưu trữ và tìm kiếm trên dữ liệu phi cấu trúc.
  • Agents: Agents là các thành phần ra quyết định, quyết định kế hoạch hành động hoặc quy trình thực hiện.
  • Chains: Là các chuỗi lệnh, có thể là gọi đến một LLM, một công cụ, hoặc một bước tiền xử lý dữ liệu. Chúng tích hợp nhiều thành phần khác nhau vào một giao diện thân thiện với người dùng, bao gồm mô hình, prompt, bộ nhớ, phân tích đầu ra và khả năng gỡ lỗi.
  • Tool: Tool là một chức năng cụ thể giúp mô hình ngôn ngữ thu thập thông tin cần thiết để hoàn thành nhiệm vụ. Tool có thể bao gồm từ tìm kiếm Google, truy vấn cơ sở dữ liệu, đến Python REPL và các chuỗi lệnh khác.
  • Memory: Tính năng này ghi lại các tương tác trước đó với mô hình ngôn ngữ, cung cấp ngữ cảnh cho các tương tác sau này.
  • Callbacks: LangChain cung cấp hệ thống callbacks cho phép bạn can thiệp vào các giai đoạn khác nhau của ứng dụng LLM. Điều này hữu ích cho việc ghi log, giám sát và truyền phát dữ liệu.

Trong chương này, chúng ta sẽ tìm hiểu từng thành phần và sử dụng chúng để xây dựng các ứng dụng dựa trên RAG.

2. Tổng Quan về Agents và Tools trong LangChain

2.1 Agents là gì

Agents trong LangChain thực hiện nhiệm vụ bằng cách sử dụng các chuỗi lệnh (chains), prompt, bộ nhớ (memory) và công cụ (tools). Những agents này có thể thực hiện nhiều loại tác vụ khác nhau, bao gồm việc thực hiện các bước theo trình tự đã định, tương tác với các hệ thống bên ngoài như Gmail hoặc cơ sở dữ liệu SQL, và nhiều hơn nữa. Trong Chương 9, chúng ta sẽ thảo luận chi tiết hơn về cách xây dựng agents.

LangChain cung cấp một loạt công cụ và tính năng để hỗ trợ tùy chỉnh agents cho nhiều ứng dụng khác nhau.

2.2 Các Loại Agent

LangChain có nhiều loại agent, mỗi loại có các chức năng chuyên biệt riêng.

  • Zero-shot ReAct: Agent này sử dụng framework ReAct để quyết định việc sử dụng công cụ dựa trên mô tả. Nó được gọi là “zero-shot” vì chỉ dựa vào mô tả công cụ mà không cần ví dụ sử dụng cụ thể.
  • Structured Input ReAct: Agent này xử lý các công cụ yêu cầu nhiều đầu vào.
  • OpenAI Functions Agent: Agent này được phát triển chuyên biệt để thực hiện các lệnh gọi hàm (function call) cho các mô hình đã được tinh chỉnh và tương thích với các mô hình tiên tiến như gpt-3.5-turbo và gpt-4-turbo.
  • Self-Ask with Search Agent: Agent này tìm kiếm câu trả lời thực tế cho các câu hỏi, chuyên sử dụng công cụ “Intermediate Answer”. Nó tương tự với phương pháp được đề cập trong nghiên cứu gốc về self-ask with search.
  • ReAct Document Store Agent: Agent này kết hợp các công cụ “Search” và “Lookup” để cung cấp một quy trình suy luận liên tục.
  • Plan-and-Execute Agents: Loại này lập kế hoạch bao gồm nhiều hành động và thực hiện chúng theo thứ tự. Các agents này đặc biệt hiệu quả với các nhiệm vụ phức tạp hoặc kéo dài, duy trì sự tập trung ổn định vào các mục tiêu dài hạn. Tuy nhiên, một điểm đánh đổi khi sử dụng các agent này là khả năng tăng độ trễ.

Về bản chất, các agent xác định logic để lựa chọn hành động và quyết định sử dụng nhiều công cụ, một công cụ, hoặc không dùng công cụ nào, tùy thuộc vào tác vụ.

2.3 Các Công Cụ Có Sẵn và Công Cụ Tùy Chỉnh

Danh sách các công cụ tích hợp LangChain với các công cụ khác có thể truy cập tại phần Toolkits trong tài liệu LangChain. Một số ví dụ bao gồm:

  • Python tool: Dùng để tạo và thực thi mã Python nhằm trả lời một câu hỏi.
  • JSON tool: Dùng khi tương tác với một tệp JSON không thể vừa trong cửa sổ ngữ cảnh của LLM.
  • CSV tool: Dùng để tương tác với các tệp CSV.

Các công cụ tùy chỉnh mở rộng khả năng của agents, cho phép chúng được điều chỉnh cho các nhiệm vụ và tương tác cụ thể. Những công cụ này cung cấp chức năng chuyên biệt theo nhiệm vụ và tính linh hoạt cho các hành vi phù hợp với các trường hợp sử dụng đặc thù.

Mức độ tùy chỉnh phụ thuộc vào việc phát triển các tương tác nâng cao. Trong các trường hợp như vậy, các công cụ có thể được điều phối để thực hiện các hành vi phức tạp. Ví dụ bao gồm việc tạo câu hỏi, thực hiện tìm kiếm trên web để lấy câu trả lời, và tổng hợp nội dung thông tin.

3. Xây Dựng Ứng Dụng Dựa Trên LLM với LangChain

3.1 Prompt Templates

LangChain cung cấp các công cụ tiêu chuẩn để tương tác với các mô hình ngôn ngữ lớn (LLM). ChatPromptTemplate được sử dụng để cấu trúc các cuộc hội thoại với mô hình AI, giúp kiểm soát dòng chảy và nội dung của cuộc trò chuyện. LangChain sử dụng các mẫu prompt dạng tin nhắn để xây dựng và làm việc với prompt, nhằm tối đa hóa tiềm năng của mô hình trò chuyện bên dưới.

Các loại prompt khác nhau phục vụ các mục đích khác nhau khi tương tác với mô hình trò chuyện. SystemMessagePromptTemplate cung cấp hướng dẫn ban đầu, ngữ cảnh hoặc dữ liệu cho mô hình AI. Ngược lại, HumanMessagePromptTemplate bao gồm các tin nhắn từ người dùng mà mô hình AI sẽ phản hồi.

Để minh họa, chúng ta sẽ tạo một trợ lý dựa trên trò chuyện để tìm thông tin về phim. Trước tiên, lưu khóa API OpenAI của bạn vào biến môi trường dưới tên "OPENAI_API_KEY", và đảm bảo rằng các gói cần thiết đã được cài đặt bằng lệnh sau:

Kết quả:

Inception là một bộ phim hành động khoa học viễn tưởng năm 2010 do Christopher Nolan đạo diễn. Bộ phim có sự tham gia của Leonardo DiCaprio, Ken Watanabe, Joseph Gordon-Levitt, Ellen Page, Tom Hardy, Dileep Rao, Cillian Murphy, Tom Berenger, và Michael Caine. Cốt truyện theo chân một tên trộm chuyên nghiệp đánh cắp thông tin bằng cách xâm nhập vào tiềm thức của mục tiêu. Anh ta được đề nghị xóa bỏ tiền án nếu có thể cấy ý tưởng của người khác vào tiềm thức của một mục tiêu. Bộ phim đã thành công vang dội về mặt phê bình lẫn thương mại, thu về hơn 829 triệu USD trên toàn cầu và nhận được nhiều giải thưởng, bao gồm bốn giải Oscar.

Đối tượng to_messages trong LangChain là một công cụ hữu ích để chuyển đổi giá trị đã được định dạng từ một mẫu prompt trò chuyện thành danh sách các đối tượng tin nhắn. Tính năng này đặc biệt hữu ích khi làm việc với các mô hình trò chuyện, cung cấp một phương pháp có cấu trúc để quản lý cuộc trò chuyện. Điều này giúp mô hình trò chuyện hiểu rõ ngữ cảnh và vai trò của các tin nhắn một cách hiệu quả.

3.2 Ví Dụ Về Summarization Chain

Một chuỗi tóm tắt (summarization chain) tương tác với các nguồn dữ liệu bên ngoài để truy xuất thông tin phục vụ cho giai đoạn tạo nội dung. Quá trình này có thể bao gồm việc rút gọn văn bản dài hoặc sử dụng các nguồn dữ liệu cụ thể để trả lời câu hỏi.

Để khởi tạo quy trình này, mô hình ngôn ngữ được cấu hình bằng lớp OpenAI với thiết lập temperature = 0 để đảm bảo đầu ra hoàn toàn xác định (deterministic). Hàm load_summarize_chain nhận một thể hiện của mô hình ngôn ngữ và thiết lập một chuỗi tóm tắt được xây dựng sẵn. Ngoài ra, lớp PyPDFLoader dùng để tải các tệp PDF và chuyển chúng thành định dạng mà LangChain có thể xử lý hiệu quả.

Cần phải cài đặt gói pypdf để thực thi đoạn mã sau. Dù nên sử dụng phiên bản mới nhất của gói này, đoạn mã đã được kiểm thử với phiên bản 3.10.0.

Kết quả:

Tài liệu này cung cấp bản tóm tắt các lệnh hữu ích của Linux cho việc khởi động và tắt máy, truy cập và gắn kết hệ thống tệp, tìm kiếm tệp và văn bản trong tệp, hệ thống X Window, di chuyển, sao chép, xóa và xem tệp, cài đặt phần mềm, quản trị người dùng, các mẹo và thủ thuật ít người biết, các tệp cấu hình và chức năng của chúng, quyền truy cập tệp, phím tắt trong X, in ấn, và liên kết tới tài liệu chính thức "Linux pocket protector".

Trong ví dụ này, đoạn mã sử dụng chuỗi tóm tắt tiêu chuẩn thông qua hàm load_summarize_chain. Tuy nhiên, bạn cũng có thể cung cấp các mẫu prompt tùy chỉnh để điều chỉnh quá trình tóm tắt theo yêu cầu cụ thể.

3.3 Ví Dụ Về Chuỗi Hỏi Đáp (QA Chain)

LangChain có thể cấu trúc prompt theo nhiều cách khác nhau, bao gồm cả việc đặt các câu hỏi chung cho mô hình ngôn ngữ.

⚠ Hãy lưu ý về khả năng xuất hiện "ảo giác" (hallucinations) — tức là khi mô hình có thể tạo ra thông tin không đúng sự thật. Chúng ta có thể triển khai hệ thống tạo nội dung tăng cường bởi truy xuất (retrieval-augmented generation) để giảm thiểu vấn đề này. Trong Chương 7, chúng ta sẽ xem cách LangChain hỗ trợ triển khai hệ thống như vậy với Retrieval Chain.

Chúng ta thiết lập một mẫu prompt tùy chỉnh bằng cách khởi tạo một thể hiện của lớp PromptTemplate. Chuỗi mẫu này bao gồm một chỗ chèn {question} đại diện cho truy vấn đầu vào, theo sau là một ký tự xuống dòng và từ khóa "Answer:". Tham số input_variables được gán một danh sách chứa các placeholder hiện có trong prompt (trong trường hợp này là một câu hỏi), và chúng sẽ được thay thế bằng đối số đầu vào thông qua phương thức .run() của template.

Tiếp theo, một thể hiện của mô hình OpenAI gpt-3.5-turbo được tạo với tham số temperature = 0 để đảm bảo đầu ra hoàn toàn xác định. Thể hiện này được khởi tạo bằng lớp OpenAI, với các tham số model_nametemperature được chỉ định. Sau đó, một chuỗi hỏi đáp (question-answering chain) được thiết lập bằng lớp LLMChain. Constructor của lớp LLMChain yêu cầu hai đối số: llm là thể hiện của mô hình OpenAI, và prompt là mẫu prompt tùy chỉnh được tạo trước đó.

Việc thực hiện các bước trên cho phép xử lý hiệu quả các câu hỏi đầu vào bằng chuỗi hỏi đáp tùy chỉnh. Cấu hình này giúp tạo ra các câu trả lời phù hợp bằng cách tận dụng mô hình OpenAI cùng với mẫu prompt tùy chỉnh.

Đầu ra:

Ý nghĩa của cuộc sống là điều mang tính chủ quan và có thể khác nhau tùy theo từng người. Với một số người, đó có thể là tìm kiếm hạnh phúc và sự viên mãn, trong khi với người khác, có thể là tạo ra sự khác biệt cho thế giới. Cuối cùng, ý nghĩa của cuộc sống là do mỗi cá nhân tự định nghĩa.

Ví dụ này cho thấy cách LangChain cho phép tích hợp các mẫu prompt vào các ứng dụng hỏi đáp. Framework này có thể được mở rộng để bao gồm các thành phần bổ sung như tạo nội dung tăng cường dữ liệu, agents hoặc tính năng bộ nhớ (memory) để phát triển các ứng dụng phức tạp hơn.

4. Xây Dựng Trình Tóm Tắt Tin Tức

Dự án này sẽ hướng dẫn bạn xây dựng một trình tóm tắt tin tức sử dụng mô hình GPT-4 của OpenAI và LangChain. Hệ thống này có khả năng thu thập bài báo trực tuyến, trích xuất tiêu đề và nội dung, sau đó tạo ra bản tóm tắt ngắn gọn.

4.1 Quy Trình Thực Hiện

Dưới đây là các bước chúng ta sẽ thực hiện trong dự án này:

Pipeline của trình tóm tắt bài báo sẽ bao gồm các bước thu thập dữ liệu, phân tích cú pháp, tạo prompt và sinh kết quả.

  1. Cài đặt các thư viện cần thiết: Đảm bảo bạn đã cài đặt đầy đủ các thư viện cần dùng, bao gồm requests, newspaper3klangchain.
  1. Thu thập bài báo: Sử dụng thư viện requests để lấy nội dung bài báo từ các URL được chỉ định.
  1. Trích xuất tiêu đề và nội dung: Sử dụng thư viện newspaper để phân tích cú pháp HTML đã thu thập, trích xuất tiêu đề và văn bản của bài báo.
  1. Tiền xử lý văn bản: Chuẩn bị văn bản đã trích xuất để gửi vào ChatGPT (làm sạch và xử lý văn bản).
  1. Tạo bản tóm tắt: Sử dụng GPT-4 để tóm tắt nội dung văn bản của bài báo.
  1. Xuất kết quả: Hiển thị bản tóm tắt đã tạo cùng với tiêu đề gốc, giúp người dùng nhanh chóng nắm được các điểm chính của mỗi bài viết.

4.2 Các Bước Xây Dựng Trình Tóm Tắt Bài Báo Tin Tức

Truy cập trang web OpenAI để lấy khóa API của bạn. Bạn cần tạo tài khoản và được cấp quyền truy cập vào API. Sau khi đăng nhập, đi tới phần API keys và sao chép khóa của bạn.

Sử dụng lệnh sau để cài đặt các gói cần thiết:

Cài đặt gói newspaper3k, phiên bản đã được kiểm thử trong sách là 0.2.8:

Trong tập lệnh Python hoặc Jupyter Notebook của bạn, đặt khóa API làm biến môi trường với tên OPENAI_API_KEY. Để thiết lập từ tệp .env, sử dụng hàm load_dotenv như sau:

Chúng ta đã chọn một số URL bài báo tin tức tiêu biểu để tạo bản tóm tắt. Đoạn mã dưới đây sử dụng thư viện requests để truy xuất bài viết từ danh sách các URL với tiêu đề User-Agent tùy chỉnh. Sau đó, sử dụng thư viện newspaper để trích xuất tiêu đề và nội dung văn bản của từng bài:

Code dưới đây nhập các lớp và hàm cần thiết từ LangChain và khởi tạo một thể hiện của ChatOpenAI với temperature = 0 để đảm bảo phản hồi có kiểm soát và nhất quán. Nó cũng nhập các lớp schema liên quan đến tin nhắn trò chuyện, cho phép quản lý hiệu quả các tác vụ dựa trên trò chuyện. code này thiết lập prompt và chèn nội dung bài báo vào:

HumanMessage là một định dạng dữ liệu có cấu trúc, dùng để đại diện cho các tin nhắn từ người dùng trong các tương tác trò chuyện. Trong cấu hình này, lớp ChatOpenAI được sử dụng để tương tác với mô hình AI, còn schema HumanMessage cung cấp một định dạng chuẩn hóa cho các tin nhắn người dùng.

Mẫu prompt được thiết kế bao gồm các placeholder cho tiêu đề và nội dung bài báo. Các placeholder này sau đó sẽ được thay thế bằng các giá trị thực tế từ article_titlearticle_text. Phương pháp này giúp đơn giản hóa quá trình tạo prompt động.

Ví dụ kết quả đầu ra:

Meta, trước đây là Facebook, đã ra mắt một siêu máy tính AI có tên là AI Research SuperCluster (RSC) mà công ty tuyên bố sẽ là nhanh nhất thế giới khi hoàn tất vào giữa năm 2022. Mục tiêu là huấn luyện các mô hình với hàng nghìn tỷ tham số và được sử dụng cho các tác vụ như nhận diện nội dung gây hại trên nền tảng của họ. Meta kỳ vọng RSC sẽ nhanh hơn 20 lần so với các cụm máy hiện tại sử dụng V100, và nhanh hơn 9 lần khi chạy thư viện NVIDIA Collective Communication Library. Siêu máy tính này được thiết kế với các biện pháp kiểm soát bảo mật và quyền riêng tư để Meta có thể sử dụng dữ liệu thực tế từ hệ thống sản xuất của mình trong quá trình huấn luyện mô hình sản xuất.

Bạn cũng có thể thay đổi prompt để nhận bản tóm tắt dưới dạng danh sách gạch đầu dòng:

Ví dụ đầu ra:

  • Meta (trước đây là Facebook) công bố AI Research SuperCluster (RSC), một siêu máy tính AI được tuyên bố là nhanh nhất thế giới.
  • RSC chưa hoàn thiện, nhưng các nhà nghiên cứu đã bắt đầu sử dụng nó để huấn luyện các mô hình lớn trong xử lý ngôn ngữ tự nhiên (NLP) và thị giác máy tính.
  • Dự kiến RSC sẽ được hoàn thiện vào giữa năm 2022, nhằm huấn luyện các mô hình có hàng nghìn tỷ tham số.
  • Meta hy vọng RSC sẽ giúp xây dựng các hệ thống AI mới cho dịch giọng nói theo thời gian thực và mở đường cho các công nghệ metaverse.
  • RSC được kỳ vọng nhanh hơn 20 lần so với các cụm máy hiện tại của Meta sử dụng GPU V100.
  • Một mô hình với hàng chục tỷ tham số có thể được huấn luyện trong 3 tuần với RSC, thay vì 9 tuần như trước đây.
  • RSC được thiết kế với các biện pháp kiểm soát bảo mật và quyền riêng tư, cho phép Meta sử dụng dữ liệu thực tế từ hệ thống sản xuất để huấn luyện.
  • Meta tin rằng đây là lần đầu tiên các yếu tố về hiệu năng, độ tin cậy, bảo mật và quyền riêng tư được xử lý ở quy mô lớn như vậy.

5. Giới Thiệu Về LlamaIndex

LlamaIndex, giống như các framework công cụ khác dành cho LLM, cho phép dễ dàng tạo ra các ứng dụng được hỗ trợ bởi mô hình ngôn ngữ lớn (LLM) với các trừu tượng hữu ích và đơn giản.

Khi chúng ta muốn phát triển các hệ thống retrieval-augmented generation (RAG), LlamaIndex giúp đơn giản hóa việc kết hợp giữa trích xuất thông tin liên quan từ cơ sở dữ liệu lớn và khả năng tạo văn bản của các LLM. Phần Giới thiệu này sẽ trình bày tổng quan về các khả năng của LlamaIndex và một số khái niệm cốt lõi. Các hệ thống RAG sẽ được trình bày chi tiết hơn trong Chương 7 và 8.

5.1 Vector Stores và Embeddings

Vector store là các cơ sở dữ liệu dùng để lưu trữ và quản lý embeddings – tức các danh sách dài các con số biểu diễn ý nghĩa của dữ liệu đầu vào. Embeddings nắm bắt được bản chất của dữ liệu, có thể là từ ngữ, hình ảnh hoặc các dạng dữ liệu khác, tùy thuộc vào cách thiết kế mô hình embedding.

Vector store giúp lưu trữ, truy tìm và phân tích hiệu quả một lượng lớn dữ liệu phức tạp. Bằng cách chuyển dữ liệu thành embeddings, vector store cho phép tìm kiếm dựa trên ý nghĩa và mức độ tương đồng, thay vì chỉ dựa trên khớp từ khóa thông thường.

Mô hình embedding là các công cụ AI được huấn luyện để chuyển đổi dữ liệu đầu vào thành các vector. Loại dữ liệu đầu vào sẽ phụ thuộc vào trường hợp sử dụng cụ thể và cách thiết kế mô hình embedding. Ví dụ:

  1. Trong xử lý văn bản, mô hình embedding có thể ánh xạ từ ngữ thành vector dựa trên cách sử dụng của chúng trong một tập văn bản lớn.
  1. Trong thị giác máy tính, mô hình embedding có thể ánh xạ hình ảnh thành vector phản ánh các đặc trưng và ý nghĩa thị giác của ảnh.
  1. Trong hệ thống gợi ý, mô hình embedding có thể biểu diễn người dùng và sản phẩm dưới dạng vector dựa trên các hành vi tương tác và mức độ yêu thích.

Khi dữ liệu đã được chuyển thành embeddings, vector store có thể nhanh chóng tìm ra các mục tương tự, vì các đối tượng giống nhau sẽ có vector gần nhau trong không gian vector.

Tìm kiếm ngữ nghĩa (semantic search) – sử dụng vector store – hiểu được ý nghĩa của truy vấn bằng cách so sánh embedding của truy vấn đó với các embedding đã lưu trữ. Điều này giúp kết quả tìm kiếm trở nên phù hợp và sát với ý định thực sự của người dùng, bất kể họ sử dụng từ ngữ cụ thể nào hoặc loại dữ liệu đang được tìm kiếm là gì.

Vector store cho phép các tìm kiếm có ý nghĩa và truy xuất theo mức độ tương đồng, khiến nó trở thành một công cụ mạnh mẽ để xử lý các tập dữ liệu lớn và phức tạp trong nhiều ứng dụng AI.

5.2 Deep Lake Vector Store

Trong các ví dụ tiếp theo trong cuốn sách này, chúng ta sẽ sử dụng Deep Lake làm cơ sở dữ liệu vector store để minh họa cách xây dựng và quản lý các ứng dụng AI một cách hiệu quả. Tuy nhiên, điều quan trọng cần lưu ý là có nhiều cơ sở dữ liệu vector store khác nhau, bao gồm cả mã nguồn mở và các tùy chọn dịch vụ được quản lý.

Việc lựa chọn vector store nào phụ thuộc vào các yếu tố như yêu cầu cụ thể của ứng dụng AI, mức độ hỗ trợ cần thiết và ngân sách hiện có. Việc đánh giá và chọn vector store phù hợp là tùy thuộc vào bạn.

Deep Lake là một cơ sở dữ liệu vector store được thiết kế để hỗ trợ các ứng dụng AI, đặc biệt là các ứng dụng liên quan đến Large Language Models (LLMs) và học sâu (deep learning). Nó cung cấp định dạng lưu trữ được tối ưu hóa để lưu trữ nhiều loại dữ liệu khác nhau, bao gồm embeddings, âm thanh, văn bản, video, hình ảnh, tài liệu PDF và dữ liệu chú thích (annotations).

Deep Lake cung cấp các tính năng như truy vấn, tìm kiếm vector, truyền dữ liệu theo luồng (streaming) để huấn luyện mô hình ở quy mô lớn, quản lý phiên bản dữ liệu (data versioning) và theo dõi nguồn gốc dữ liệu (lineage). Nó tích hợp với các công cụ như LangChain, LlamaIndex, Weights & Biases, và nhiều công cụ khác, giúp các nhà phát triển xây dựng và quản lý ứng dụng AI hiệu quả hơn.

Một số tính năng cốt lõi của Deep Lake bao gồm:

  1. Hỗ trợ đa nền tảng đám mây: Deep Lake hoạt động với nhiều nhà cung cấp lưu trữ đám mây như S3, GCP, và Azure, cũng như hỗ trợ lưu trữ cục bộ và lưu trữ trong bộ nhớ.
  1. Nén gốc và chỉ mục dạng NumPy "lười biếng": Cho phép dữ liệu được lưu ở định dạng nén gốc, đồng thời cung cấp khả năng cắt lát (slicing), chỉ mục và lặp lại dữ liệu một cách hiệu quả.
  1. Kiểm soát phiên bản tập dữ liệu: Deep Lake mang các khái niệm như commit, branch, và checkout vào việc quản lý tập dữ liệu, giúp cải thiện khả năng cộng tác và tái lập kết quả.
  1. Trình nạp dữ liệu tích hợp cho các framework deep learning phổ biến: Deep Lake cung cấp các dataloader cho PyTorchTensorFlow, giúp đơn giản hóa quá trình huấn luyện mô hình trên các tập dữ liệu lớn.
  1. Tích hợp với nhiều công cụ: Deep Lake tích hợp với các công cụ như LangChainLlamaIndex để xây dựng ứng dụng LLM, Weights & Biases để theo dõi dữ liệu trong quá trình huấn luyện mô hình, và MMDetection cho các tác vụ phát hiện đối tượng (object detection).

Bằng cách cung cấp nhiều tính năng và tích hợp mạnh mẽ, Deep Lake hướng tới việc hỗ trợ phát triển và triển khai các ứng dụng AI trong nhiều trường hợp sử dụng khác nhau. Mặc dù chúng ta sẽ sử dụng Deep Lake trong các ví dụ trong sách, nhưng các khái niệm và kỹ thuật được trình bày có thể áp dụng cho các cơ sở dữ liệu vector store khác.

5.3 Data Connectors (Kết Nối Dữ Liệu)

Hiệu suất của các ứng dụng dựa trên RAG (retrieval-augmented generation) được cải thiện đáng kể khi chúng truy cập vào một vector store tổng hợp thông tin từ nhiều nguồn khác nhau. Tuy nhiên, việc xử lý dữ liệu ở các định dạng khác nhau mang đến nhiều thách thức cụ thể.

Data connectors, còn gọi là Readers, đóng vai trò quan trọng trong quy trình này. Chúng phân tích cú pháp và chuyển đổi dữ liệu thành định dạng Document dễ quản lý hơn — bao gồm văn bản và metadata cơ bản — từ đó đơn giản hóa quá trình đưa dữ liệu vào hệ thống. Chúng tự động thu thập dữ liệu từ nhiều nguồn như API, file PDF, hoặc cơ sở dữ liệu SQL và chuyển đổi dữ liệu đó sang định dạng phù hợp.

Dự án mã nguồn mở LlamaHub lưu trữ nhiều data connector khác nhau để tích hợp các định dạng dữ liệu phong phú vào mô hình LLM.

Bạn có thể truy cập repository của LlamaHub để xem danh sách các loader, nơi có nhiều tích hợp và nguồn dữ liệu. Trong ví dụ này, chúng ta sẽ kiểm thử tích hợp với Wikipedia.

5.3.1 Cài đặt Thư Viện và Cấu Hình API

Trước khi sử dụng các loader, bạn cần cài đặt các gói cần thiết và thiết lập khóa API OpenAI cho LlamaIndex. Bạn có thể lấy API key từ trang web OpenAI và đặt nó vào biến môi trường OPENAI_API_KEY.

LlamaIndex mặc định sử dụng mô hình gpt-3.5-turbo để sinh văn bản và text-embedding-ada-002 để tạo embeddings.

Chúng ta cũng đã tích hợp một hệ thống logging vào code. Logging giúp theo dõi các hành động xảy ra khi ứng dụng chạy, hỗ trợ quá trình phát triển, gỡ lỗi, và hiểu rõ những gì chương trình đang thực hiện. Trong môi trường production, mô-đun logging có thể được cấu hình để ghi log vào file hoặc dịch vụ giám sát log.

⚠ Cấu hình trên sẽ ghi log ra stdout với mức độ từ INFO trở lên. Để chi tiết hơn, bạn có thể sử dụng logging.debug.

5.3.2 Tải WikipediaReader từ LlamaHub

Bây giờ, hãy sử dụng phương thức download_loader để truy cập các tích hợp từ LlamaHub, và kích hoạt chúng bằng cách truyền tên tích hợp vào lớp tương ứng. Trong ví dụ này, lớp WikipediaReader nhận danh sách tiêu đề trang và trả về nội dung dưới dạng các đối tượng Document.

Thông tin được truy xuất này có thể được lưu lại và sử dụng để mở rộng cơ sở tri thức của chatbot hoặc ứng dụng AI.

5.3.3 Nodes

Trong LlamaIndex, sau khi ingest dữ liệu, các tài liệu sẽ trải qua một bước xử lý để chuyển đổi thành các đơn vị nhỏ hơn, gọi là Node. Các node được trích xuất từ tài liệu gốc và bao gồm nội dung chính, metadata và thông tin ngữ cảnh.

LlamaIndex cung cấp lớp NodeParser, giúp tự động chuyển nội dung tài liệu thành các node có cấu trúc. Trong ví dụ này, ta sử dụng SimpleNodeParser để chuyển danh sách tài liệu thành node.

Đoạn code trên đã chia hai tài liệu Wikipedia thành 48 đoạn nhỏ hơn (node), với một phần nội dung chồng lặp nhẹ để giữ tính liên kết giữa các đoạn.

5.4 Indices (Chỉ Mục)

LlamaIndex có khả năng lập chỉ mục và tìm kiếm qua nhiều định dạng dữ liệu khác nhau, bao gồm tài liệu, tệp PDF và truy vấn từ cơ sở dữ liệu. Indexing là một bước nền tảng trong việc lưu trữ dữ liệu vào cơ sở dữ liệu. Quá trình này bao gồm việc chuyển đổi dữ liệu phi cấu trúc thành embeddings để nắm bắt ý nghĩa ngữ nghĩa. Sự chuyển đổi này giúp tối ưu hóa định dạng dữ liệu, cho phép truy xuất và truy vấn dễ dàng hơn.

LlamaIndex cung cấp nhiều loại chỉ mục, mỗi loại phục vụ một mục đích khác nhau:

5.4.1 Summary Index

Summary Index trích xuất bản tóm tắt từ mỗi tài liệu và lưu trữ cùng với tất cả các node của tài liệu đó. Việc có bản tóm tắt tài liệu rất hữu ích, đặc biệt khi việc khớp embeddings nhỏ của từng node với truy vấn không phải lúc nào cũng rõ ràng.

5.4.2 Vector Store Index

Vector Store Index tạo embeddings trong quá trình xây dựng chỉ mục để xác định top-k node tương đồng nhất với một truy vấn. Đây là loại chỉ mục phù hợp cho các ứng dụng quy mô nhỏ và dễ dàng mở rộng cho các bộ dữ liệu lớn hơn bằng cách sử dụng các cơ sở dữ liệu vector hiệu năng cao.

Quy trình bao gồm: truy xuất các node top-k và chuyển tiếp chúng để tạo phản hồi cuối cùng.

5.4.3 Ví dụ: Tạo Index Từ Tài Liệu Wikipedia

Trong ví dụ này, chúng ta sẽ lưu các tài liệu Wikipedia đã thu thập vào vector store Deep Lake và xây dựng một đối tượng index dựa trên dữ liệu đó. Sử dụng lớp DeepLakeVectorStore, chúng ta sẽ tạo tập dữ liệu trong Activeloop và gán tài liệu vào đó.

>_ Trước tiên, thiết lập khóa API cho OpenAI và Activeloop:

Sử dụng lớp DeepLakeVectorStore với tham số dataset_path để kết nối với nền tảng. Thay genai360 bằng ID tổ chức của bạn (mặc định là tài khoản Activeloop) để lưu tập dữ liệu vào không gian làm việc của bạn. Đoạn mã sau sẽ tạo ra một tập dữ liệu rỗng:

Deep Lake dataset của bạn đã được tạo thành công!

>_ Tạo Chỉ Mục Từ Vector Store

Thiết lập ngữ cảnh lưu trữ bằng cách sử dụng lớp StorageContext và chỉ định dataset Deep Lake làm nguồn. Truyền đối tượng lưu trữ này vào lớp VectorStoreIndex để tạo chỉ mục (embedding) và lưu kết quả vào dataset đã chỉ định.

Kết quả đầu ra khi upload dữ liệu:

Cơ sở dữ liệu Deep Lake lưu trữ và truy xuất các vector có số chiều cao một cách hiệu quả.

5.5 Query Engines (Công Cụ Truy Vấn)

Bước tiếp theo là sử dụng các chỉ mục đã được tạo để tìm kiếm dữ liệu. Query Engine là một pipeline kết hợp giữa RetrieverResponse Synthesizer. Pipeline này sẽ truy xuất các node dựa trên chuỗi truy vấn, sau đó gửi các node đó đến LLM để xây dựng câu trả lời.

Một query engine có thể được tạo bằng cách gọi phương thức .as_query_engine() trên một chỉ mục đã tạo trước đó.

Đoạn mã dưới đây sử dụng tài liệu từ trang Wikipedia để xây dựng một Vector Store Index thông qua lớp GPTVectorStoreIndex. Phương thức .from_documents() giúp đơn giản hóa quy trình xây dựng chỉ mục từ các tài liệu đã xử lý. Sau khi chỉ mục được tạo, nó có thể được sử dụng để tạo đối tượng query_engine. Đối tượng này cho phép đặt câu hỏi về nội dung tài liệu thông qua phương thức .query().

Đầu ra:

NLP stands for Natural Language Processing.

Các chỉ mục này cũng có thể hoạt động như retriever độc lập, chỉ để truy xuất tài liệu liên quan đến một truy vấn. Tính năng này cho phép xây dựng một Query Engine tùy chỉnh (Custom Query Engine), cho phép kiểm soát chi tiết hơn về nhiều yếu tố như prompt hoặc định dạng đầu ra.

5.6 Routers

Routers giúp chọn ra retriever phù hợp nhất để trích xuất ngữ cảnh từ cơ sở tri thức. Chúng xác định query engine phù hợp nhất cho một tác vụ cụ thể, từ đó nâng cao hiệu suất và độ chính xác.

Chức năng này đặc biệt hữu ích trong các tình huống liên quan đến nhiều nguồn dữ liệu, khi mỗi nguồn mang thông tin khác nhau. Ví dụ: trong một ứng dụng sử dụng cả cơ sở dữ liệu SQL và Vector Store làm nguồn tri thức, router sẽ xác định nguồn dữ liệu nào là phù hợp nhất với truy vấn được đưa ra.

Bạn muốn tiếp tục phần tiếp theo về response synthesis, retrievers, hay triển khai end-to-end với LangChain không? Cứ gửi tiếp nội dung nhé!

5.7 Lưu và Tải Index Cục Bộ (Trên Ổ Đĩa)

Tất cả các ví dụ trước đó đều sử dụng chỉ mục được lưu trữ trên vector store đám mây như Deep Lake. Tuy nhiên, trong một số trường hợp, việc lưu dữ liệu trên ổ đĩa cục bộ là cần thiết — ví dụ như để kiểm thử nhanh chóng.

"Lưu trữ" (Storing) ở đây đề cập đến việc lưu dữ liệu của chỉ mục, bao gồm các nodeembeddings tương ứng, xuống ổ đĩa. Điều này được thực hiện bằng cách gọi phương thức persist() trên đối tượng storage_context liên kết với index:

Nếu chỉ mục đã tồn tại trên ổ đĩa, bạn có thể tải lại thay vì phải tạo lại từ đầu. Chỉ cần kiểm tra xem chỉ mục đã tồn tại hay chưa và xử lý phù hợp theo điều kiện. Dưới đây là cách thực hiện:

Kiểm Tra và Tải Chỉ Mục Từ Ổ Đĩa

Trong ví dụ này, hàm os.path.exists("./storage") được sử dụng để kiểm tra xem thư mục chứa dữ liệu lưu trữ chỉ mục đã tồn tại hay chưa.

Việc lưu và tải chỉ mục cục bộ giúp tiết kiệm thời gian khi chạy lại chương trình, đặc biệt trong các môi trường phát triển, thử nghiệm hoặc khi bạn muốn sử dụng lại chỉ mục đã tạo mà không cần tái tính toán embeddings.

6. So Sánh: LangChain vs. LlamaIndex vs. OpenAI Assistants

LangChainLlamaIndex là những công cụ hỗ trợ phát triển ứng dụng sử dụng mô hình ngôn ngữ lớn (LLMs), giúp đơn giản hóa quy trình xây dựng sản phẩm AI. Mỗi công cụ có thế mạnh riêng:

  • LangChain: Được thiết kế cho các tương tác động, giàu ngữ cảnh — rất phù hợp với ứng dụng như chatbot và trợ lý ảo. Điểm mạnh của LangChain nằm ở khả năng tạo prototype nhanh và dễ dàng xây dựng ứng dụng.
  • LlamaIndex: Tập trung vào việc xử lý, cấu trúc và truy cập dữ liệu riêng tư hoặc dữ liệu theo lĩnh vực cụ thể. LlamaIndex phù hợp cho các nhiệm vụ yêu cầu độ chính xác cao, đặc biệt khi làm việc với dữ liệu chuyên ngành. Thế mạnh chính là khả năng kết nối LLM với nhiều nguồn dữ liệu khác nhau.
  • OpenAI’s Assistants: Là một công cụ khác giúp xây dựng ứng dụng sử dụng LLMs, tương tự như LangChain và LlamaIndex. Thông qua Assistants API, bạn có thể tích hợp các trợ lý AI vào ứng dụng của mình với các tính năng chính:
  • Code Interpreter: chạy mã Python một cách an toàn.
  • Knowledge Retrieval: truy xuất thông tin.
  • Function Calling: tích hợp các hàm hoặc công cụ tuỳ chỉnh.

Dù các công cụ này có thể hoạt động độc lập, nhưng trong nhiều ứng dụng, kết hợp chúng lại có thể tận dụng được thế mạnh riêng biệt của từng công cụ.

6.1 So Sánh Nhanh

Định nghĩa

  • LangChain: Công cụ tương tác với LLM – có kiến trúc mô-đun và linh hoạt.
  • LlamaIndex: Framework dữ liệu dành cho LLM – mạnh về khả năng hỗ trợ RAG.
  • OpenAI Assistants: API dạng SaaS để tích hợp trợ lý AI vào ứng dụng.

Dữ liệu

  • LangChain:
  • Hỗ trợ các định dạng phổ biến như CSV, PDF, TXT,...
  • Tập trung vào Vector Stores.
  • Có các data loader tích hợp sẵn với các nền tảng như Discord, Slack, Notion,…
  • LlamaIndex:
  • Hiệu quả trong việc lập chỉ mục và truy xuất dữ liệu.
  • Hỗ trợ tối đa 20 tệp, mỗi tệp có thể lên tới 512MB.
  • Chấp nhận nhiều định dạng dữ liệu khác nhau.
  • OpenAI Assistants:
  • Có thể truy xuất kiến thức từ 20 tệp (tối đa 512MB mỗi tệp).
  • Hỗ trợ nhiều định dạng tệp tin khác nhau.

Tương tác với LLM

  • LangChain:
  • Có prompt templates để hỗ trợ tạo tương tác.
  • Linh hoạt, hỗ trợ nhiều chiến lược prompt, mô hình, và cách phân tích đầu ra.
  • Có thể thêm dữ liệu mới mà không cần tính lại toàn bộ embeddings.
  • LlamaIndex:
  • Tối ưu hóa việc chia nhỏ nội dung (chunking) bằng cách liên kết và sử dụng metadata.
  • Hỗ trợ xử lý dữ liệu đa phương thức (multimodality).
  • Chủ yếu dùng LLM để lập chỉ mục hoặc truy vấn dữ liệu.
  • OpenAI Assistants:
  • Sử dụng GPT-3.5 Turbo hoặc GPT-4, có thể tích hợp các mô hình đã tinh chỉnh.

Tối ưu hóa

  • LangChain: Không có hỗ trợ tối ưu hóa.
  • LlamaIndex: Có hỗ trợ tinh chỉnh mô hình LLM và embeddings.
  • OpenAI Assistants: Không có tùy chọn tinh chỉnh.

Truy vấn (Querying)

  • LangChain:
  • Sử dụng hàm retriever.
  • Hỗ trợ các kỹ thuật nâng cao như truy vấn phụ (subquestions), HyDe,...
  • Có khả năng định tuyến truy vấn giữa nhiều nguồn dữ liệu.
  • LlamaIndex:
  • Tạo luồng hội thoại (threads) và tin nhắn để theo dõi nội dung tương tác.
  • OpenAI Assistants:
  • Hỗ trợ lưu trữ và tiếp tục luồng hội thoại thông qua thread.
  • Truy vấn dựa trên bối cảnh hội thoại trước đó.

Agents

  • LangChain: Tích hợp với LangSmith để quan sát và theo dõi agent.
  • LlamaIndex: Có LlamaHub – nơi cung cấp nhiều loader và plugin.
  • OpenAI Assistants:
  • Hỗ trợ Code Interpreter (trình thực thi mã),
  • Knowledge Retriever (truy xuất kiến thức),
  • Function Calling (gọi hàm tùy chỉnh).

Tài liệu

  • LangChain:
  • Dễ debug.
  • Dễ tra cứu và hiểu cách sử dụng từng thành phần.
  • LlamaIndex:
  • Kể từ tháng 11/2023, tài liệu chủ yếu ở dạng hướng dẫn hoặc blog.
  • Khó debug hơn một chút so với LangChain.
  • OpenAI Assistants:
  • Có tài liệu rất tốt và rõ ràng.

Chi phí

  • LangChain: Miễn phí.
  • LlamaIndex: Miễn phí.
  • OpenAI Assistants:
  • $0.03 mỗi phiên sử dụng Code Interpreter.
  • $0.20/GB/assistant/ngày, cộng với chi phí sử dụng LLM.

6.2 Lời Khuyên Chiến Lược

Trước khi chọn công cụ phù hợp, hãy đánh giá kỹ lưỡng use case cụ thể của bạn và các yêu cầu kỹ thuật liên quan.

🔍 Câu hỏi chính cần đặt ra:
Bạn cần một hệ thống tương tác qua agents? Hay bạn cần khả năng tìm kiếm thông tin phức tạp, độ chính xác cao với dữ liệu riêng?
  • Dùng LangChain nếu bạn cần workflow linh hoạt, hỗ trợ tích hợp nhiều công cụ và tạo ứng dụng tương tác (như trợ lý ảo, chatbot).
  • Dùng LlamaIndex nếu bạn cần xử lý dữ liệu chuyên ngành, riêng tư hoặc có khối lượng lớn, và tập trung vào truy xuất ngữ nghĩa (semantic search).
  • Dùng OpenAI Assistants nếu bạn muốn triển khai nhanh, sử dụng như một dịch vụ SaaS, đặc biệt nếu bạn cần chạy mã, truy xuất kiến thức hoặc tích hợp logic tùy chỉnh bằng API đơn giản.

Tổng kết

Chương này đã giới thiệu một số framework giúp đơn giản hóa quá trình phát triển các ứng dụng sử dụng mô hình ngôn ngữ lớn (LLM), bao gồm: LangChain, LlamaIndexOpenAI’s Assistants API.

  • LangChain cung cấp các trừu tượng hóa để tích hợp nguồn dữ liệu, công cụ và LLM. Đây là một framework hữu ích cho việc quản lý prompt, truy xuất thông tin, embeddings và lập chỉ mục. Chúng ta đã minh họa khả năng của LangChain bằng cách xây dựng một trình tóm tắt bài báo đa ngôn ngữ sử dụng GPT-4.
  • LlamaIndex cũng giúp đơn giản hóa việc tạo ứng dụng dùng LLM và hệ thống retrieval-augmented generation (RAG). Framework này tập trung vào lập chỉ mục và truy xuất thông tin thông qua các thành phần như vector store, data connectors, nodes, indexing và Query Engine.
  • OpenAI’s Assistants API cho phép các nhà phát triển dễ dàng tạo trợ lý AI. API này cung cấp các tính năng như:
  • Code Interpreter: chạy mã Python một cách an toàn,
  • Knowledge Retrieval: tìm kiếm trong các tài liệu đã tải lên,
  • Function Calling: tích hợp các hàm hoặc công cụ tùy chỉnh.
    Mặc dù hiện vẫn đang trong giai đoạn beta, chúng ta có thể sử dụng nó qua Assistants Playground hoặc trực tiếp thông qua API. Trong chương tiếp theo về Agents, chúng ta sẽ xây dựng một ứng dụng sử dụng Assistants API.

Các framework và API được giới thiệu trong chương này mang lại cho các nhà phát triển nhiều tùy chọn để xây dựng ứng dụng dựa trên LLM, với các thế mạnh và trọng tâm riêng biệt. Chúng giúp đơn giản hóa quá trình tích hợp LLM và tạo ra các giải pháp AI mạnh mẽ, linh hoạt.

Bài viết liên quan:

Bình luận