Không phải về tốc độ. Mà là về việc tạo ra nhiều tác nhân với các góc nhìn khác nhau tranh luận về một quyết định và đi đến kết luận tốt hơn bất kỳ tác nhân nào đơn lẻ. Kèm theo mã nguồn đầy đủ cho bộ điều phối, các chuyên gia và quá trình tổng hợp.
Khi bạn yêu cầu một mô hình đánh giá một quyết định, nó chỉ đưa ra một góc nhìn, thường là mang tính trung bình và thận trọng. Nó có xu hướng đồng ý, làm mượt, tìm kiếm sự cân bằng. Đó chính là vấn đề: một quyết định quan trọng không thể được đánh giá bởi một góc nhìn trung bình duy nhất, nó phải bị tấn công từ nhiều phía khác nhau.
Một đàn tác nhân (swarm) giải quyết vấn đề này một cách có cấu trúc. Bạn tạo ra nhiều chuyên gia, mỗi người có một vai trò và thiên kiến cố định: một người chỉ nghĩ về tiền bạc, người khác chỉ nghĩ về rủi ro kỹ thuật, người thứ ba chỉ nghĩ về người dùng. Họ phân tích một quyết định một cách độc lập, đưa ra các kết luận khác nhau, và sau đó bạn buộc phải dung hòa những kết luận đó. Giá trị ở đây không phải là tốc độ mà là sự bất đồng được xây dựng ngay trong cấu trúc. Một tác nhân đơn lẻ có xu hướng rơi vào tư duy tập thể với chính nó, một đàn các vai trò thì không.
Bài viết này chỉ ra cách xây dựng một đàn tác nhân như vậy, kèm mã nguồn. Chúng ta sẽ đề cập đến ba phần: bộ điều phối phân công vai trò, các chuyên gia phân tích độc lập và quá trình tổng hợp dung hòa chúng thành một kết luận.
Kiến trúc: Bộ điều phối, Chuyên gia, Tổng hợp
Một đàn tác nhân để phân tích bao gồm ba thành phần.
Bộ điều phối nhận nhiệm vụ và quyết định vai trò chuyên gia nào cần thiết. Để đánh giá một buổi ra mắt sản phẩm, các vai trò này có thể là một nhà đầu tư, một kỹ sư, một chuyên gia sản phẩm, một người phụ trách bảo mật. Bộ điều phối không tự phân tích, nó chỉ phân công vai trò.
Các chuyên gia làm việc song song và độc lập. Mỗi người đều nhìn thấy cùng một quyết định nhưng qua lăng kính riêng của mình. Quan trọng là, họ không thấy kết luận của nhau, nếu không sự tuân thủ sẽ xuất hiện. Tính độc lập chính là thứ tạo ra các góc nhìn khác nhau.
Bộ tổng hợp thu thập các kết luận của chuyên gia và dung hòa chúng: nơi họ đồng ý, nơi họ mâu thuẫn, phán quyết cuối cùng xuyên suốt mọi góc nhìn là gì. Đây không phải là phép tính trung bình mà là một sự tổng hợp giữ lại sự bất đồng như một tín hiệu.

