AI Engineer Roadmap: Tích hợp đầu vào Đa phương thức với LangChain

Chào mừng trở lại với loạt bài “AI Engineer Roadmap”! Chúng ta đã cùng nhau đi qua nhiều chủ đề quan trọng, từ việc hiểu Kỹ Sư AI là gì, sự khác biệt giữa Kỹ sư AI và Kỹ sư ML, đến việc làm quen với các mô hình AI được huấn luyện trước, sử dụng OpenAI API, nghệ thuật viết prompt, và khám phá sức mạnh của Embeddings và cơ sở dữ liệu Vector để xây dựng các hệ thống như RAG. Gần đây, chúng ta cũng đã tìm hiểu về AI Agents và khái niệm AI Đa Phương Thức cùng với các trường hợp ứng dụng và cách xây dựng ứng dụng thị giác hoặc nhận diện giọng nói với các API như OpenAI Vision hay Whisper.

Thế giới AI không chỉ dừng lại ở văn bản. Khả năng xử lý và kết hợp thông tin từ nhiều loại dữ liệu khác nhau (văn bản, hình ảnh, âm thanh, video, v.v.) đang mở ra kỷ nguyên mới của các ứng dụng thông minh hơn, trực quan hơn. Đây chính là sức mạnh của AI Đa Phương Thức.

Tuy nhiên, việc tích hợp các mô hình xử lý từng loại dữ liệu riêng lẻ hoặc kết hợp chúng trong một ứng dụng có thể khá phức tạp. Đây là lúc các framework như LangChain trở nên cực kỳ hữu ích. LangChain, như chúng ta đã thấy trong bài viết về Triển khai RAG với LangChain, cung cấp một cấu trúc mạch lạc để xây dựng các ứng dụng dựa trên mô hình ngôn ngữ lớn (LLM). Và tin vui là LangChain đang ngày càng hỗ trợ mạnh mẽ việc làm việc với đầu vào đa phương thức.

Trong bài viết chuyên sâu này, chúng ta sẽ khám phá cách tích hợp đầu vào đa phương thức (cụ thể là hình ảnh và âm thanh) vào các ứng dụng sử dụng LangChain. Chúng ta sẽ đi từ cơ bản đến các ví dụ phức tạp hơn, giúp bạn, đặc biệt là các kỹ sư AI tương lai, nắm vững kỹ năng cần thiết để xây dựng các hệ thống AI toàn diện hơn.

Đầu vào Đa phương thức trong LangChain: Vì sao và Bằng cách nào?

Như chúng ta đã thảo luận, AI đa phương thức cho phép AI hiểu và tương tác với thế giới thực một cách phong phú hơn. Thay vì chỉ đọc văn bản, một mô hình AI đa phương thức có thể “nhìn” ảnh, “nghe” âm thanh và “hiểu” mối liên hệ giữa chúng với văn bản. Ví dụ, bạn có thể hỏi một AI về nội dung một bức ảnh hoặc yêu cầu nó tóm tắt một cuộc họp dựa trên bản ghi âm.

LangChain đóng vai trò là lớp trừu tượng và dàn xếp (orchestration layer) giúp việc kết nối các mô hình khác nhau (LLM, mô hình thị giác, mô hình nhận dạng giọng nói, v.v.) trở nên dễ dàng hơn. Nó cung cấp các interface và cấu trúc dữ liệu chuẩn hóa để truyền thông tin qua lại giữa các thành phần.

Cách tiếp cận chính của LangChain với đầu vào đa phương thức bao gồm:

  1. Hỗ trợ Native trong các Mô hình LLM: Các LLM đa phương thức (như GPT-4 Vision, Gemini Pro Vision) có thể trực tiếp nhận các loại dữ liệu khác ngoài văn bản (thường là hình ảnh) thông qua API của chúng. LangChain cung cấp các lớp wrapper cho các mô hình này, cho phép bạn truyền dữ liệu hình ảnh dưới dạng tin nhắn (Messages).
  2. Sử dụng Tools/Agents: Đối với các loại dữ liệu không được mô hình LLM chính hỗ trợ native (ví dụ: âm thanh), bạn có thể sử dụng các mô hình chuyên biệt (như Whisper cho âm thanh) làm “tools” cho Agent của bạn. Agent có thể quyết định sử dụng tool này để xử lý dữ liệu (ví dụ: phiên âm âm thanh thành văn bản) trước khi đưa thông tin đó vào LLM chính.
  3. Xây dựng Custom Chains/Pipelines: Bạn có thể tự xây dựng chuỗi các bước xử lý. Ví dụ, một chuỗi có thể bắt đầu bằng việc tải dữ liệu, sau đó sử dụng một mô hình thị giác để trích xuất thông tin từ hình ảnh, kết hợp thông tin đó với văn bản, và cuối cùng đưa tất cả vào một LLM để tạo ra phản hồi cuối cùng.

