Skip to main content

Together AI

这个基于云的代理服务器示例使用 together.ai,是一个Python开发者和代码审查者之间的群聊,他们被给予了一个编码任务。

首先,安装 AutoGen 并获取你的 together.ai API 密钥

将你的 together.ai API 密钥放入环境变量 TOGETHER_API_KEY 中。

Linux / Mac OSX:

export TOGETHER_API_KEY=YourTogetherAIKeyHere

Windows (命令提示符):

set TOGETHER_API_KEY=YourTogetherAIKeyHere

创建你的 LLM 配置,选择你想要的 模型

import os

config_list = [
{
# 可用的 together.ai 模型字符串:
# https://docs.together.ai/docs/inference-models
"model": "mistralai/Mistral-7B-Instruct-v0.1",
"api_key": os.environ['TOGETHER_API_KEY'],
"base_url": "https://api.together.xyz/v1"
}
]

构建代理

from pathlib import Path
from autogen import AssistantAgent, UserProxyAgent
from autogen.coding import LocalCommandLineCodeExecutor

work_dir = Path("groupchat")
work_dir.mkdir(exist_ok=True)

# 创建本地命令行代码执行器。
code_executor = LocalCommandLineCodeExecutor(work_dir=work_dir)

# 用户代理将执行代码并在输入 'exit' 后结束聊天
user_proxy = UserProxyAgent(
name="UserProxy",
system_message="一个人类管理员",
code_execution_config={
"last_n_messages": 2,
"executor": code_executor,
},
human_input_mode="TERMINATE",
is_termination_msg=lambda x: "TERMINATE" in x.get("content"),
)

# Python 编码者代理
coder = AssistantAgent(
name="softwareCoder",
description="软件编码者,根据要求编写 Python 代码,并根据代码审查者的反馈进行修改。",
system_message="你是一位高级 Python 开发者,擅长编写简洁的 Python 函数。",
llm_config={"config_list": config_list},
)

# 代码审查者代理
reviewer = AssistantAgent(
name="codeReviewer",
description="代码审查者,检查编写的代码是否正确、高效和安全。要求软件编码者解决问题。",
system_message="你是一位代码审查者,有经验的检查代码是否正确、高效和安全。对软件编码者提供反馈,直到满意为止,然后返回单词 TERMINATE",
is_termination_msg=lambda x: "TERMINATE" in x.get("content"),
llm_config={"config_list": config_list},
)

建立群聊

from autogen import GroupChat, GroupChatManager

# 创建群聊,并禁止连续选择同一个发言人
groupchat = GroupChat(agents=[user_proxy, coder, reviewer], messages=[], max_round=12, allow_repeat_speaker=False)

# 管理多个代理的群聊
manager = GroupChatManager(groupchat=groupchat, llm_config={"config_list": config_list})

开始聊天

from autogen.cache import Cache

# 缓存 LLM 的响应。
with Cache.disk() as cache:
# 通过请求编写一个函数来开始聊天
user_proxy.initiate_chat(
manager,
message="编写一个 Python 函数来计算斐波那契数列,该函数将有一个参数表示数列中的数字,函数将返回该数字对应的斐波那契数。",
cache=cache,
)
# 输入 exit 以结束聊天

输出:

UserProxy (to chat_manager):

编写一个 Python 函数来计算斐波那契数列,该函数将有一个参数表示数列中的数字,函数将返回该数字对应的斐波那契数。

--------------------------------------------------------------------------------
softwareCoder (to chat_manager):

当然,这里有一个简单的 Python 函数,使用递归来计算斐波那契数:

```python
def fibonacci(n):
if n <= 0:
return "输入应为正整数。"
elif n == 1:
return 0
elif n == 2:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
```

这个函数接受一个整数 `n` 作为输入,并返回斐波那契数列中的第 `n` 个数字。斐波那契数列是一个数列,每个数字都是前两个数字的和,通常以 0 和 1 开始。

请注意,这个实现使用了递归,在处理较大的 `n` 值时可能效率不高。在这种情况下,更适合使用迭代方法或记忆化。

--------------------------------------------------------------------------------
codeReviewer (to chat_manager):

我看到当前的 `fibonacci` 函数有几个问题:

1. 函数没有正确处理负数输入。目前,对于小于等于 0 的任何输入,函数返回一个字符串消息。最好是引发一个 `ValueError` 异常或返回一个更详细的消息。
2. 函数使用递归来计算斐波那契数,对于较大的输入来说可能效率不高。更高效的方法是使用迭代方法或记忆化。

这里有一个更新后的实现,解决了这些问题:

```python
def fibonacci(n):
if n <= 0:
raise ValueError("输入应为正整数。")
elif n == 1:
return 0
elif n == 2:
return 1
else:
a, b = 0, 1
for _ in range(n - 2):
a, b = b, a + b
return b
这个实现使用循环来迭代计算斐波那契数列,相比递归方法更高效。它还会对负数输入引发`ValueError`异常,这是一种更合适的处理无效输入的方式。

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

>>>>>>>> 使用自动回复...

>>>>>>>> 执行代码块 0 (推测语言为 python)...
UserProxy (to chat_manager):

退出码: 0 (执行成功)
代码输出:


--------------------------------------------------------------------------------
codeReviewer (to chat_manager):

很高兴更新后的实现解决了原始代码的问题。如果您有任何进一步的问题,或者需要我帮助您处理其他事情,请随时告诉我。

要结束对话,请输入"TERMINATE"。

--------------------------------------------------------------------------------
请给 chat_manager 提供反馈。按回车键或输入'exit'停止对话: exit
# 标题一

这是一段关于某个主题的科普文章。文章内容包括了一些专业术语和论文引用。

## 小节一

在这个小节中,我们将讨论一些关于某个主题的基本概念。这些概念包括 A、B 和 C [1]。我们将详细解释每个概念,并提供一些实际例子来帮助读者更好地理解。

## 小节二

在这个小节中,我们将介绍一些关于某个主题的最新研究进展。这些研究包括了使用 D 方法来解决问题的案例研究 [2]。我们将解释这些研究的方法和结果,并讨论其对该领域的影响。

## 小节三

在这个小节中,我们将探讨一些与某个主题相关的实际应用。这些应用包括 E、F 和 G [3]。我们将介绍这些应用的原理和功能,并讨论它们在实际中的应用场景。

## 结论

通过本文,我们希望读者能够对某个主题有一个更全面的了解。我们介绍了该主题的基本概念、最新研究进展和实际应用。我们希望这些信息能够帮助读者更好地理解该主题,并在实际中应用相关知识。

参考文献:

[1] 作者1, 作者2. "论文标题." 期刊名称, vol. 1, no. 1, 2020, pp. 1-10.

[2] 作者3, 作者4. "论文标题." 会议名称, 2021, pp. 100-110.

[3] 作者5, 作者6. "论文标题." 书名, 出版社, 2019.