Chào các bạn 😁! Lâu lắm mới ngoi lên để chia sẻ một cái gì đó và hi vọng bài này có thể giúp ích được cho nhiều anh em. Như mọi người cũng biết, MCP và A2A là 2 giao thức nổi đình nổi đám hiện nay mà với ae làm AI không thể bỏ lỡ được. Community đã có rất nhiều bài chia sẻ về chủ đề này rồi - thảo luận xem nó là gì, nó hoạt động ra sao, có thể ứng dụng vào đâu...
Vì vậy, hôm nay mình sẽ không lặp lại lý thuyết mà sẽ "lăn tay áo" hướng dẫn ae thực chiến với một bài toán cụ thể. Đó là sử dụng giao thức Agent-to-Agent (A2A) để xây dựng ứng dụng thực tế: AI Trading Team cho thị trường chứng khoán Việt Nam. Mình sẽ step-by-step từ concept, design, implementation cho đến demo kết quả cuối cùng. Hy vọng sau bài này, các bạn không chỉ hiểu A2A là gì mà còn có thể tự tay build được một multi-agent system cho riêng mình! 🚀
Khởi đầu từ câu hỏi: Tại sao cần nhiều AI cùng làm việc?
Khi mới bắt đầu học AI, chúng ta thường làm quen với các hệ thống đơn giản: một chatbot trả lời câu hỏi, một model nhận diện hình ảnh, hay một AI assistant giúp viết code. Nhưng trong thực tế, nhiều vấn đề phức tạp cần sự kết hợp của nhiều chuyên gia với góc nhìn khác nhau.
Ví dụ, khi bạn muốn quyết định có nên mua một cổ phiếu hay không, bạn sẽ cần:
- Một người phân tích kỹ thuật để xem biểu đồ giá
- Một chuyên gia quản lý rủi ro để đánh giá mức độ an toàn
- Một portfolio manager để đưa ra quyết định cuối cùng
Và đây chính là lúc các giao thức mới như MCP và A2A ra đời để giải quyết vấn đề này.
(Hiểu đơn giản: A2A (Agent-to-Agent) là giao thức cho phép các AI agents trò chuyện và tương tác với nhau như con người)
Tại sao chọn bài toán chứng khoán làm ví dụ?
Mình chọn lĩnh vực đầu tư chứng khoán vì những lý do sau:
1. Đầu tư cần nhiều góc nhìn
Trong đầu tư, một quyết định tốt luôn cần sự kết hợp của:
- Phân tích kỹ thuật: Xem biểu đồ, chỉ số, xu hướng
- Quản lý rủi ro: Tính toán mức độ rủi ro có thể chấp nhận
- Quyết định chiến lược: Tổng hợp tất cả để đưa ra lựa chọn cuối cùng
(Tất nhiên còn nhiều yếu tốt khác như thị trường, tin tức,... cái này mọi người có thể tạo thêm các Agent tham gia vào hệ thống sau 😁.)
2. Giống cách con người làm việc
Các công ty đầu tư thực tế đều có "hội đồng đầu tư" với các chuyên gia khác nhau:
- Analysts trình bày nghiên cứu
- Risk managers đặt câu hỏi và thách thức các giả định
- Portfolio managers đưa ra quyết định cuối cùng
3. Kết quả có thể đo lường được
- Input rõ ràng: Mã cổ phiếu, số tiền đầu tư, mức độ rủi ro, thời gian đầu tư.
- Output cụ thể: MUA/BÁN/GIỮ kèm lý do chi tiết
- Có thể kiểm tra: So sánh với kết quả thực tế
Ý tưởng: Xây dựng AI Trading Team Việt Nam
Mình sẽ tạo ra ba AI agents, mỗi agent có tính cách và chuyên môn riêng biệt:
🔍 Nguyễn Minh Anh - Chuyên gia phân tích thị trường
- Tính cách: Tỉ mỉ, thích nghiên cứu biểu đồ, hay trích dẫn Warren Buffett
- Chuyên môn: Phân tích kỹ thuật, nhận diện xu hướng thị trường
- Cách nói chuyện: Chuyên nghiệp nhưng thân thiện, hay dùng "Theo phân tích kỹ thuật thì..."
⚠️ Trần Quốc Bảo - Chuyên gia quản lý rủi ro
- Tính cách: Thận trọng, có kinh nghiệm qua nhiều cuộc khủng hoảng
- Chuyên môn: Đánh giá rủi ro, tính toán tỷ lệ đầu tư an toàn
- Cách nói chuyện: Nghiêm túc, hay cảnh báo "Cẩn thận với...", "Nhớ cuộc khủng hoảng năm 2018..."
💼 Lê Thị Mai - Giám đốc đầu tư
- Tính cách: Quyết đoán, có tầm nhìn chiến lược, biết điều phối nhóm
- Chuyên môn: Đưa ra quyết định cuối cùng, nhìn nhận vấn đề từ góc độ tổng thể
- Cách nói chuyện: Tự tin, hay dùng "Quyết định cuối cùng là...", "Từ góc độ chiến lược..."
Thiết kế luồng làm việc A2A
Luồng hoạt động sẽ diễn ra như sau:
Bước 1: Nhập dữ liệu cổ phiếu (VCB, VIC, FPT...) ↓
Bước 2: Minh Anh phân tích kỹ thuật đầu tiên ↓ Bước 3: Quốc Bảo đánh giá và đưa ra ý kiến phản hồi ↓
Bước 4: Thị Mai tổng hợp và đưa ra quyết định cuối ↓
Bước 5: Kết quả cuối cùng với lý do chi tiết
Bắt đầu xây dựng: Kiến trúc cơ bản
Các bạn có thể lấy code đầy đủ của mình tại: https://github.com/huudatscience/Agent-to-agent-ai-trading-vietnam 😁Còn phần dưới này, mình sẽ đưa 1 số đoạn code chính về Agent to agent và cách cách Agent tương tác với nhau thôi. Oke, let's go nào!!!
Bước 1: Định nghĩa thông tin cơ bản
Đầu tiên, chúng ta cần định nghĩa các cấu trúc dữ liệu cơ bản. Mình sẽ giải thích từng phần một cách chi tiết:
from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import List
from datetime import datetime @dataclass
class AgentPersonality: """Lưu trữ thông tin về tính cách của mỗi agent""" name: str # Tên của agent role: str # Vai trò (Analyst, Risk Manager, Portfolio Manager) personality_traits: List[str] # Các đặc điểm tính cách speaking_style: str # Phong cách nói chuyện đặc trưng @dataclass class AgentResponse: """Cấu trúc lưu trữ phản hồi của agent trong cuộc thảo luận A2A""" agent_name: str # Tên agent đưa ra phản hồi confidence_level: int # Mức độ tự tin (1-10) recommendation: str # Khuyến nghị: "BUY", "SELL", "HOLD" reasoning: str # Lý do chi tiết đằng sau quyết định key_points: List[str] # Các điểm quan trọng timestamp: datetime # Thời gian đưa ra phản hồi
Bước 2: Tạo lớp cơ sở cho tất cả Agents
class BaseAgent(ABC): """Lớp cơ sở cho tất cả các trading agents""" def __init__(self, api_key: str, personality: AgentPersonality): self.api_key = api_key self.personality = personality self.conversation_history = [] # Lưu lại lịch sử cuộc trò chuyện @abstractmethod async def analyze(self, context, team_discussion: List[str] = None): """ Phương thức trừu tượng mà mỗi agent phải implement Args: context: Thông tin về cổ phiếu và thị trường team_discussion: Cuộc thảo luận trước đó của nhóm (QUAN TRỌNG!) Returns: AgentResponse: Phản hồi có cấu trúc của agent """ pass
Điểm quan trọng: Tham số team_discussion
chính là "linh hồn" của A2A protocol. Nó cho phép mỗi agent không chỉ phân tích dữ liệu thô, mà còn có thể "nghe" và "phản hồi" với những gì các agents khác đã nói trước đó.
Bước 3: Agent Manager - Người điều phối cuộc thảo luận
class AgentManager: """Quản lý và điều phối giao tiếp A2A giữa các agents""" def __init__(self): self.agents = {} # Dictionary lưu trữ các agents self.team_discussion = [] # Nội dung cuộc thảo luận chung def add_agent(self, agent_id: str, agent: BaseAgent): """Thêm một agent vào nhóm""" self.agents[agent_id] = agent async def facilitate_discussion(self, context): """ Điều phối cuộc thảo luận A2A - đây là phần quan trọng nhất! """ responses = [] # Giai đoạn 1: Market Analyst bắt đầu cuộc thảo luận print("🔍 Minh Anh đang phân tích...") analyst_response = await self.agents['analyst'].analyze(context) responses.append(analyst_response) # Thêm ý kiến của Analyst vào cuộc thảo luận chung self.team_discussion.append( f"{analyst_response.agent_name}: {analyst_response.reasoning}" ) # Giai đoạn 2: Risk Manager phản hồi lại Analyst print("⚠️ Quốc Bảo đang đánh giá rủi ro...") risk_response = await self.agents['risk_manager'].analyze( context, self.team_discussion # Truyền cuộc thảo luận trước đó! ) responses.append(risk_response) # Thêm ý kiến của Risk Manager vào cuộc thảo luận self.team_discussion.append( f"{risk_response.agent_name}: {risk_response.reasoning}" ) # Giai đoạn 3: Portfolio Manager tổng hợp tất cả print("💼 Thị Mai đang đưa ra quyết định cuối...") pm_response = await self.agents['portfolio_manager'].analyze( context, self.team_discussion # Toàn bộ cuộc thảo luận đến thời điểm này ) responses.append(pm_response) return responses
Điểm đột phá: Mỗi agent không chỉ phân tích dữ liệu gốc, mà còn xây dựng dựa trên những insight từ các agents trước đó. Điều này tạo ra một cuộc thảo luận thực sự có chiều sâu.
Triển khai chi tiết: Market Analyst Agent
Bây giờ chúng ta sẽ implement cụ thể agent đầu tiên - Nguyễn Minh Anh:
import google.generativeai as genai class MarketAnalystAgent(BaseAgent): """Nguyễn Minh Anh - Chuyên gia phân tích kỹ thuật""" def __init__(self, api_key: str): # Định nghĩa tính cách chi tiết của Minh Anh personality = AgentPersonality( name="Nguyễn Minh Anh", role="Senior Market Analyst", personality_traits=[ "Tỉ mỉ với dữ liệu", "Thích phân tích biểu đồ", "Hay trích dẫn Warren Buffett", "Tập trung vào kỹ thuật" ], speaking_style=""" Nói chuyện chuyên nghiệp nhưng thân thiện. Thường sử dụng: - "Theo phân tích kỹ thuật thì..." - "Dữ liệu cho thấy..." - "Warren Buffett từng nói..." - Trích dẫn các chỉ số kỹ thuật cụ thể """ ) super().__init__(api_key, personality) # Khởi tạo model AI genai.configure(api_key=api_key) self.model = genai.GenerativeModel('gemini-pro') async def analyze(self, context, team_discussion: List[str] = None): """Phân tích chính của Market Analyst""" # Tạo prompt động dựa trên cuộc thảo luận prompt = self._create_analysis_prompt(context, team_discussion) # Gọi AI để phân tích response = await self.model.generate_content_async(prompt) analysis_text = response.text # Xử lý kết quả thành cấu trúc có tổ chức return AgentResponse( agent_name=self.personality.name, confidence_level=self._calculate_confidence(context), recommendation=self._extract_recommendation(analysis_text), reasoning=analysis_text, key_points=self._extract_key_points(analysis_text), timestamp=datetime.now() ) def _create_analysis_prompt(self, context, team_discussion): """Tạo prompt động - đây là phần quan trọng nhất!""" # Phần cơ bản về vai trò và tính cách prompt = f""" Bạn là {self.personality.name}, {self.personality.role} với 8 năm kinh nghiệm. TÍNH CÁCH VÀ PHONG CÁCH: - {', '.join(self.personality.personality_traits)} - {self.personality.speaking_style} THÔNG TIN CỔ PHIẾU HIỆN TẠI: - Mã: {context.symbol} - Giá hiện tại: {context.current_price:,.0f} VND - Khối lượng giao dịch: {context.volume:,.0f} - Tỷ lệ P/E: {context.pe_ratio} - Ngành: {context.sector} NHIỆM VỤ: Hãy phân tích kỹ thuật cổ phiếu này từ góc độ chuyên gia. """ # Phần quan trọng: Thêm context từ cuộc thảo luận trước (nếu có) if team_discussion: prompt += f""" 🗣️ CUỘC THẢO LUẬN TRƯỚC ĐÓ CỦA NHÓM: {chr(10).join(team_discussion)} Hãy đọc kỹ những gì đồng nghiệp đã nói ở trên, sau đó đưa ra phân tích kỹ thuật của bạn. Bạn có thể đồng ý, không đồng ý, hoặc bổ sung thêm góc nhìn mới. Hãy thể hiện tính cách của {self.personality.name} trong cách trả lời. """ else: prompt += """ Đây là lần phân tích đầu tiên, hãy đưa ra nhận định kỹ thuật ban đầu về cổ phiếu này. """ return prompt def _extract_recommendation(self, analysis_text): """Trích xuất khuyến nghị từ văn bản phân tích""" text_upper = analysis_text.upper() # Tìm kiếm các từ khóa if any(word in text_upper for word in ["MUA", "BUY", "TÍCH CỰC", "KHUYẾN MẠI"]): return "BUY" elif any(word in text_upper for word in ["BÁN", "SELL", "TRÁNH", "GIẢM"]): return "SELL" else: return "HOLD" def _calculate_confidence(self, context): """Tính mức độ tự tin dựa trên chất lượng dữ liệu""" confidence = 5 # Mức cơ bản # Tăng độ tin cậy nếu có đủ dữ liệu if context.pe_ratio and context.pe_ratio < 15: confidence += 1 if context.volume > 1000000: # Khối lượng giao dịch cao confidence += 1 if context.current_price > 0: # Có giá hợp lệ confidence += 1 return min(10, confidence) # Tối đa 10
Kỹ thuật Prompt Engineering cho A2A
Điểm đột phá của A2A nằm ở prompt engineering động. Prompt không cố định mà thay đổi theo luồng cuộc trò chuyện:
Round 1: Phân tích ban đầu (không có thảo luận trước)
prompt_round_1 = """
Bạn là Nguyễn Minh Anh, Senior Market Analyst. THÔNG TIN CỔ PHIẾU VCB:
- Giá: 85,000 VND
- Khối lượng: 2,500,000 - P/E: 12.5 Hãy đưa ra phân tích kỹ thuật ban đầu.
"""
Round 2: Phản hồi với context từ cuộc thảo luận
prompt_round_2 = """
CUỘC THẢO LUẬN TRƯỚC ĐÓ:
Nguyễn Minh Anh: "VCB có setup kỹ thuật tích cực, RSI oversold, khối lượng tăng mạnh. Khuyến nghị MUA với target 92,000..." Bạn là Trần Quốc Bảo, Risk Manager. Hãy đánh giá rủi ro và phản hồi lại phân tích của Minh Anh.
"""
Round 3: Tổng hợp với toàn bộ context
prompt_round_3 = """
CUỘC THẢO LUẬN ĐẦY ĐỦ:
Minh Anh: "Technical bullish, khuyến nghị MUA"
Quốc Bảo: "Rủi ro cao, giới hạn tỷ lệ đầu tư ở 5%" Bạn là Lê Thị Mai, Portfolio Manager. Hãy tổng hợp và đưa ra quyết định cuối cùng.
"""
Điểm quan trọng: Mỗi agent không chỉ nhận thông tin thô mà còn có toàn bộ ngữ cảnh cuộc trò chuyện, cho phép tạo ra những phản hồi có chiều sâu và liên kết.
Demo thực tế: Cuộc thảo luận về cổ phiếu VCB
Khi chạy hệ thống với cổ phiếu VCB, đây là cuộc thảo luận thực tế được tạo ra:
🔍 Nguyễn Minh Anh (Market Analyst):
"Chào team! Mình vừa phân tích kỹ thuật cổ phiếu VCB và thấy khá nhiều tín hiệu tích cực. Hiện tại VCB đang giao dịch ở mức 85,000 VND, đang test vùng support quan trọng.
Theo phân tích kỹ thuật thì RSI đang ở vùng oversold (28), đây thường là dấu hiệu cho potential reversal. Khối lượng giao dịch cũng tăng đáng kể lên 2.5 triệu cổ phiếu, cho thấy sự quan tâm của nhà đầu tư. MACD histogram bắt đầu có dấu hiệu divergence tích cực.
Warren Buffett từng nói 'Be greedy when others are fearful' - và theo mình nhìn, đây có thể là timing tốt để accumulate. Target price mình đưa ra là 92,000 VND trong 2-3 tháng tới. Khuyến nghị: MUA"
Độ tin cậy: 8/10
⚠️ Trần Quốc Bảo (Risk Manager):
"Cảm ơn Minh Anh về phân tích technical rất chi tiết. Tuy nhiên, từ góc độ quản lý rủi ro, mình có một vài concerns cần team lưu ý.
Đầu tiên, mặc dù P/E của VCB ở 12.5x trông reasonable, nhưng toàn ngành banking hiện đang face pressure từ các quy định Basel II và hạn chế tăng trưởng tín dụng. Cẩn thận với sector headwinds này nhé!
Thứ hai, nhớ cuộc khủng hoảng 2018 không? Banking stocks có thể rất volatile khi market sentiment đảo chiều. Risk/reward ratio cần được tính toán cẩn thận.
Nếu team quyết định đầu tư, mình đề xuất maximum allocation 5% portfolio với stop-loss nghiêm ngặt ở 82,000 VND. Position sizing là chìa khóa để preserve capital trong dài hạn."
Độ tin cậy: 9/10
💼 Lê Thị Mai (Portfolio Manager):
"Team insights rất valuable! Sau khi cân nhắc cả technical opportunity từ Minh Anh và risk considerations từ Bảo, mình đưa ra quyết định cuối cùng như sau:
Quyết định: MUA VCB với 4% allocation
Lý do: Balance giữa upside potential và risk management. Technical setup mà Minh Anh phân tích là solid, nhưng những risk factors mà Bảo point out cũng very valid.
Execution strategy:
- DCA (Dollar Cost Averaging) trong 2 tuần thay vì lump sum
- Stop-loss ở 82,000 VND như Bảo suggest
- Take profit partial ở 90,000, full exit ở 92,000
- Monitor closely cho volume confirmation
Timing là quan trọng - chúng ta sẽ execute khi price break above 86,500 với volume backing. Macro environment cũng cần watch - nếu Fed pivot hawkish thì emerging markets sẽ bị impact."
Độ tin cậy: 8.5/10
Phân tích kết quả: So sánh Single Agent vs A2A Team
Với Single Agent truyền thống:
Input: Dữ liệu VCB
Output: "MUA VCB, confidence 7/10"
Reasoning: "Technical analysis shows bullish signals"
Vấn đề: Thiếu chiều sâu, không có risk assessment, không có strategy cụ thể.
Với A2A Team:
Input: Dữ liệu VCB
Output: "MUA VCB 4% allocation, DCA strategy, stop-loss 82k"
Reasoning: Multi-dimensional analysis bao gồm:
- Technical: RSI oversold, volume surge, MACD divergence
- Risk: Sector headwinds, position sizing, stop-loss
- Strategy: DCA execution, timing conditions, exit plan
Ưu điểm rõ rệt: Comprehensive, có risk management, actionable strategy.
Setup và Deployment
Cài đặt dependencies
# Clone repository
git clone https://github.com/huudatscience/Agent-to-agent-ai-trading-vietnam.git
cd Agent-to-agent-ai-trading-vietnam # Tạo virtual environment
python -m venv venv
source venv/bin/activate # Trên Windows: venv\Scripts\activate # Cài đặt packages
pip install -r requirements.txt
File requirements.txt:
streamlit==1.28.0
google-generativeai==0.3.0
plotly==5.17.0
pandas==2.1.0
asyncio==3.4.3
python-dotenv==1.0.0
Cấu hình API keys
Tạo file .env
:
GOOGLE_GENAI_API_KEY=your_api_key_here
Hoặc nhập trực tiếp trong Streamlit sidebar.
Chạy ứng dụng
streamlit run app.py
Hình ảnh kết quả
Lời kết
Giao thức Agent-to-Agent không chỉ là một innovation kỹ thuật mà còn là bước tiến quan trọng trong việc tạo ra AI systems more human-like và collaborative. Thay vì một AI "biết tuốt", chúng ta đang hướng tới teams of AI experts có thể thảo luận, tranh luận và học hỏi lẫn nhau.
Dự án AI Trading Team Vietnam đã chứng minh rằng A2A có thể được applied thành công trong financial domain với Vietnamese market localization. Hy vọng qua bài chia sẻ này, các bạn sẽ có inspiration để thử nghiệm A2A trong các domains khác nhau.
Cảm ơn các bạn đã đọc đến đây!
Nếu có questions hoặc muốn thảo luận thêm về A2A protocol, đừng ngại comment bên dưới. Mình rất mong được nghe feedback và ý tưởng từ cộng đồng Viblo! 🚀
Useful links:
- Source code: GitHub Repository
- Blog cá nhân (chia sẻ nhiều thứ): Blog