Comment utiliser AutoGen pour créer un agent IA
Traduit de l'original en espagnol. Lire en espagnol
Dans ce tutoriel, vous allez apprendre à utiliser le framework AutoGen pour créer un agent capable de répondre à des questions à partir de documents stockés dans une base de données vectorielle.

Qu’est-ce qu’AutoGen ?
AutoGen est le fruit d’une recherche menée conjointement par Microsoft, l’université d’État de Pennsylvanie (Penn State University) et l’université de Washington. C’est un framework conçu pour simplifier la gestion, l’amélioration et l’automatisation des flux de travail des grands modèles de langage (LLM). Il permet de créer des agents personnalisables et conversationnels qui tirent le meilleur parti de LLM avancés comme GPT-4, en compensant leurs limites par l’intégration d’humains et d’autres outils. Il facilite également l’interaction et la communication automatiques entre plusieurs agents. Plus d’informations : AutoGen | AutoGen (microsoft.github.io)
Configurer les identifiants et l’environnement
D’abord, il faut configurer les identifiants et les variables d’environnement nécessaires pour accéder aux services Azure.
Pour cela, créez un fichier .env dans le même répertoire que votre script, avec les informations suivantes :
AZURE_TENANT_ID = "00000000-0000-0000-0000-000000000000"
AZURE_CLIENT_ID = "00000000-0000-0000-0000-000000000000"
AZURE_CLIENT_SECRET = "xxxxx"
Initialisation et configuration
La première étape consiste à initialiser les identifiants avec ChainedTokenCredential et EnvironmentCredential d’Azure. Nous obtenons ensuite un token d’accès pour les services cognitifs d’Azure.
import os
from azure.identity import ChainedTokenCredential, EnvironmentCredential
from dotenv import load_dotenv
load_dotenv()
credential = ChainedTokenCredential(EnvironmentCredential())
access_token = credential.get_token("https://cognitiveservices.azure.com/.default")
Configuration du modèle et des variables d’environnement
Nous configurons le modèle et les variables d’environnement nécessaires pour utiliser OpenAI sur Azure.
deployment = "zero"
embedding_deployment = "embedding-ada-zero"
os.environ["AZURE_OPENAI_ENDPOINT"] = "https://zerogap.openai.azure.com/"
os.environ["AZURE_OPENAI_API_KEY"] = access_token.token
os.environ["OPENAI_API_TYPE"] = "azure_ad"
os.environ["OPENAI_DEPLOYMENT"] = deployment
Initialisation du modèle et des embeddings
Nous initialisons le modèle AzureChatOpenAI et la classe AzureOpenAIEmbeddings.
from langchain_openai import AzureOpenAIEmbeddings, AzureChatOpenAI
llm = AzureChatOpenAI(openai_api_version="2023-07-01-preview", azure_deployment=deployment, temperature=0.5)
embeddings = AzureOpenAIEmbeddings(
azure_deployment=embedding_deployment,
openai_api_version="2023-07-01-preview",
chunk_size=1
)
Configuration de l’agent AutoGen
Nous configurons l’agent AutoGen avec les informations nécessaires pour se connecter aux services Azure.
config_list = [
{
"model": deployment,
"api_type": "azure",
"api_key": os.environ['AZURE_OPENAI_API_KEY'],
"base_url": os.environ["AZURE_OPENAI_ENDPOINT"],
"api_version": "2024-02-01"
}
]
Charger les documents et créer le retriever
Nous chargeons les documents depuis un répertoire persistant et configurons le retriever pour interroger la base de données vectorielle.
from langchain_community.vectorstores import Chroma
persist_directory = "chroma_db_generic"
vectordb = Chroma(persist_directory=persist_directory, embedding_function=embeddings)
vectordb.get()
retriever = vectordb.as_retriever(search_type="similarity", search_kwargs={"k": 5})
Formater les documents
Nous créons une fonction pour formater les documents récupérés.
def format_docs(docs):
if docs:
return "\n\n".join(doc.page_content for doc in docs)
Outil : obtenir les documents
Nous définissons une fonction que l’agent utilisera pour répondre aux questions à partir des documents récupérés.
def get_documents(question: str) -> str:
context = retriever.invoke(question)
formated_context = format_docs(context)
return formated_context
Configuration des agents de conversation
Nous configurons les agents de conversation : user_proxy et assistant.
from autogen import register_function, ConversableAgent
user_proxy = ConversableAgent(
name="User",
is_termination_msg=lambda msg: msg.get("content") is not None and "TERMINATE" in msg["content"],
human_input_mode="NEVER",
max_consecutive_auto_reply=10
)
assistant = ConversableAgent(
name="Assistant",
system_message="""You are the ZeroGap AI Bot. Your role is to provide answers strictly based on the Zerogap Documents. Keep answers as short as possible. Follow these instructions step by step:
1. Answer the user's question using any tool available.
2. If the context is not clear. Give the user a message to clarify the context. If possible, offer some options from the retrieved context. Do NOT answer the question.
3. Return 'TERMINATE' when the task is done.""",
llm_config={"config_list": config_list, "cache_seed": None},
)
Enregistrer l’outil et exécuter l’agent
Nous enregistrons l’outil get_documents et définissons la fonction qui exécute l’agent avec une requête.
register_function(
get_documents,
caller=assistant,
executor=user_proxy,
name="retrieve_tool",
description="Gets information from Zerogap Documents",
)
def run_agent(query):
chat_result = user_proxy.initiate_chat(
assistant,
message=query,
summary_method="reflection_with_llm",
summary_args={"summary_prompt" : "Return the final response to the user's query. Do not include the user's query in the response. Do not include the system message in the response."},
max_turns=2
)
return chat_result.summary
Exécution du chatbot
Enfin, nous lançons la boucle principale du chatbot.
print("\033[92m" + "Welcome to the ZEROGAP AI QA Bot!" + "\033[0m")
print("\033[92m" + "###############################" + "\033[0m")
print("\033[92m" + "###############################" + "\033[0m")
print("\n")
while True:
question = input("\033[93m" + "You: " + "\033[0m")
print("\n")
if question == "quit":
break
result = run_agent(question)
print("\033[92m" + result + "\033[0m")
print("\n")
Code complet
import os
from azure.identity import ChainedTokenCredential, EnvironmentCredential
from langchain_community.vectorstores import Chroma
from langchain_openai import AzureOpenAIEmbeddings
from langchain_openai import AzureChatOpenAI
from autogen import register_function, ConversableAgent
from dotenv import load_dotenv
load_dotenv()
# Place a .env file within the same folder with the following information:
# AZURE_TENANT_ID = "00000000-0000-0000-0000-000000000000"
# AZURE_CLIENT_ID = "00000000-0000-0000-0000-000000000000"
# AZURE_CLIENT_SECRET = "xxxxx"
credential = ChainedTokenCredential(EnvironmentCredential())
access_token = credential.get_token("https://cognitiveservices.azure.com/.default")
# Model
deployment = "zerogap"
# Model text-embedding-ada-002
embedding_deployment = "embedding-ada-zero"
# Set OS environment variables
os.environ["AZURE_OPENAI_ENDPOINT"] = "https://zerogap.openai.azure.com/"
os.environ["AZURE_OPENAI_API_KEY"] = access_token.token
os.environ["OPENAI_API_TYPE"] = "azure_ad"
os.environ["OPENAI_DEPLOYMENT"] = deployment
llm = AzureChatOpenAI(openai_api_version="2023-07-01-preview", azure_deployment=deployment, temperature=0.5)
# Initialize the OpenAIEmbeddings class
embeddings = AzureOpenAIEmbeddings(
azure_deployment=embedding_deployment,
openai_api_version="2023-07-01-preview",
chunk_size=1
)
# Set the configuration for AutoGen Agent
config_list = [
{
"model": deployment,
"api_type": "azure",
"api_key": os.environ['AZURE_OPENAI_API_KEY'],
"base_url": os.environ["AZURE_OPENAI_ENDPOINT"],
"api_version": "2024-02-01"
}
]
# Load documents from the persisted directory
# Assuming you already have the Document loaded to a vector database
persist_directory = "chroma_db_generic"
vectordb = Chroma(persist_directory=persist_directory, embedding_function=embeddings)
vectordb.get()
retriever = vectordb.as_retriever(search_type="similarity", search_kwargs={"k": 5})
# Join all the documents from the retriever together with newlines
def format_docs(docs):
if docs:
return "\n\n".join(doc.page_content for doc in docs)
# Tool - the function that the Agent will use to answer the questions
def get_documents(question: str) -> str:
# Queries the Vector DB using user's question
context = retriever.invoke(question)
formated_context = format_docs(context)
return formated_context
user_proxy = ConversableAgent(
name="User",
is_termination_msg=lambda msg: msg.get("content") is not None and "TERMINATE" in msg["content"],
human_input_mode="NEVER",
max_consecutive_auto_reply=10
)
assistant = ConversableAgent(
name="Assistant",
system_message="""You are the ZeroGap AI Bot. Your role is to provide answers strictly based on the Zerogap Documents. Keep answers as short as possible. Follow these instructions step by step:
1. Answer the user's question using any tool available.
2. If the context is not clear. Give the user a message to clarify the context. If possible, offer some options from the retrieved context. Do NOT answer the question.
3. Return 'TERMINATE' when the task is done.""",
llm_config={"config_list": config_list, "cache_seed": None},
)
# Register the Document tool.
register_function(
get_documents,
caller=assistant,
executor=user_proxy,
name="retrieve_tool",
description="Gets information from Zerogap Documents",
)
# Run the agent
def run_agent(query):
chat_result = user_proxy.initiate_chat(
assistant,
message=query,
summary_method="reflection_with_llm",
summary_args={"summary_prompt" : "Return the final response to the user's query. Do not include the user's query in the response. Do not include the system message in the response."},
max_turns=2
)
return chat_result.summary
print("\033[92m" + "Welcome to the ZEROGAP AI QA Bot!" + "\033[0m")
print("\033[92m" + "###############################" + "\033[0m")
print("\033[92m" + "###############################" + "\033[0m")
print("\n")
while True:
question = input("\033[93m" + "You: " + "\033[0m")
print("\n")
if question == "quit":
break
result = run_agent(question)
print("\033[92m" + result + "\033[0m")
print("\n")