Làm việc với Hình ảnh trong LangChain

Tích hợp hình ảnh là một trong những trường hợp sử dụng phổ biến nhất của AI đa phương thức hiện nay. LangChain hỗ trợ điều này chủ yếu thông qua các lớp mô hình (LLM) có khả năng xử lý thị giác.

Cấu trúc dữ liệu Image Message trong LangChain

Trong LangChain, các loại đầu vào khác nhau được biểu diễn dưới dạng các lớp `Message`. Đối với đầu vào đa phương thức chứa hình ảnh, bạn thường sử dụng `HumanMessage` với nội dung là một danh sách các dictionaries. Mỗi dictionary biểu diễn một phần của tin nhắn, có thể là văn bản hoặc hình ảnh.

Hình ảnh có thể được truyền dưới dạng:

  • URL công khai của hình ảnh.
  • Dữ liệu Base64 của hình ảnh (đối với các hình ảnh cục bộ hoặc riêng tư).

Cấu trúc trông như thế này:

from langchain_core.messages import HumanMessage

message = HumanMessage(
    content=[
        {
            "type": "text",
            "text": "Mô tả những gì bạn thấy trong hình ảnh này?"
        },
        {
            "type": "image_url",
            "image_url": {
                "url": "https://example.com/image.jpg" # Hoặc dữ liệu base64
            }
        }
    ]
)

Sử dụng các Mô hình Hỗ trợ Thị giác

Bạn cần sử dụng một lớp mô hình LLM trong LangChain được tích hợp với các API đa phương thức như OpenAI’s Chat Completion API (với các model như `gpt-4-vision-preview` hoặc `gpt-4o`) hoặc Google’s Vertex AI (với Gemini Pro Vision).

Ví dụ với OpenAI (đảm bảo bạn đã cài đặt `langchain-openai` và có API key):

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
import base64
import requests # Để tải ảnh từ URL nếu cần

# Hàm nhỏ để mã hóa ảnh sang Base64
def get_base64_image(image_path):
    with open(image_path, "rb") as f:
        return base64.b64encode(f.read()).decode('utf-8')

# Khởi tạo mô hình đa phương thức
# Đảm bảo bạn sử dụng model có hỗ trợ vision, ví dụ: gpt-4o hoặc gpt-4-vision-preview
llm = ChatOpenAI(model="gpt-4o", max_tokens=1024)

# Ví dụ 1: Sử dụng URL ảnh
message_with_url = HumanMessage(
    content=[
        {
            "type": "text",
            "text": "Describe this image in detail."
        },
        {
            "type": "image_url",
            "image_url": {
                "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-west-washburn-way%C2%A0.jpg/2560px-Gfp-wisconsin-madison-west-washburn-way%C2%A0.jpg"
            }
        }
    ]
)

# Gọi mô hình
print("--- Generating response for URL image ---")
response_url = llm.invoke(message_with_url)
print(response_url.content)

# Ví dụ 2: Sử dụng ảnh từ file (Base64)
# Giả sử bạn có file ảnh 'path/to/your/local/image.png'
# Để chạy ví dụ này, bạn cần có một file ảnh cục bộ hoặc tải một ảnh về
# Tải một ảnh ví dụ (nếu không có sẵn)
image_url_for_download = "https://file-examples.com/storage/fea138104562384e089d76f/2017/10/file_example_PNG_500kB.png"
image_path_local = "local_example_image.png"
try:
    response = requests.get(image_url_for_download, stream=True)
    response.raise_for_status()
    with open(image_path_local, 'wb') as f:
        for chunk in response.iter_content(chunk_size=8192):
            f.write(chunk)
    print(f"Downloaded example image to {image_path_local}")
except Exception as e:
    print(f"Could not download example image: {e}")
    print("Please provide a valid path to a local image file to run the Base64 example.")
    image_path_local = None # Disable Base64 example if download fails

if image_path_local:
    base64_image = get_base64_image(image_path_local)

    message_with_base64 = HumanMessage(
        content=[
            {
                "type": "text",
                "text": "What kind of animal is this?"
            },
            {
                "type": "image_url",
                "image_url": {
                    "url": f"data:image/png;base64,{base64_image}" # Định dạng data URL
                }
            }
        ]
    )

    # Gọi mô hình
    print("\n--- Generating response for Base64 image ---")
    response_base64 = llm.invoke(message_with_base64)
    print(response_base64.content)

