[ad_1]
Để điều phối LLM, AutoGen dựa vào mô hình hội thoại. Ý tưởng cơ bản là các tác nhân trò chuyện với nhau để giải quyết vấn đề. Giống như cách con người cải thiện công việc của nhau, LLM lắng nghe những gì người khác nói và sau đó cung cấp những cải tiến hoặc thông tin mới.
Mặc dù ban đầu người ta có thể mong đợi tất cả công việc sẽ được thực hiện bởi LLM, nhưng các hệ thống tác nhân cần nhiều hơn chỉ chức năng này. MỘTcác bài báo như Voyager đã chỉ ra, sẽ đạt được hiệu suất vượt trội bằng cách tạo ra các kỹ năng và công cụ cho các đại lý sử dụng. Điều này có nghĩa là cho phép hệ thống lưu và thực thi các chức năng được LLM mã hóa trước đó và cũng để ngỏ khả năng cho các tác nhân như con người đóng vai trò nào đó. Do đó, các tác giả quyết định có ba nguồn chính cho tác nhân: LLM, Con người và Công cụ.
Như chúng ta có thể thấy ở trên, chúng ta có một lớp cha được gọi là ConversableAgent
cho phép sử dụng bất kỳ nguồn nào trong ba nguồn. Từ lớp cha này, các lớp con của chúng ta AssistantAgent
Và UserProxyAgent
được suy ra. Lưu ý rằng điều này cho thấy một mô hình lựa chọn một trong ba nguồn cho tác nhân khi chúng ta tạo các lớp chuyên biệt. Chúng tôi muốn phân chia các tác nhân thành các vai trò rõ ràng để chúng ta có thể sử dụng lập trình hội thoại để chỉ đạo họ.
Với các diễn viên được xác định, chúng ta có thể thảo luận về cách lập trình chúng để hoàn thành mục tiêu cuối cùng của tác nhân. Các tác giả khuyên nên nghĩ về lập trình hội thoại như việc xác định tác nhân nên tính toán những gì và khi nào nên tính toán.
Mỗi đại lý đều có một ship
, obtain
và một generate_reply
chức năng. Đi tuần tự, đầu tiên Agent sẽ nhận được tin nhắn, sau đó generate_reply
, và cuối cùng gửi tin nhắn đến các đại lý khác. Thời điểm một tác nhân nhận được tin nhắn là cách chúng tôi kiểm soát thời điểm quá trình tính toán diễn ra. Chúng ta có thể thực hiện việc này cả khi có và không có người quản lý như chúng ta sẽ thấy bên dưới. Mặc dù mỗi chức năng này có thể được tùy chỉnh, nhưng generate_reply
là nơi mà các tác giả khuyên bạn nên đặt logic tính toán của mình cho tác nhân. Chúng ta hãy xem qua một ví dụ cấp cao từ bài viết dưới đây để xem cách thực hiện điều này.
Làm việc theo cách của chúng tôi, chúng tôi tạo ra hai tác nhân: a AssistantAgent
(tương tác với LLM của OpenAI) và UserProxyAgent
(sẽ đưa ra hướng dẫn và chạy mã được gửi lại). Với UserProxyAgent
các tác giả sau đó đã định nghĩa reply_func_A2B
nơi chúng tôi thấy rằng nếu đại lý gửi lại mã, UserProxyAgent
sau đó sẽ thực thi mã đó. Hơn nữa, để đảm bảo rằng UserProxyAgent
chỉ phản hồi khi cần thiết, chúng tôi có logic bao quanh lệnh gọi thực thi mã đó. Các tổng đài viên sẽ qua lại cho đến khi thông báo chấm dứt được gửi đi hoặc chúng tôi đạt đến số lượng trả lời tự động tối đa hoặc khi một tổng đài viên phản hồi chính nó với số lần tối đa.
Trong hình ảnh trực quan về tương tác đó bên dưới, chúng ta có thể thấy hai tác nhân lặp lại để tạo ra kết quả cuối cùng có ích ngay cho người dùng.
Bây giờ chúng ta đã hiểu ở mức độ cao, hãy đi sâu vào mã với một số ứng dụng ví dụ.
Hãy bắt đầu bằng việc yêu cầu LLM tạo mã chạy cục bộ và yêu cầu LLM chỉnh sửa nếu có bất kỳ trường hợp ngoại lệ nào được đưa ra. Dưới đây tôi đang sửa đổi Ví dụ “Giải quyết tác vụ bằng cách tạo, thực thi và gỡ lỗi mã” từ dự án AutoGen.
from IPython.show import Picture, show
import autogen
from autogen.coding import LocalCommandLineCodeExecutor
import os
config_list = ({
"mannequin": "llama3-70b-8192",
"api_key": os.environ.get('GROQ_API_KEY'),
"base_url":"https://api.groq.com/openai/v1"
})
assistant = autogen.AssistantAgent(
identify="assistant",
llm_config={
"cache_seed": 41, # seed for caching and reproducibility
"config_list": config_list, # an inventory of OpenAI API configurations
"temperature": 0, # temperature for sampling
}, # configuration for autogen's enhanced inference API which is appropriate with OpenAI API
)
# create a UserProxyAgent occasion named "user_proxy"
user_proxy = autogen.UserProxyAgent(
identify="user_proxy",
human_input_mode="NEVER",
max_consecutive_auto_reply=10,
is_termination_msg=lambda x: x.get("content material", "").rstrip().endswith("TERMINATE"),
code_execution_config={
# the executor to run the generated code
"executor": LocalCommandLineCodeExecutor(work_dir="coding"),
},
)
# the assistant receives a message from the user_proxy, which incorporates the duty description
chat_res = user_proxy.initiate_chat(
assistant,
message="""What date is at present? Evaluate the year-to-date acquire for META and TESLA.""",
summary_method="reflection_with_llm",
)
Để đi vào chi tiết, chúng tôi bắt đầu bằng cách khởi tạo hai tác nhân — tác nhân proxy người dùng của chúng tôi (AssistantAgent
) và đại lý LLM của chúng tôi (UserProxyAgent
). Tác nhân LLM được cấp một khóa API để có thể gọi LLM bên ngoài và sau đó là một thông báo hệ thống cùng với cache_seed
để giảm tính ngẫu nhiên trong các lần chạy. Lưu ý rằng AutoGen không giới hạn bạn chỉ sử dụng các điểm cuối OpenAI — bạn có thể kết nối với bất kỳ nhà cung cấp bên ngoài nào tuân theo định dạng API OpenAI (trong ví dụ này, tôi đang giới thiệu Groq).
Tác nhân proxy người dùng có cấu hình phức tạp hơn. Xem qua một số tác nhân thú vị hơn, chúng ta hãy bắt đầu từ đầu. human_input_mode
cho phép bạn xác định mức độ tham gia của con người vào quá trình này. Các ví dụ ở đây và bên dưới chọn “NEVER”
, vì họ muốn quá trình này diễn ra liền mạch nhất có thể khi con người không bao giờ bị nhắc nhở. Nếu bạn chọn một cái gì đó như “ALWAYS”
con người được nhắc nhở mỗi khi tác nhân nhận được tin nhắn. Điểm trung gian là “TERMINATE”
thao tác này sẽ chỉ nhắc người dùng khi chúng tôi nhấn vào max_consecutive_auto_reply
hoặc khi nhận được thông báo chấm dứt từ một trong các tác nhân khác.
Chúng tôi cũng có thể định cấu hình thông báo chấm dứt trông như thế nào. Trong trường hợp này, chúng tôi xem xét liệu TERMINATE
xuất hiện ở cuối tin nhắn mà tác nhân nhận được. Mặc dù đoạn mã trên không hiển thị nó, các lời nhắc được đưa ra cho các tổng đài viên trong thư viện AutoGen là những gì yêu cầu LLM phản hồi theo cách này. Để thay đổi điều này, bạn cần thay đổi lời nhắc và cấu hình.
Cuối cùng, và có lẽ quan trọng nhất, là code_execution_config
. Trong ví dụ này, chúng tôi muốn máy tính của người dùng thực thi mã do LLM tạo ra. Để làm như vậy, chúng tôi chuyển vào đây LocalCommandLineCodeExecutor
sẽ xử lý việc xử lý. Mã ở đây xác định shell cục bộ của hệ thống và sau đó lưu chương trình vào một tệp cục bộ. Sau đó, nó sẽ sử dụng Python subprocess
để thực thi việc này cục bộ và trả về cả thiết bị xuất chuẩn và thiết bị xuất chuẩn, cùng với mã thoát của quy trình con.
Chuyển sang một ví dụ khác, chúng ta hãy xem cách thiết lập tác nhân Retrieval Augmented Technology (RAG) bằng cách sử dụng “Sử dụng RetrieveChat để tạo mã tăng cường Retrieve và trả lời câu hỏi” Ví dụ. Tóm lại, mã này cho phép người dùng hỏi LLM một câu hỏi về nguồn dữ liệu cụ thể và nhận được câu trả lời có độ chính xác cao cho câu hỏi đó.
import json
import osimport chromadb
import autogen
from autogen.agentchat.contrib.retrieve_assistant_agent import RetrieveAssistantAgent
from autogen.agentchat.contrib.retrieve_user_proxy_agent import RetrieveUserProxyAgent
# Accepted file codecs for that may be saved in
# a vector database occasion
from autogen.retrieve_utils import TEXT_FORMATS
config_list = (
{"mannequin": "gpt-3.5-turbo-0125", "api_key": "", "api_type": "openai"},
)
assistant = RetrieveAssistantAgent(
identify="assistant",
system_message="You're a useful assistant.",
llm_config={
"timeout": 600,
"cache_seed": 42,
"config_list": config_list,
},
)
ragproxyagent = RetrieveUserProxyAgent(
identify="ragproxyagent",
human_input_mode="NEVER",
max_consecutive_auto_reply=3,
retrieve_config={
"job": "qa",
"docs_path": (
"https://uncooked.githubusercontent.com/microsoft/FLAML/primary/web site/docs/Examples/Integratepercent20-%20Spark.md",
"https://uncooked.githubusercontent.com/microsoft/FLAML/primary/web site/docs/Analysis.md",
os.path.be part of(os.path.abspath(""), "..", "web site", "docs"),
),
"custom_text_types": ("non-existent-type"),
"chunk_token_size": 2000,
"mannequin": config_list(0)("mannequin"),
"vector_db": "chroma", # conversely cross your shopper right here
"overwrite": False, # set to True if you wish to overwrite an present assortment
},
code_execution_config=False, # set to False if you happen to do not need to execute the code
)
assistant.reset()
code_problem = "How can I take advantage of FLAML to carry out a classification job and use spark to do parallel coaching. Practice 30 seconds and drive cancel jobs if time restrict is reached."
chat_result = ragproxyagent.initiate_chat(
assistant, message=ragproxyagent.message_generator, drawback=code_problem, search_string="spark"
)
Tác nhân LLM được thiết lập tương tự ở đây, chỉ với lớp học RetrieveAssistantAgent
thay vìcó vẻ rất giống với lớp AssistantAgent điển hình.
Đối với RetrieveUserProxyAgent, chúng tôi có một số cấu hình. Từ trên cùng, chúng ta có giá trị “nhiệm vụ” cho Tác nhân biết phải làm gì. Nó có thể là một trong hai “qa”
(câu hỏi và trả lời), “code”
hoặc “default”
Ở đâu “default”
có nghĩa là vừa làm code vừa qa. Những điều này xác định lời nhắc được đưa ra cho đại lý.
Hầu hết phần còn lại của cấu hình truy xuất ở đây được sử dụng để truyền thông tin cho RAG của chúng ta. RAG thường được xây dựng trên tìm kiếm tương tự thông qua nhúng vector, vì vậy cấu hình này cho phép chúng ta chỉ định cách nhúng vector được tạo từ các tài liệu nguồn. Trong ví dụ trên, chúng ta đang truyền qua mô hình tạo ra các nhúng này, kích thước khối mà chúng ta sẽ chia nhỏ các tài liệu nguồn thành cho mỗi nhúng và cơ sở dữ liệu vector được lựa chọn.
Có hai điều cần lưu ý với ví dụ trên. Đầu tiên, nó giả định rằng bạn đang tạo DB vector của mình ngay lập tức. Nếu bạn muốn kết nối với DB vector đã được khởi tạo, AutoGen có thể xử lý việc này, bạn chỉ cần truyền vào máy khách của mình. Thứ hai, bạn nên lưu ý rằng API này đã thay đổi gần đây và công việc dường như vẫn đang diễn ra trên đó nên cấu hình có thể hơi khác khi bạn chạy cục bộ, mặc dù các khái niệm cấp cao có thể vẫn giữ nguyên.
Cuối cùng, hãy xem cách chúng ta có thể sử dụng AutoGen để có ba tác nhân trở lên. Dưới đây chúng tôi có “Trò chuyện nhóm với Người viết mã và Nhà phê bình trực quan” ví dụ, với ba tác nhân: một lập trình viên, một nhà phê bình và một proxy người dùng.
Giống như một mạng lưới, khi chúng ta thêm nhiều tác nhân thì số lượng kết nối sẽ tăng theo tỷ lệ bậc hai. Với các ví dụ trên, chúng tôi chỉ có hai đại lý nên không có quá nhiều tin nhắn có thể gửi. Với ba chúng tôi cần sự hỗ trợ; chúng ta cần một cái máng cỏ.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from IPython.show import Pictureimport autogen
config_list_gpt4 = autogen.config_list_from_json(
"OAI_CONFIG_LIST",
filter_dict={
"mannequin": ("gpt-4", "gpt-4-0314", "gpt4", "gpt-4-32k", "gpt-4-32k-0314", "gpt-4-32k-v0314"),
},
)
llm_config = {"config_list": config_list_gpt4, "cache_seed": 42}
user_proxy = autogen.UserProxyAgent(
identify="User_proxy",
system_message="A human admin.",
code_execution_config={
"last_n_messages": 3,
"work_dir": "groupchat",
"use_docker": False,
}, # Please set use_docker=True if docker is accessible to run the generated code. Utilizing docker is safer than operating the generated code immediately.
human_input_mode="NEVER",
)
coder = autogen.AssistantAgent(
identify="Coder", # the default assistant agent is able to fixing issues with code
llm_config=llm_config,
)
critic = autogen.AssistantAgent(
identify="Critic",
system_message="""Critic. You're a useful assistant extremely expert in evaluating the standard of a given visualization code by offering a rating from 1 (unhealthy) - 10 (good) whereas offering clear rationale. YOU MUST CONSIDER VISUALIZATION BEST PRACTICES for every analysis. Particularly, you may rigorously consider the code throughout the next dimensions
- bugs (bugs): are there bugs, logic errors, syntax error or typos? Are there any the reason why the code might fail to compile? How ought to or not it's fastened? If ANY bug exists, the bug rating MUST be lower than 5.
- Information transformation (transformation): Is the information remodeled appropriately for the visualization sort? E.g., is the dataset appropriated filtered, aggregated, or grouped if wanted? If a date subject is used, is the date subject first transformed to a date object and so on?
- Aim compliance (compliance): how properly the code meets the desired visualization objectives?
- Visualization sort (sort): CONSIDERING BEST PRACTICES, is the visualization sort acceptable for the information and intent? Is there a visualization sort that might be more practical in conveying insights? If a distinct visualization sort is extra acceptable, the rating MUST BE LESS THAN 5.
- Information encoding (encoding): Is the information encoded appropriately for the visualization sort?
- aesthetics (aesthetics): Are the aesthetics of the visualization acceptable for the visualization sort and the information?
YOU MUST PROVIDE A SCORE for every of the above dimensions.
{bugs: 0, transformation: 0, compliance: 0, sort: 0, encoding: 0, aesthetics: 0}
Don't counsel code.
Lastly, based mostly on the critique above, counsel a concrete checklist of actions that the coder ought to take to enhance the code.
""",
llm_config=llm_config,
)
groupchat = autogen.GroupChat(brokers=(user_proxy, coder, critic), messages=(), max_round=20)
supervisor = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)
user_proxy.initiate_chat(
supervisor,
message="obtain information from https://uncooked.githubusercontent.com/uwdata/draco/grasp/information/vehicles.csv and plot a visualization that tells us in regards to the relationship between weight and horsepower. Save the plot to a file. Print the fields in a dataset earlier than visualizing it.",
)
Để bắt đầu, tương tự như các ví dụ trên, chúng ta tạo một tác nhân cho người dùng (UserProxyAgent
), nhưng lần này chúng ta tạo ra 2 tác nhân LLM riêng biệt — một coder và một critic. Coder không được hướng dẫn đặc biệt, nhưng critic thì có. Critics được cung cấp mã từ coder agent và được yêu cầu phê bình theo một mô hình nhất định.
Sau khi tạo tác nhân, chúng tôi lấy cả ba tác nhân và chuyển chúng vào đối tượng GroupChat. Trò chuyện nhóm là một đối tượng dữ liệu theo dõi mọi thứ đã xảy ra. Nó lưu trữ các tin nhắn, lời nhắc để giúp chọn tác nhân tiếp theo và danh sách các tác nhân liên quan.
Các Trình quản lý trò chuyện nhóm sau đó được cung cấp đối tượng dữ liệu này như một cách giúp nó đưa ra quyết định. Bạn có thể cấu hình nó để chọn người nói tiếp theo theo nhiều cách khác nhau bao gồm vòng tròn, ngẫu nhiên và bằng cách cung cấp một hàm. Theo mặc định, nó sử dụng lời nhắc sau: “Learn the above dialog. Then choose the subsequent position from {agentlist} to play. Solely return the position.”
Tất nhiên, bạn có thể điều chỉnh theo ý thích của mình.
Sau khi cuộc trò chuyện diễn ra đủ số vòng tối đa (theo vòng tròn) hoặc khi cuộc trò chuyện diễn ra “TERMINATE”
chuỗi, người quản lý sẽ kết thúc cuộc trò chuyện nhóm. Bằng cách này, chúng ta có thể phối hợp nhiều tác nhân cùng một lúc.
Trong khi nghiên cứu và phát triển LLM tiếp tục tạo ra hiệu suất đáng kinh ngạc, có vẻ như sẽ có những trường hợp ngoại lệ cho cả dữ liệu và hiệu suất mà các nhà phát triển LLM đơn giản là sẽ không tích hợp vào mô hình của họ. Do đó, các hệ thống có thể cung cấp cho các mô hình này các công cụ, phản hồi và dữ liệu mà họ cần để tạo ra hiệu suất chất lượng cao một cách nhất quán sẽ có giá trị vô cùng lớn.
Từ quan điểm đó, AutoGen là một dự án thú vị đáng xem. Nó vừa có thể sử dụng được ngay lập tức vừa là nguồn mở, cung cấp cái nhìn thoáng qua về cách mọi người đang nghĩ về việc giải quyết một số thách thức kỹ thuật xung quanh các đại lý.
Đây là thời điểm thú vị để xây dựng
[ad_2]
Source link