Skip to main content

使用 AutoGen 进行运行时日志记录

在 Colab 中打开 在 GitHub 上打开

AutoGen 提供了用于调试和性能分析的数据记录工具。本文档演示了如何使用这些工具。

我们可以以不同的模式记录数据:- SQlite 数据库 - 文件

一般情况下,用户可以通过调用 autogen.runtime_logging.start() 来开始记录数据,通过调用 autogen.runtime_logging.stop() 来停止记录数据。

import json

import pandas as pd

import autogen
from autogen import AssistantAgent, UserProxyAgent

# 设置 API 密钥。将您自己的 API 密钥添加到配置文件或环境变量中
llm_config = {
"config_list": autogen.config_list_from_json(
env_or_file="OAI_CONFIG_LIST",
),
"temperature": 0.9,
}

# 开始记录日志
logging_session_id = autogen.runtime_logging.start(config={"dbname": "logs.db"})
print("日志会话 ID:" + str(logging_session_id))

# 创建一个代理工作流并运行它
assistant = AssistantAgent(name="assistant", llm_config=llm_config)
user_proxy = UserProxyAgent(
name="user_proxy",
code_execution_config=False,
human_input_mode="NEVER",
is_termination_msg=lambda msg: "TERMINATE" in msg["content"],
)

user_proxy.initiate_chat(
assistant, message="巴黎铁塔的高度是多少?只回答答案并终止对话"
)
autogen.runtime_logging.stop()
日志会话 ID:6e08f3e0-392b-434e-8b69-4ab36c4fcf99
user_proxy (to assistant):

巴黎铁塔的高度是多少?只回答答案并终止对话

--------------------------------------------------------------------------------
assistant (to user_proxy):

巴黎铁塔的高度约为330米。

TERMINATE

--------------------------------------------------------------------------------

从 SQLite 数据库获取数据

默认情况下,会生成 logs.db 文件,使用的是 SQLite 数据库。您可以使用类似 sqlitebrowser 的 GUI 工具,使用 SQLite 命令行 shell 或使用 Python 脚本查看数据:

def get_log(dbname="logs.db", table="chat_completions"):
import sqlite3

con = sqlite3.connect(dbname)
query = f"SELECT * from {table}"
cursor = con.execute(query)
rows = cursor.fetchall()
column_names = [description[0] for description in cursor.description]
data = [dict(zip(column_names, row)) for row in rows]
con.close()
return data
def str_to_dict(s):
return json.loads(s)


log_data = get_log()
log_data_df = pd.DataFrame(log_data)

log_data_df["total_tokens"] = log_data_df.apply(
lambda row: str_to_dict(row["response"])["usage"]["total_tokens"], axis=1
)

log_data_df["request"] = log_data_df.apply(lambda row: str_to_dict(row["request"])["messages"][0]["content"], axis=1)

log_data_df["response"] = log_data_df.apply(
lambda row: str_to_dict(row["response"])["choices"][0]["message"]["content"], axis=1
)

log_data_df

计算成本

记录数据的一个用例是计算会话的成本。

# 计算所有会话的总令牌数
total_tokens = log_data_df["total_tokens"].sum()

# 计算所有会话的总成本
total_cost = log_data_df["cost"].sum()

# 特定会话的总令牌数
session_tokens = log_data_df[log_data_df["session_id"] == logging_session_id]["total_tokens"].sum()
session_cost = log_data_df[log_data_df["session_id"] == logging_session_id]["cost"].sum()

print("所有会话的总令牌数: " + str(total_tokens) + ", 总成本: " + str(round(total_cost, 4)))
print(
"会话 "
+ str(logging_session_id)
+ " 的总令牌数: "
+ str(session_tokens)
+ ", 成本: "
+ str(round(session_cost, 4))
)
所有会话的总令牌数: 1521, 总成本: 0.0472
会话 6e08f3e0-392b-434e-8b69-4ab36c4fcf99 的总令牌数: 507, 成本: 0.0157

文件模式下的日志数据

默认情况下,日志类型设置为 sqlite,如上所示,但我们为 autogen.runtime_logging.start() 引入了一个新参数。

logger_type = "file" 将开始以文件模式记录数据。

import pandas as pd

import autogen
from autogen import AssistantAgent, UserProxyAgent

# 设置 API 密钥。将您自己的 API 密钥添加到配置文件或环境变量中
llm_config = {
"config_list": autogen.config_list_from_json(
env_or_file="OAI_CONFIG_LIST",
),
"temperature": 0.9,
}

# 使用 logger_type 和要记录到的文件名开始记录日志
logging_session_id = autogen.runtime_logging.start(logger_type="file", config={"filename": "runtime.log"})
print("日志会话 ID: " + str(logging_session_id))

# 创建一个代理工作流并运行它
assistant = AssistantAgent(name="assistant", llm_config=llm_config)
user_proxy = UserProxyAgent(
name="user_proxy",
code_execution_config=False,
human_input_mode="NEVER",
is_termination_msg=lambda msg: "TERMINATE" in msg["content"],
)

user_proxy.initiate_chat(
assistant, message="埃菲尔铁塔的高度是多少?只回答答案并终止"
)
autogen.runtime_logging.stop()
日志会话 ID: ed493ebf-d78e-49f0-b832-69557276d557
user_proxy (to assistant):

埃菲尔铁塔的高度是多少?只回答答案并终止

--------------------------------------------------------------------------------
assistant (to user_proxy):

埃菲尔铁塔的高度是330米。
TERMINATE

--------------------------------------------------------------------------------

这将在当前目录中创建一个 runtime.log 文件。