Trong ví dụ này, chúng ta thấy cách tạo `HumanMessage` chứa cả văn bản và hình ảnh. LangChain chuyển cấu trúc này đến API của mô hình LLM (OpenAI trong trường hợp này), và mô hình sẽ xử lý cả hai loại đầu vào để tạo ra phản hồi.

Làm việc với Âm thanh trong LangChain

Việc xử lý âm thanh thường liên quan đến việc sử dụng các mô hình Nhận dạng giọng nói (Speech-to-Text – STT) để chuyển đổi âm thanh thành văn bản trước khi đưa vào LLM. Chúng ta đã nói về Whisper trong bài viết trước, và LangChain cung cấp các cách để tích hợp các mô hình STT này.

Tích hợp STT như một Tool hoặc trong một Chain

Không giống như hình ảnh với các mô hình LLM đa phương thức native, âm thanh thường cần một bước xử lý riêng biệt. Đây là lúc Tools và Chains phát huy tác dụng.

  • Sử dụng Tool: Bạn có thể tạo một Tool sử dụng API của mô hình STT (như OpenAI’s Whisper API hoặc các mô hình khác từ Hugging Face Inference API mà chúng ta đã thảo luận tại đây) để phiên âm một file âm thanh. Agent có thể sử dụng Tool này khi gặp đầu vào là âm thanh hoặc khi được yêu cầu xử lý âm thanh.
  • Xây dựng Chain: Bạn có thể tạo một chain tuần tự: Bước 1 sử dụng mô hình STT để phiên âm âm thanh; Bước 2 đưa văn bản kết quả và prompt ban đầu vào LLM để xử lý.

Ví dụ về việc sử dụng một Tool phiên âm (cần cài đặt `langchain-community` và có OpenAI API key):

from langchain_community.tools import BaseTool
from openai import OpenAI # Sử dụng trực tiếp OpenAI client để phiên âm
import os

# Cần cài đặt: pip install openai pydub ffmpeg-python
# ffmpeg cần được cài đặt trên hệ thống và có trong PATH
# pydub cần cho việc xử lý định dạng âm thanh nếu cần

# Giả định bạn có một file âm thanh, ví dụ: 'path/to/your/audio.mp3'
# Để ví dụ chạy, bạn cần tạo một file âm thanh nhỏ
# Ví dụ: tạo file dummy
# import soundfile as sf
# import numpy as np
# samplerate = 44100
# duration = 3 # seconds
# frequency = 440 # A4 note
# t = np.linspace(0., duration, samplerate * duration)
# amplitude = np.iinfo(np.int16).max * 0.5
# data = amplitude * np.sin(2. * np.pi * frequency * t)
# sf.write('dummy_audio.wav', data.astype(np.int16), samplerate)
audio_file_path = "dummy_audio.wav" # Thay bằng đường dẫn file âm thanh thật của bạn

# Kiểm tra xem file có tồn tại không
if not os.path.exists(audio_file_path):
    print(f"Error: Audio file not found at {audio_file_path}. Please create or provide one.")
else:
    class AudioTranscriptionTool(BaseTool):
        name = "audio_transcriber"
        description = "Use this tool to transcribe audio files to text. Input is the path to the audio file."
        openai_client: OpenAI # Sử dụng instance của OpenAI client

        def _run(self, audio_path: str) -> str:
            """Use the tool."""
            try:
                with open(audio_path, "rb") as audio_file:
                    transcript = self.openai_client.audio.transcriptions.create(
                        model="whisper-1",
                        file=audio_file
                    )
                    return transcript.text
            except Exception as e:
                return f"Error transcribing audio: {e}"

        async def _arun(self, audio_path: str) -> str:
            """Use the tool asynchronously."""
            # Implement async version if needed
            raise NotImplementedError("Asynchronous transcription not implemented")

    # Khởi tạo Tool
    openai_client_instance = OpenAI() # Sẽ đọc OPENAI_API_KEY từ biến môi trường
    transcriber_tool = AudioTranscriptionTool(openai_client=openai_client_instance)

    # Test Tool độc lập (không dùng Agent)
    print("\n--- Testing Audio Transcriber Tool ---")
    transcription_result = transcriber_tool.run(audio_file_path)
    print(f"Transcription: {transcription_result}")

    # (Để dùng tool này trong Agent, bạn cần setup Agent với danh sách tools chứa transcriber_tool)
    # Ví dụ đơn giản về cách Agent có thể sử dụng Tool:
    # from langchain.agents import initialize_agent, AgentType
    # llm_agent = ChatOpenAI(model="gpt-4o", temperature=0) # Mô hình dùng cho Agent reasoning
    # tools = [transcriber_tool]
    # agent = initialize_agent(tools, llm_agent, agent=AgentType.OPENAI_FUNCTIONS, verbose=True)
    # # Bạn có thể prompt agent với yêu cầu xử lý file âm thanh
    # # agent.run(f"Transcribe the audio file located at {audio_file_path} and summarize its content.")