Bước 1: Client Cơ bản
Bắt đầu với một client đơn giản cho mô hình. Tôi sử dụng định dạng tin nhắn tương thích với OpenAI, nó hoạt động với hầu hết các nhà cung cấp và Ollama cục bộ.
1import requests2import json3from concurrent.futures import ThreadPoolExecutor45API = "http://localhost:11434/api/chat" # Ollama, hoặc endpoint của nhà cung cấp6MODEL = "qwen2.5:32b"78def ask(system, user, temperature=0.7):9 resp = requests.post(API, json={10 "model": MODEL,11 "messages": [12 {"role": "system", "content": system},13 {"role": "user", "content": user},14 ],15 "temperature": temperature,16 "stream": False,17 }, timeout=120)18 resp.raise_for_status()19 return resp.json()["message"]["content"]
Bước 2: Bộ điều phối Phân công Vai trò
Bộ điều phối nhận nhiệm vụ và quyết định chuyên gia nào cần thiết. Đừng mã cứng các vai trò trước, hãy để mô hình chọn chúng cho nhiệm vụ cụ thể, điều này làm cho đàn tác nhân trở nên tổng quát. Yêu cầu JSON nghiêm ngặt để phân tích cú pháp.
1ORCHESTRATOR_SYSTEM = """Bạn là bộ điều phối của một đàn tác nhân phân tích.2Đối với nhiệm vụ, hãy xác định 3-5 vai trò chuyên gia sẽ đưa ra các góc nhìn3KHÁC NHAU và xung đột nhất về quyết định. Các vai trò phải xung đột về4lợi ích, không phải bổ sung cho nhau.56Đối với mỗi vai trò, hãy đưa ra: tên, trọng tâm (thứ nó cố định vào), thiên kiến (thứ nó7có thiên hướng, thứ nó có xu hướng đánh giá quá cao).89Chỉ trả lời bằng một mảng JSON, không giải thích:10[{"name": "...", "focus": "...", "bias": "..."}, ...]11"""1213def plan_roles(task):14 raw = ask(ORCHESTRATOR_SYSTEM, f"Nhiệm vụ cần phân tích:\n{task}",15 temperature=0.9) # nhiệt độ cao hơn để đa dạng vai trò16 # cắt lấy JSON trong trường hợp mô hình thêm văn bản xung quanh17 start, end = raw.find("["), raw.rfind("]") + 118 return json.loads(raw[start:end])
Chúng tôi cố tình giữ nhiệt độ cao ở đây: chúng tôi muốn các vai trò đa dạng, không hiển nhiên. Yêu cầu "các vai trò phải xung đột" trong prompt là chìa khóa, nếu không có nó, mô hình sẽ đưa ra ba vai trò gần như giống hệt nhau và toàn bộ ý nghĩa của đàn tác nhân sẽ mất đi.
Bước 3: Các Chuyên gia Phân tích Song song và Độc lập
Mỗi chuyên gia nhận vai trò của mình và cùng một quyết định. Quan trọng: họ chạy song song và không thấy kết luận của nhau. Tính song song ở đây không chỉ để tăng tốc độ, nó đảm bảo tính độc lập, một chuyên gia về mặt vật lý không thể điều chỉnh theo ý kiến của người khác.
1EXPERT_SYSTEM = """Bạn là một chuyên gia với vai trò: {name}.2Trọng tâm của bạn: {focus}.3Thiên kiến của bạn: {bias}. Đừng chống lại nó, đó là giá trị của bạn đối với phân tích.45Phân tích quyết định MỘT CÁCH NGHIÊM NGẶT từ vị trí của bạn. Đừng cân bằng,6đừng cố gắng tính đến các quan điểm khác, các chuyên gia khác sẽ làm điều đó.7Công việc của bạn là đẩy góc nhìn của mình đến giới hạn.89Đưa ra:10- một phán quyết từ vị trí của bạn (ủng hộ / phản đối / có điều kiện)11- 2-3 lập luận chính từ góc nhìn cụ thể của bạn12- 1 rủi ro có thể thấy rõ nhất từ vị trí của bạn và người khác sẽ bỏ lỡ13Ngắn gọn và sắc sảo, không lan man."""1415def run_expert(role, task):16 system = EXPERT_SYSTEM.format(**role)17 opinion = ask(system, f"Quyết định cần phân tích:\n{task}", temperature=0.7)18 return {"role": role["name"], "opinion": opinion}1920def run_swarm(roles, task):21 # khởi chạy song song: độc lập cộng với tốc độ22 with ThreadPoolExecutor(max_workers=len(roles)) as pool:23 futures = [pool.submit(run_expert, role, task) for role in roles]24 return [f.result() for f in futures]
Lưu ý prompt của chuyên gia: chúng tôi chính thức cấm nó cân bằng. Điều này có vẻ phản trực giác, nhưng đây là toàn bộ ý nghĩa. Nếu mỗi chuyên gia cố gắng tính đến mọi khía cạnh, bạn sẽ có năm ý kiến thận trọng giống hệt nhau. Bằng cách buộc mỗi người đẩy góc nhìn của mình đến giới hạn, bạn có được một phổ thực sự, sau đó bộ tổng hợp sẽ dung hòa.
Bước 4: Bộ Tổng hợp Dung hòa Các Kết luận
Bây giờ chúng ta có một số ý kiến sắc sảo, phiến diện. Bộ tổng hợp thu thập chúng thành một phán quyết, nhưng không phải bằng cách lấy trung bình. Nó tìm kiếm nơi các chuyên gia đồng ý (một tín hiệu mạnh), nơi họ mâu thuẫn (một vùng rủi ro đòi hỏi quyết định), và cái gì quan trọng hơn cái gì.
1MERGE_SYSTEM = """Bạn là người tổng hợp của một đàn tác nhân phân tích. Bạn được2cung cấp ý kiến của một số chuyên gia với các thiên kiến khác nhau về một quyết định.34Công việc của bạn KHÔNG phải là lấy trung bình. Công việc của bạn là:51. Đồng thuận: những gì các chuyên gia đồng ý bất chấp các vị trí khác nhau.6 Đây là tín hiệu đáng tin cậy nhất, hãy làm nổi bật nó.72. Xung đột: nơi các chuyên gia mâu thuẫn trực tiếp. Đừng làm mượt nó,8 hãy nêu tên xung đột một cách rõ ràng và nói mỗi bên phải trả giá gì.93. Điểm mù: một rủi ro chỉ một chuyên gia nêu ra, nhưng nó quan trọng.104. Phán quyết cuối cùng xuyên suốt mọi thứ: ủng hộ / phản đối / có điều kiện, và11 trong những điều kiện nào thì nó thay đổi.1213Viết dày đặc. Giữ lại sự bất đồng như một thông tin, đừng che giấu nó."""1415def merge_opinions(task, opinions):16 block = "\n\n".join(17 f"### Chuyên gia: {o['role']}\n{o['opinion']}" for o in opinions18 )19 user = f"Quyết định:\n{task}\n\nÝ kiến chuyên gia:\n{block}"20 return ask(MERGE_SYSTEM, user, temperature=0.4) # nhiệt độ thấp hơn để tổng hợp tỉnh táo
Chúng tôi hạ nhiệt độ ở bước tổng hợp: nếu các chuyên gia nên đa dạng (nhiệt độ cao), thì người tổng hợp nên tỉnh táo và nhất quán (nhiệt độ thấp). Hướng dẫn chính ở đây là "đừng lấy trung bình, hãy giữ lại sự bất đồng như một thông tin." Một quá trình tổng hợp thông thường sẽ làm mọi thứ trở nên nhão nhoẹt, "một mặt, mặt khác." Một quá trình tổng hợp tốt sẽ nói thẳng thắn: đây là nơi mọi người đồng ý, và đây là một xung đột và nó có giá như thế này.
Bước 4.5: Người Biện hộ cho Quỷ chống lại Sự Đồng thuận Giả tạo
Có một mối nguy hiểm thầm lặng: đôi khi các chuyên gia đồng ý không phải vì quyết định là tốt, mà vì mọi người đều đang nhìn theo cùng một hướng theo quán tính. Đây là sự đồng thuận giả tạo, và nó nguy hiểm hơn xung đột công khai, bởi vì nó trông giống như sự tự tin.
Để chống lại điều này, chúng tôi thêm một tác nhân đặc biệt, người biện hộ cho quỷ. Công việc duy nhất của nó là tấn công sự đồng thuận. Nó thấy tất cả các ý kiến của chuyên gia và có nghĩa vụ tìm ra lý do tại sao tất cả họ có thể cùng sai. Nếu đàn tác nhân nhất trí bỏ phiếu "ủng hộ," người biện hộ tìm kiếm một kịch bản nơi nó là một thảm họa.
1DEVIL_SYSTEM = """Bạn là người biện hộ cho quỷ trong một đàn tác nhân phân tích. Bạn2được cung cấp các ý kiến của chuyên gia. Công việc duy nhất của bạn: tấn công sự đồng thuận của họ.34Nếu các chuyên gia hội tụ vào một điều gì đó, hãy tìm ra lý do tại sao tất cả họ có thể5CÙNG sai CÙNG MỘT LÚC. Hãy tìm kiếm một điểm mù chung: một giả định mà mọi người đều chấp nhận6mà không kiểm tra, một kịch bản không ai xem xét vì nó bất tiện.78Đừng lịch sự. Giá trị của bạn là bạn nói những gì nhóm không muốn nghe.9Đưa ra:10- giả định chung nào của các chuyên gia là nguy hiểm nhất11- một kịch bản trong đó ý kiến nhất trí của đàn tác nhân hóa ra sai lầm nghiêm trọng12- một câu hỏi mà nhóm cẩn thận tránh né13Nếu không có sự đồng thuận và các chuyên gia thực sự bất đồng, hãy nói thẳng điều đó14và chỉ ra xung đột chưa được giải quyết gay gắt nhất."""1516def run_devil(task, opinions):17 block = "\n\n".join(18 f"### {o['role']}\n{o['opinion']}" for o in opinions19 )20 user = f"Quyết định:\n{task}\n\nÝ kiến đàn tác nhân:\n{block}"21 return ask(DEVIL_SYSTEM, user, temperature=0.8)
Người biện hộ chạy sau các chuyên gia nhưng trước khi tổng hợp, và cuộc tấn công của nó đi vào quá trình tổng hợp cùng với các ý kiến. Vấn đề là ngay cả một đàn tác nhân nhất trí cũng có ít nhất một tác nhân có nghĩa vụ tìm kiếm một vết nứt. Điều này rẻ (một lần gọi) và phá vỡ tư duy tập thể về mặt cấu trúc: sự đồng thuận bây giờ phải sống sót sau một cuộc tấn công, không chỉ đơn thuần xảy ra.
Bước 4.6: Một Vòng Tranh luận để Làm Sắc nét Xung đột
Lượt chuyên gia đầu tiên là độc lập, và điều đó đúng để tạo sự đa dạng. Nhưng sau khi các ý kiến được thu thập, bạn có thể thực hiện một vòng tranh luận: cho mỗi chuyên gia thấy một bản tóm tắt các ý kiến của người khác và để họ phản đối. Điều này làm sắc nét các xung đột, các lập luận yếu rơi rụng, các lập luận mạnh được củng cố.
1DEBATE_SYSTEM = """Bạn là chuyên gia {name} trong vòng phân tích thứ hai.2Vị trí ban đầu của bạn:3{own_opinion}45Bây giờ bạn thấy các ý kiến của các chuyên gia khác. Đừng nhượng bộ dưới áp lực, nhưng6cũng đừng phớt lờ các lập luận mạnh mẽ. Đưa ra:7- nơi lập luận của người khác thực sự chạm đến vị trí của bạn, hãy thừa nhận nó một cách trung thực8- nơi bạn giữ vững lập trường và tại sao sự phản đối của họ là yếu9- liệu bạn có thay đổi phán quyết của mình sau cuộc tranh luận hay không, và nếu có, như thế nào10Ngắn gọn. Đây không phải là sự lặp lại của ý kiến đầu tiên, mà là một phản ứng đối với các đối thủ."""1112def debate_round(roles, task, opinions):13 others_map = {}14 for o in opinions:15 others = "\n\n".join(16 f"### {x['role']}\n{x['opinion']}" for x in opinions if x is not o17 )18 others_map[o["role"]] = others1920 def rebut(o):21 system = DEBATE_SYSTEM.format(name=o["role"], own_opinion=o["opinion"])22 user = (f"Quyết định:\n{task}\n\n"23 f"Ý kiến của đối thủ:\n{others_map[o['role']]}")24 return {"role": o["role"], "opinion": ask(system, user, temperature=0.6)}2526 with ThreadPoolExecutor(max_workers=len(opinions)) as pool:27 return list(pool.map(rebut, opinions))
Vòng tranh luận cũng song song: mỗi chuyên gia phản ứng với tất cả những người khác cùng một lúc, một lần nữa không có sự tuân thủ thời gian thực. Sau cuộc tranh luận, các ý kiến thường sắc nét hơn: bạn có thể thấy vị trí nào đứng vững dưới hỏa lực và vị trí nào sụp đổ. Chính những ý kiến đã được củng cố này mới đi vào quá trình tổng hợp cuối cùng.
Bước 5: Kết hợp Tất cả Lại với Nhau
1def analyze(task, debate=True):2 print("Bộ điều phối đang chọn vai trò...")3 roles = plan_roles(task)4 for r in roles:5 print(f" - {r['name']}: {r['focus']}")67 print(f"\nĐang khởi chạy {len(roles)} chuyên gia song song...")8 opinions = run_swarm(roles, task)9 for o in opinions:10 print(f"\n[{o['role']}]\n{o['opinion']}")1112 # vòng tranh luận tùy chọn: các chuyên gia phản bác lẫn nhau13 if debate:14 print("\nVòng tranh luận, các chuyên gia phản bác lẫn nhau...")15 opinions = debate_round(roles, task, opinions)1617 # người biện hộ cho quỷ tấn công sự đồng thuận của đàn tác nhân18 print("\nNgười biện hộ cho quỷ đang tìm kiếm một vết nứt trong sự đồng thuận...")19 devil = run_devil(task, opinions)20 print(f"\n[Người biện hộ cho quỷ]\n{devil}")2122 # tổng hợp dung hòa các kết luận cộng với cuộc tấn công của người biện hộ23 print("\nBộ tổng hợp đang dung hòa các kết luận...")24 opinions_plus = opinions + [{"role": "Người biện hộ cho quỷ", "opinion": devil}]25 verdict = merge_opinions(task, opinions_plus)26 print(f"\n=== PHÁN QUYẾT CUỐI CÙNG ===\n{verdict}")27 return verdict2829if __name__ == "__main__":30 analyze(31 "Chúng tôi muốn loại bỏ gói miễn phí và làm cho sản phẩm hoàn toàn trả phí "32 "với bản dùng thử 14 ngày. Chúng tôi có nên làm điều đó không?"33 )
Chạy đoạn mã này, bạn sẽ thấy toàn bộ quy trình: bộ điều phối chọn vai trò, các chuyên gia cắt sự thật từ góc nhìn của họ, tranh luận với nhau trong vòng tranh luận, người biện hộ tấn công sự đồng thuận của họ, và bộ tổng hợp đưa ra phán quyết xuyên suốt mọi thứ, bao gồm cả cuộc tấn công. Một tác nhân đơn lẻ cho cùng câu hỏi này sẽ đưa ra một câu trả lời mơ hồ "nó phụ thuộc vào đối tượng của bạn," đàn tác nhân đưa ra một sự phân tích có cấu trúc nơi các xung đột là rõ ràng và sự đồng thuận được kiểm tra áp lực.
Điều Gì Làm Cho Đàn Tác Nhân Này Hoạt động
Ba điều phân biệt một đàn tác nhân hữu ích với một màn kịch được tạo ra từ các tác nhân.
Các vai trò phải xung đột, không phải bổ sung. Nếu các chuyên gia của bạn là "một nhà tiếp thị, một chuyên gia SMM, một quản lý nội dung," họ sẽ đưa ra các câu trả lời gần như giống hệt nhau, bởi vì lợi ích của họ trùng khớp. Giá trị thực sự là khi lợi ích xung đột: tăng trưởng so với bền vững, tốc độ so với chất lượng, tiền bạc ngay bây giờ so với lòng tin sau này. Một xung đột lợi ích là thứ phá vỡ quyết định.
Các chuyên gia không được nhìn thấy nhau. Ngay khi một chuyên gia thấy ý kiến của người khác, sự tuân thủ bắt đầu, nó điều chỉnh. Tính độc lập không phải là một chi tiết triển khai, nó là một điều kiện làm việc. Khởi chạy song song cung cấp nó miễn phí.
Bộ tổng hợp không lấy trung bình, nó bảo tồn xung đột. Một sự tổng hợp tồi biến năm ý kiến sắc sảo thành một bản tóm tắt vô hại. Một sự tổng hợp tốt giữ cho xung đột có thể nhìn thấy, bởi vì xung đột là thông tin có giá trị nhất: nó cho thấy nơi quyết định thực sự rủi ro, không phải nơi mọi người gật đầu đồng ý.
Nơi để Mở rộng
Khung xương này mở rộng theo những hướng rõ ràng. Bạn có thể thêm một vòng tranh luận: sau lần tổng hợp đầu tiên, cho các chuyên gia thấy bản tóm tắt và để họ phản đối, điều này làm sắc nét các xung đột. Bạn có thể đặt một người phán xử trên một mô hình mạnh hơn các chuyên gia để cân nhắc các lập luận. Bạn có thể làm cho các vai trò trở nên cố định cho một loại quyết định lặp lại, để bạn không tạo ra chúng mỗi lần.
Nhưng nguyên tắc cơ bản vẫn giữ nguyên: các lăng kính khác nhau, phân tích độc lập, một sự tổng hợp tôn trọng sự bất đồng. Một đàn tác nhân hữu ích cho việc phân tích không phải vì có nhiều tác nhân, mà bởi vì chúng nhìn khác nhau và không để nhau trượt vào một mẫu số chung. Hãy lấy một quyết định mà bạn đang tự suy nghĩ trong đầu ngay bây giờ và chạy nó qua một đàn tác nhân như vậy. Bạn sẽ thấy những góc nhìn mà bạn đã không nắm giữ.





