Parallelization: Thực thi đồng thời cho quy trình Agentic
Tìm hiểu chuyên sâu về mẫu Parallelization — thực thi đồng thời nhiều lời gọi LLM, công cụ hoặc sub-agent độc lập để giảm đáng kể độ trễ trong các hệ thống agentic.
Table of Contents
Tổng quan về mẫu Parallelization
Trong các chương trước, chúng ta đã khám phá Prompt Chaining cho quy trình tuần tự và Routing cho việc ra quyết định động và chuyển đổi giữa các đường đi khác nhau. Mặc dù các mẫu này rất cần thiết, nhiều tác vụ agentic phức tạp liên quan đến nhiều tác vụ con có thể được thực thi đồng thời thay vì lần lượt. Đây là lúc mẫu Parallelization trở nên quan trọng.
Parallelization liên quan đến việc thực thi đồng thời nhiều thành phần — như các lời gọi LLM, sử dụng công cụ, hoặc thậm chí toàn bộ sub-agent. Thay vì chờ một bước hoàn thành trước khi bắt đầu bước tiếp theo, thực thi song song cho phép các tác vụ độc lập chạy cùng lúc, giảm đáng kể tổng thời gian thực thi cho các tác vụ có thể được phân tách thành các phần độc lập.
Hãy xem xét một agent được thiết kế để nghiên cứu một chủ đề và tóm tắt các phát hiện. Cách tiếp cận tuần tự có thể là:
- Tìm kiếm Nguồn A.
- Tóm tắt Nguồn A.
- Tìm kiếm Nguồn B.
- Tóm tắt Nguồn B.
- Tổng hợp câu trả lời cuối cùng từ bản tóm tắt A và B.
Thay vào đó, cách tiếp cận song song có thể:
- Tìm kiếm Nguồn A và Tìm kiếm Nguồn B đồng thời.
- Khi cả hai tìm kiếm hoàn thành, Tóm tắt Nguồn A và Tóm tắt Nguồn B đồng thời.
- Tổng hợp câu trả lời cuối cùng từ bản tóm tắt A và B (bước này thường là tuần tự, chờ các bước song song hoàn thành).
Ý tưởng cốt lõi là xác định các phần của quy trình không phụ thuộc vào đầu ra của các phần khác và thực thi chúng song song. Điều này đặc biệt hiệu quả khi làm việc với các dịch vụ bên ngoài (như API hoặc cơ sở dữ liệu) có độ trễ, vì bạn có thể phát đi nhiều yêu cầu đồng thời.
Triển khai parallelization thường đòi hỏi các framework hỗ trợ thực thi bất đồng bộ hoặc đa luồng/đa tiến trình. Các framework agentic hiện đại được thiết kế với các thao tác bất đồng bộ trong tâm trí, cho phép bạn dễ dàng định nghĩa các bước có thể chạy song song.
Các framework như LangChain, LangGraph và Google ADK cung cấp cơ chế cho thực thi song song. Trong LangChain Expression Language (LCEL), bạn có thể đạt được thực thi song song bằng cách kết hợp các đối tượng runnable sử dụng toán tử như | (cho tuần tự) và cấu trúc chain hoặc graph có các nhánh thực thi đồng thời. LangGraph, với cấu trúc đồ thị, cho phép bạn định nghĩa nhiều node có thể được thực thi từ một chuyển đổi trạng thái duy nhất, cho phép các nhánh song song trong quy trình. Google ADK cung cấp các cơ chế native mạnh mẽ để hỗ trợ và quản lý thực thi song song của các agent, nâng cao đáng kể hiệu quả và khả năng mở rộng của các hệ thống đa agent phức tạp.
Mẫu Parallelization rất quan trọng để cải thiện hiệu quả và khả năng phản hồi của các hệ thống agentic, đặc biệt khi xử lý các tác vụ liên quan đến nhiều tra cứu, tính toán hoặc tương tác độc lập với dịch vụ bên ngoài. Đây là kỹ thuật then chốt để tối ưu hiệu suất của các quy trình agent phức tạp.
Ứng dụng thực tế và các trường hợp sử dụng
Parallelization là một mẫu mạnh mẽ để tối ưu hiệu suất agent qua nhiều ứng dụng:
Thu thập thông tin và nghiên cứu
Thu thập thông tin từ nhiều nguồn đồng thời là một trường hợp sử dụng kinh điển.
- Trường hợp sử dụng: Một agent nghiên cứu về một công ty.
- Tác vụ song song: Tìm kiếm bài báo, lấy dữ liệu cổ phiếu, kiểm tra đề cập trên mạng xã hội và truy vấn cơ sở dữ liệu công ty — tất cả cùng lúc.
- Lợi ích: Thu thập cái nhìn toàn diện nhanh hơn nhiều so với tra cứu tuần tự.
Xử lý và phân tích dữ liệu
Áp dụng các kỹ thuật phân tích khác nhau hoặc xử lý các phân đoạn dữ liệu khác nhau đồng thời.
- Trường hợp sử dụng: Một agent phân tích phản hồi khách hàng.
- Tác vụ song song: Chạy phân tích cảm xúc, trích xuất từ khóa, phân loại phản hồi và xác định vấn đề khẩn cấp đồng thời trên một lô các mục phản hồi.
- Lợi ích: Cung cấp phân tích đa chiều nhanh chóng.
Tương tác đa API hoặc đa công cụ
Gọi nhiều API hoặc công cụ độc lập để thu thập các loại thông tin khác nhau hoặc thực hiện các hành động khác nhau.
- Trường hợp sử dụng: Một agent lập kế hoạch du lịch.
- Tác vụ song song: Kiểm tra giá vé máy bay, tìm kiếm phòng khách sạn, tra cứu sự kiện địa phương và tìm gợi ý nhà hàng đồng thời.
- Lợi ích: Trình bày kế hoạch du lịch hoàn chỉnh nhanh hơn.
Tạo nội dung với nhiều thành phần
Tạo các phần khác nhau của một nội dung phức tạp song song.
- Trường hợp sử dụng: Một agent tạo email marketing.
- Tác vụ song song: Tạo dòng tiêu đề, soạn nội dung email, tìm hình ảnh phù hợp và tạo văn bản nút kêu gọi hành động đồng thời.
- Lợi ích: Lắp ráp email cuối cùng hiệu quả hơn.
Xác thực và kiểm tra
Thực hiện nhiều kiểm tra hoặc xác thực độc lập đồng thời.
- Trường hợp sử dụng: Một agent xác minh đầu vào người dùng.
- Tác vụ song song: Kiểm tra định dạng email, xác thực số điện thoại, xác minh địa chỉ với cơ sở dữ liệu và kiểm tra nội dung không phù hợp đồng thời.
- Lợi ích: Cung cấp phản hồi nhanh hơn về tính hợp lệ của đầu vào.
Xử lý đa phương thức
Xử lý các phương thức khác nhau (văn bản, hình ảnh, âm thanh) của cùng một đầu vào đồng thời.
- Trường hợp sử dụng: Một agent phân tích bài đăng mạng xã hội có văn bản và hình ảnh.
- Tác vụ song song: Phân tích văn bản về cảm xúc và từ khóa, đồng thời phân tích hình ảnh về đối tượng và mô tả cảnh.
- Lợi ích: Tích hợp thông tin từ các phương thức khác nhau nhanh hơn.
Thử nghiệm A/B hoặc tạo nhiều phương án
Tạo nhiều biến thể của phản hồi hoặc đầu ra song song để chọn phương án tốt nhất.
- Trường hợp sử dụng: Một agent tạo các lựa chọn văn bản sáng tạo khác nhau.
- Tác vụ song song: Tạo ba tiêu đề khác nhau cho một bài viết đồng thời sử dụng các prompt hoặc mô hình hơi khác nhau.
- Lợi ích: Cho phép so sánh và lựa chọn nhanh phương án tốt nhất.
Parallelization là kỹ thuật tối ưu nền tảng trong thiết kế agentic, cho phép nhà phát triển xây dựng ứng dụng hiệu năng cao và phản hồi nhanh hơn bằng cách tận dụng thực thi đồng thời cho các tác vụ độc lập.
Ví dụ mã thực hành (LangChain)
Thực thi song song trong framework LangChain được hỗ trợ bởi LangChain Expression Language (LCEL). Phương pháp chính liên quan đến việc cấu trúc nhiều thành phần runnable trong một cấu trúc dictionary hoặc list. Khi tập hợp này được truyền làm đầu vào cho thành phần tiếp theo trong chuỗi, runtime LCEL thực thi các runnable chứa bên trong đồng thời.
Trong ngữ cảnh LangGraph, nguyên tắc này được áp dụng cho topology của đồ thị. Quy trình song song được định nghĩa bằng cách kiến trúc đồ thị sao cho nhiều node, không có phụ thuộc tuần tự trực tiếp, có thể được khởi tạo từ một node chung duy nhất. Các đường song song này thực thi độc lập trước khi kết quả được tổng hợp tại điểm hội tụ tiếp theo trong đồ thị.
Triển khai sau minh họa một quy trình xử lý song song được xây dựng với framework LangChain. Quy trình này thực thi hai thao tác độc lập đồng thời để phản hồi một truy vấn người dùng duy nhất. Các đầu ra tương ứng sau đó được tổng hợp thành một kết quả thống nhất.
Cài đặt các thư viện cần thiết:
pip install langchain langchain-community langchain-openai
Lưu ý: Đảm bảo API key hợp lệ cho mô hình ngôn ngữ đã chọn được cấu hình trong môi trường cục bộ.
import os
import asyncio
from typing import Optional
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import Runnable, RunnableParallel, RunnablePassthrough
# --- Cấu hình ---
# Đảm bảo biến môi trường API key đã được đặt (ví dụ: OPENAI_API_KEY)
try:
llm: Optional[ChatOpenAI] = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)
except Exception as e:
print(f"Error initializing language model: {e}")
llm = None
# --- Định nghĩa các chuỗi độc lập ---
# Ba chuỗi này đại diện cho các tác vụ riêng biệt có thể thực thi song song.
summarize_chain: Runnable = (
ChatPromptTemplate.from_messages([
("system", "Summarize the following topic concisely:"),
("user", "{topic}")
])
| llm
| StrOutputParser()
)
questions_chain: Runnable = (
ChatPromptTemplate.from_messages([
("system", "Generate three interesting questions about the following topic:"),
("user", "{topic}")
])
| llm
| StrOutputParser()
)
terms_chain: Runnable = (
ChatPromptTemplate.from_messages([
("system", "Identify 5-10 key terms from the following topic, separated by commas:"),
("user", "{topic}")
])
| llm
| StrOutputParser()
)
# --- Xây dựng chuỗi Song song + Tổng hợp ---
# 1. Định nghĩa khối tác vụ chạy song song.
# Kết quả cùng với chủ đề gốc sẽ được đưa vào bước tiếp theo.
map_chain = RunnableParallel(
{
"summary": summarize_chain,
"questions": questions_chain,
"key_terms": terms_chain,
"topic": RunnablePassthrough(), # Truyền chủ đề gốc qua
}
)
# 2. Định nghĩa prompt tổng hợp cuối cùng kết hợp kết quả song song.
synthesis_prompt = ChatPromptTemplate.from_messages([
("system", """Based on the following information:
Summary: {summary}
Related Questions: {questions}
Key Terms: {key_terms}
Synthesize a comprehensive answer."""),
("user", "Original topic: {topic}")
])
# 3. Xây dựng chuỗi đầy đủ bằng cách đưa kết quả song song trực tiếp
# vào prompt tổng hợp, theo sau là LLM và output parser.
full_parallel_chain = map_chain | synthesis_prompt | llm | StrOutputParser()
# --- Chạy chuỗi ---
async def run_parallel_example(topic: str) -> None:
"""
Gọi bất đồng bộ chuỗi xử lý song song với một chủ đề cụ thể
và in kết quả tổng hợp.
Args:
topic: Chủ đề đầu vào được xử lý bởi các chuỗi LangChain.
"""
if not llm:
print("LLM not initialized. Cannot run example.")
return
print(f"\n--- Running Parallel LangChain Example for Topic: '{topic}' ---")
try:
# Đầu vào cho 'ainvoke' là chuỗi 'topic' duy nhất,
# sau đó được truyền cho mỗi runnable trong 'map_chain'.
response = await full_parallel_chain.ainvoke(topic)
print("\n--- Final Response ---")
print(response)
except Exception as e:
print(f"\nAn error occurred during chain execution: {e}")
if __name__ == "__main__":
test_topic = "The history of space exploration"
# Trong Python 3.7+, asyncio.run là cách chuẩn để chạy hàm async.
asyncio.run(run_parallel_example(test_topic))
Đoạn mã này triển khai một ứng dụng LangChain được thiết kế để xử lý hiệu quả một chủ đề cho trước bằng cách tận dụng thực thi song song. Lưu ý rằng asyncio cung cấp đồng thời (concurrency), không phải song song (parallelism) — nó đạt được điều này trên một luồng duy nhất bằng cách sử dụng vòng lặp sự kiện chuyển đổi thông minh giữa các tác vụ khi một tác vụ đang idle (ví dụ: chờ yêu cầu mạng). Điều này tạo hiệu ứng nhiều tác vụ tiến triển cùng lúc, nhưng mã thực tế vẫn được thực thi bởi chỉ một luồng, bị ràng buộc bởi Global Interpreter Lock (GIL) của Python.
Ba chuỗi LangChain độc lập được định nghĩa, mỗi chuỗi thực hiện một tác vụ riêng biệt trên chủ đề đầu vào: tóm tắt, tạo câu hỏi và trích xuất thuật ngữ chính. Khối RunnableParallel gói ba chuỗi này lại, cho phép chúng thực thi đồng thời. Nó cũng bao gồm RunnablePassthrough để đảm bảo chủ đề đầu vào gốc có sẵn cho các bước tiếp theo. Một ChatPromptTemplate riêng được định nghĩa cho bước tổng hợp cuối cùng, và chuỗi xử lý đầu-cuối đầy đủ (full_parallel_chain) nối tiếp khối song song vào prompt tổng hợp, theo sau là mô hình ngôn ngữ và output parser.
Ví dụ mã thực hành (Google ADK)
Bây giờ hãy xem cách các thành phần nguyên thủy của Google ADK — như ParallelAgent và SequentialAgent — có thể được áp dụng để xây dựng luồng agent tận dụng thực thi đồng thời để cải thiện hiệu quả.
from google.adk.agents import LlmAgent, ParallelAgent, SequentialAgent
from google.adk.tools import google_search
GEMINI_MODEL = "gemini-2.0-flash"
# --- 1. Định nghĩa các Sub-Agent Nghiên cứu (chạy song song) ---
# Nhà nghiên cứu 1: Năng lượng tái tạo
researcher_agent_1 = LlmAgent(
name="RenewableEnergyResearcher",
model=GEMINI_MODEL,
instruction="""You are an AI Research Assistant specializing in energy.
Research the latest advancements in 'renewable energy sources'.
Use the Google Search tool provided.
Summarize your key findings concisely (1-2 sentences).
Output *only* the summary.
""",
description="Researches renewable energy sources.",
tools=[google_search],
# Lưu kết quả vào state cho agent tổng hợp
output_key="renewable_energy_result"
)
# Nhà nghiên cứu 2: Xe điện
researcher_agent_2 = LlmAgent(
name="EVResearcher",
model=GEMINI_MODEL,
instruction="""You are an AI Research Assistant specializing in transportation.
Research the latest developments in 'electric vehicle technology'.
Use the Google Search tool provided.
Summarize your key findings concisely (1-2 sentences).
Output *only* the summary.
""",
description="Researches electric vehicle technology.",
tools=[google_search],
# Lưu kết quả vào state cho agent tổng hợp
output_key="ev_technology_result"
)
# Nhà nghiên cứu 3: Thu giữ carbon
researcher_agent_3 = LlmAgent(
name="CarbonCaptureResearcher",
model=GEMINI_MODEL,
instruction="""You are an AI Research Assistant specializing in climate solutions.
Research the current state of 'carbon capture methods'.
Use the Google Search tool provided.
Summarize your key findings concisely (1-2 sentences).
Output *only* the summary.
""",
description="Researches carbon capture methods.",
tools=[google_search],
# Lưu kết quả vào state cho agent tổng hợp
output_key="carbon_capture_result"
)
# --- 2. Tạo ParallelAgent (Chạy các nhà nghiên cứu đồng thời) ---
# Agent này điều phối việc thực thi đồng thời các nhà nghiên cứu.
# Nó kết thúc khi tất cả nhà nghiên cứu hoàn thành và lưu kết quả vào state.
parallel_research_agent = ParallelAgent(
name="ParallelWebResearchAgent",
sub_agents=[researcher_agent_1, researcher_agent_2, researcher_agent_3],
description="Runs multiple research agents in parallel to gather information."
)
# --- 3. Định nghĩa Agent Tổng hợp (Chạy *sau* các agent song song) ---
# Agent này lấy kết quả được lưu trong session state bởi các agent song song
# và tổng hợp thành một phản hồi có cấu trúc duy nhất với trích dẫn nguồn.
merger_agent = LlmAgent(
name="SynthesisAgent",
model=GEMINI_MODEL,
instruction="""You are an AI Assistant responsible for combining research findings into a structured report.
Your primary task is to synthesize the following research summaries, clearly attributing findings to their source areas.
Structure your response using headings for each topic. Ensure the report is coherent and integrates the key points smoothly.
**Crucially: Your entire response MUST be grounded *exclusively* on the information provided in the 'Input Summaries' below. Do NOT add any external knowledge, facts, or details not present in these specific summaries.**
**Input Summaries:**
* **Renewable Energy:**
{renewable_energy_result}
* **Electric Vehicles:**
{ev_technology_result}
* **Carbon Capture:**
{carbon_capture_result}
**Output Format:**
## Summary of Recent Sustainable Technology Advancements
### Renewable Energy Findings
(Based on RenewableEnergyResearcher's findings)
[Synthesize and elaborate *only* on the renewable energy input summary provided above.]
### Electric Vehicle Findings
(Based on EVResearcher's findings)
[Synthesize and elaborate *only* on the EV input summary provided above.]
### Carbon Capture Findings
(Based on CarbonCaptureResearcher's findings)
[Synthesize and elaborate *only* on the carbon capture input summary provided above.]
### Overall Conclusion
[Provide a brief (1-2 sentence) concluding statement that connects *only* the findings presented above.]
Output *only* the structured report following this format. Do not include introductory or concluding phrases outside this structure, and strictly adhere to using only the provided input summary content.
""",
description="Combines research findings from parallel agents into a structured, cited report, strictly grounded on provided inputs.",
# Không cần tool cho việc tổng hợp
# Không cần output_key ở đây, vì phản hồi trực tiếp là đầu ra cuối cùng
)
# --- 4. Tạo SequentialAgent (Điều phối toàn bộ luồng) ---
# Đây là agent chính sẽ được chạy. Nó trước tiên thực thi ParallelAgent
# để điền vào state, sau đó thực thi MergerAgent để tạo đầu ra cuối cùng.
sequential_pipeline_agent = SequentialAgent(
name="ResearchAndSynthesisPipeline",
# Chạy nghiên cứu song song trước, sau đó tổng hợp
sub_agents=[parallel_research_agent, merger_agent],
description="Coordinates parallel research and synthesizes the results."
)
root_agent = sequential_pipeline_agent
Đoạn mã này định nghĩa một hệ thống đa agent được sử dụng để nghiên cứu và tổng hợp thông tin về các tiến bộ công nghệ bền vững. Ba instance LlmAgent đóng vai trò như các nhà nghiên cứu chuyên biệt: một cho nguồn năng lượng tái tạo, một cho công nghệ xe điện, và một cho phương pháp thu giữ carbon. Mỗi agent nghiên cứu sử dụng công cụ google_search và lưu bản tóm tắt vào session state bằng output_key.
ParallelAgent có tên ParallelWebResearchAgent chạy cả ba agent nghiên cứu đồng thời. Khi tất cả hoàn thành, MergerAgent (cũng là LlmAgent) tổng hợp các kết quả được lưu trong session state thành một báo cáo có cấu trúc. Instruction của nó nhấn mạnh rằng đầu ra phải dựa hoàn toàn trên các bản tóm tắt đầu vào được cung cấp, cấm thêm kiến thức bên ngoài.
Cuối cùng, SequentialAgent có tên ResearchAndSynthesisPipeline điều phối toàn bộ quy trình: trước tiên thực thi ParallelAgent cho nghiên cứu, sau đó MergerAgent cho tổng hợp. Điều này minh họa cách các mẫu song song và tuần tự có thể được kết hợp lại cho quy trình đa agent hiệu quả.
Tóm lược nhanh
Vấn đề: Nhiều quy trình agentic liên quan đến nhiều tác vụ con phải hoàn thành để đạt mục tiêu cuối cùng. Thực thi hoàn toàn tuần tự, nơi mỗi tác vụ chờ tác vụ trước hoàn thành, thường không hiệu quả và chậm. Độ trễ này trở thành nút cổ chai đáng kể khi các tác vụ phụ thuộc vào thao tác I/O bên ngoài, chẳng hạn như gọi các API khác nhau hoặc truy vấn nhiều cơ sở dữ liệu. Nếu không có cơ chế thực thi đồng thời, tổng thời gian xử lý là tổng thời gian của tất cả các tác vụ riêng lẻ.
Lý do: Mẫu Parallelization cung cấp giải pháp chuẩn hóa bằng cách cho phép thực thi đồng thời các tác vụ độc lập. Nó hoạt động bằng cách xác định các thành phần của quy trình — như sử dụng công cụ hoặc lời gọi LLM — không phụ thuộc vào đầu ra trực tiếp của nhau. Các framework agentic như LangChain và Google ADK cung cấp các cấu trúc tích hợp để định nghĩa và quản lý các thao tác đồng thời này. Bằng cách chạy các tác vụ độc lập cùng lúc thay vì lần lượt, mẫu này giảm đáng kể tổng thời gian thực thi.
Nguyên tắc chung: Sử dụng mẫu này khi quy trình chứa nhiều thao tác độc lập có thể chạy đồng thời, chẳng hạn như lấy dữ liệu từ nhiều API, xử lý các khối dữ liệu khác nhau, hoặc tạo nhiều phần nội dung để tổng hợp sau.
Những điểm chính
- Parallelization là mẫu thực thi các tác vụ độc lập đồng thời để cải thiện hiệu quả.
- Đặc biệt hữu ích khi các tác vụ liên quan đến việc chờ tài nguyên bên ngoài, như lời gọi API.
- Việc áp dụng kiến trúc đồng thời hoặc song song đưa vào độ phức tạp và chi phí đáng kể, ảnh hưởng đến các giai đoạn phát triển chính như thiết kế, gỡ lỗi và ghi log hệ thống.
- Các framework như LangChain và Google ADK cung cấp hỗ trợ tích hợp để định nghĩa và quản lý thực thi song song.
- Trong LangChain Expression Language (LCEL),
RunnableParallellà cấu trúc then chốt để chạy nhiều runnable cạnh nhau. - Google ADK có thể hỗ trợ thực thi song song thông qua Ủy thác dựa trên LLM (LLM-Driven Delegation), nơi LLM của agent Coordinator xác định các tác vụ con độc lập và kích hoạt xử lý đồng thời bởi các sub-agent chuyên biệt.
- Parallelization giúp giảm tổng độ trễ và làm cho các hệ thống agentic phản hồi nhanh hơn cho các tác vụ phức tạp.
Kết luận
Mẫu parallelization là phương pháp tối ưu quy trình tính toán bằng cách thực thi đồng thời các tác vụ con độc lập. Cách tiếp cận này giảm tổng độ trễ, đặc biệt trong các thao tác phức tạp liên quan đến nhiều suy luận mô hình hoặc lời gọi đến dịch vụ bên ngoài.
Các framework cung cấp cơ chế riêng biệt để triển khai mẫu này. Trong LangChain, các cấu trúc như RunnableParallel được sử dụng để định nghĩa và thực thi tường minh nhiều chuỗi xử lý đồng thời. Ngược lại, các framework như Google Agent Developer Kit (ADK) có thể đạt được parallelization thông qua ủy thác đa agent, nơi mô hình coordinator chính giao các tác vụ con khác nhau cho các agent chuyên biệt có thể hoạt động đồng thời.
Bằng cách tích hợp xử lý song song với luồng điều khiển tuần tự (chaining) và có điều kiện (routing), có thể xây dựng các hệ thống tính toán tinh vi, hiệu năng cao có khả năng quản lý hiệu quả các tác vụ đa dạng và phức tạp.