Trong ví dụ trên, chúng ta tạo một custom Tool gọi API Whisper của OpenAI. Agent sau đó có thể sử dụng Tool này để xử lý file âm thanh. Kết quả phiên âm (văn bản) sẽ được đưa lại cho Agent/LLM để xử lý tiếp (ví dụ: tóm tắt, trả lời câu hỏi về nội dung âm thanh).

Kết hợp các Phương thức trong LangChain Pipelines/Agents

Sức mạnh thực sự của tích hợp đa phương thức nằm ở khả năng kết hợp thông tin từ nhiều nguồn. LangChain cung cấp các cấu trúc để làm điều này.

Ví dụ: Phân tích Hình ảnh và Văn bản kết hợp

Giả sử bạn muốn hỏi một câu hỏi phức tạp liên quan đến cả nội dung hình ảnh và một đoạn văn bản mô tả bổ sung. Bạn có thể tạo một prompt kết hợp, sử dụng mô hình LLM đa phương thức:

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

llm = ChatOpenAI(model="gpt-4o", max_tokens=1024)

# Giả định bạn có một ảnh và một đoạn văn bản
image_url = "https://docs.materialize.com/docs/sql/cast/example.jpg"
additional_text = "This image shows a street scene. There is a road with cars, buildings on the sides, and some trees."
question = "Based on the image and the text provided, what is the predominant color of the vehicles visible, and does the text mention any specific vehicle types?"

message_combined = HumanMessage(
    content=[
        {
            "type": "text",
            "text": question
        },
        {
            "type": "text",
            "text": f"Additional context: {additional_text}"
        },
        {
            "type": "image_url",
            "image_url": {"url": image_url}
        }
    ]
)

print("\n--- Generating response for Combined Text and Image Input ---")
response_combined = llm.invoke(message_combined)
print(response_combined.content)

Trong ví dụ này, chúng ta đặt câu hỏi yêu cầu mô hình sử dụng cả thông tin từ hình ảnh và từ đoạn văn bản bổ sung để trả lời. Mô hình đa phương thức như `gpt-4o` có khả năng xử lý đồng thời các loại đầu vào này khi chúng được đóng gói đúng cách trong `HumanMessage`.

Ví dụ phức tạp hơn: Phân tích Âm thanh và Hình ảnh (Concept)

Một kịch bản phức tạp hơn là phân tích một video (chuỗi hình ảnh và âm thanh). LangChain có thể giúp dàn xếp các bước:

  1. Sử dụng Tool/Mô hình nhận diện khung hình chính từ video.
  2. Sử dụng Tool/Mô hình phiên âm âm thanh từ video (ví dụ: Whisper).
  3. Kết hợp các khung hình chính (dưới dạng ảnh) và văn bản phiên âm cùng với câu hỏi của người dùng thành một prompt đa phương thức.
  4. Đưa prompt kết hợp vào LLM đa phương thức để tạo ra phản hồi cuối cùng.

Việc triển khai đầy đủ kịch bản này sẽ phức tạp hơn và đòi hỏi các thư viện xử lý video (như OpenCV, ffmpeg) và logic điều khiển trong Agent hoặc custom Chain, nhưng LangChain cung cấp khung sườn để kết nối các thành phần đó.

Tổng kết các thành phần LangChain cho Đa phương thức

Để dễ hình dung, đây là bảng tóm tắt cách LangChain hỗ trợ các đầu vào đa phương thức:

Loại Dữ liệu Cách Biểu diễn trong LangChain Cách Xử lý Phổ biến Thành phần LangChain liên quan Ví dụ Mô hình/API
Văn bản HumanMessage, AIMessage, v.v. Trực tiếp bởi LLM ChatModel, LLM GPT, Claude, Gemini, Llama, v.v.
Hình ảnh HumanMessage với nội dung type="image_url" (URL hoặc Base64) Trực tiếp bởi LLM đa phương thức ChatModel (với model hỗ trợ vision) GPT-4 Vision, GPT-4o, Gemini Pro Vision, Claude 3 Vision
Âm thanh (Không có biểu diễn native trực tiếp cho mô hình chính) Sử dụng mô hình STT để phiên âm thành văn bản; sau đó xử lý văn bản bằng LLM. Tool (cho STT), Agent, Chain Whisper (OpenAI), mô hình STT trên Hugging Face, Google Speech-to-Text, v.v.
Video (Không có biểu diễn native trực tiếp) Phân tách thành hình ảnh (khung hình) và âm thanh; xử lý riêng lẻ hoặc kết hợp. Kết hợp Tool (cho xử lý video/audio), Agent, Chain Kết hợp các mô hình/API xử lý hình ảnh và âm thanh.

Bảng này minh họa cách LangChain sử dụng các thành phần khác nhau tùy thuộc vào loại dữ liệu và khả năng của mô hình chính bạn đang sử dụng. Đối với hình ảnh, nếu bạn dùng LLM đa phương thức, việc tích hợp khá trực tiếp thông qua cấu trúc message. Đối với các loại khác như âm thanh, bạn cần thêm các bước tiền xử lý, thường được quản lý hiệu quả bằng Agent hoặc Chain.

Thách thức và Lưu ý khi tích hợp Đa phương thức

Mặc dù mạnh mẽ, việc tích hợp đầu vào đa phương thức cũng có những thách thức:

  1. Chi phí: Xử lý các loại dữ liệu như hình ảnh và âm thanh, đặc biệt qua các API trả phí, có thể tốn kém hơn so với chỉ xử lý văn bản. Các mô hình đa phương thức thường có giá cước khác nhau cho văn bản và hình ảnh/tokens hình ảnh.
  2. Hiệu năng và Độ trễ: Việc tải, xử lý, và gửi dữ liệu đa phương thức (đặc biệt là Base64 ảnh lớn) có thể làm tăng đáng kể thời gian phản hồi của ứng dụng.
  3. Định dạng Dữ liệu: Chuẩn bị dữ liệu đúng định dạng mà mô hình hoặc Tool yêu cầu là rất quan trọng (ví dụ: mã hóa Base64 đúng cách, định dạng file âm thanh).
  4. Lựa chọn Mô hình: Không phải tất cả các mô hình đều hỗ trợ tất cả các loại đầu vào. Bạn cần chọn mô hình phù hợp với nhu cầu đa phương thức cụ thể của mình. Các mô hình mã nguồn mở hỗ trợ đa phương thức cũng đang phát triển mạnh mẽ và có thể là một lựa chọn thay thế thay cho các mô hình đóng.
  5. Context Window: Đối với các LLM đa phương thức, ngay cả khi chúng xử lý hình ảnh, chúng vẫn có giới hạn về lượng “tokens” từ hình ảnh và văn bản mà chúng có thể xử lý cùng lúc (giống như context window cho văn bản).

Kết luận

Tích hợp đầu vào đa phương thức là một bước tiến lớn trong việc xây dựng các ứng dụng AI có khả năng tương tác với thế giới thực một cách tự nhiên và toàn diện hơn. LangChain, với cấu trúc linh hoạt của Messages, Tools, Agents và Chains, cung cấp một framework mạnh mẽ giúp các kỹ sư AI dễ dàng kết nối và dàn xếp các mô hình xử lý các loại dữ liệu khác nhau.

Bằng cách hiểu cách biểu diễn dữ liệu đa phương thức trong LangChain và cách sử dụng các mô hình/tools phù hợp (như LLM đa phương thức cho hình ảnh hoặc mô hình STT cho âm thanh), bạn có thể mở rộng khả năng của các ứng dụng AI của mình vượt ra ngoài chỉ văn bản.

Hãy thử nghiệm với các ví dụ code trong bài viết này và khám phá thêm các khả năng khác của LangChain với các loại dữ liệu đa phương thức khác. Con đường trở thành Kỹ sư AI chuyên nghiệp đòi hỏi việc liên tục học hỏi và thích ứng với những tiến bộ mới nhất, và tích hợp đa phương thức chắc chắn là một kỹ năng quan trọng trong bộ công cụ của bạn.

Tiếp theo, chúng ta sẽ khám phá những khía cạnh khác của việc xây dựng ứng dụng AI bền vững và mạnh mẽ. Hãy tiếp tục theo dõi loạt bài “AI Engineer Roadmap” nhé!

Chỉ mục