通义千问智能体初体验
阿里发布 Qwen-Agent 框架,赋能开发者构建复杂 AI 智能体。Qwen-Agent框架不仅是一个开发工具,更是一个全面的智能体构建平台,依托于阿里Qwen的现有语言模型,显著增强了智能体的指令遵循、工具使用、任务规划和对话上下文维护能力。框架内置了多种应用示例,包括浏览器助手、代码解释器和自定义助手,开发者可以直接在这些基础之上进行扩展和创新。
通义千问智能体 Qwen-Agent
阿里发布 Qwen-Agent 框架,赋能开发者构建复杂 AI 智能体。Qwen-Agent框架不仅是一个开发工具,更是一个全面的智能体构建平台,依托于阿里Qwen的现有语言模型,显著增强了智能体的指令遵循、工具使用、任务规划和对话上下文维护能力。框架内置了多种应用示例,包括浏览器助手、代码解释器和自定义助手,开发者可以直接在这些基础之上进行扩展和创新。
url链接:https://github.com/QwenLM/Qwen-Agent/tree/main
智能体代码
使用 Qwen-Agent 库构建一个智能对话系统,并从简单的测试到构建一个图形用户界面(GUI)应用的全过程。Qwen-Agent 是一个基于大型语言模型(LLM)的智能对话系统库。它提供了多种工具和接口,使开发者能够轻松地构建和部署智能对话系统。其核心功能包括对话检索、多轮对话管理以及与外部工具的集成等。
构建对话系统:首先,从一个简单的测试开始。 使用 DialogueRetrievalAgent 类来创建一个对话代理,并对其进行测试。
from qwen_agent.agents import DialogueRetrievalAgent
from qwen_agent.gui import WebUI
def test():
# Define the agent
bot = DialogueRetrievalAgent(llm={'model': 'qwen-max'})
# Chat
long_text = ','.join(['这是干扰内容'] * 1000 + ['小明的爸爸叫大头'] + ['这是干扰内容'] * 1000)
messages = [{'role': 'user', 'content': f'小明爸爸叫什么?\n{long_text}'}]
for response in bot.run(messages):
print('bot response:', response)
def app_tui():
bot = DialogueRetrievalAgent(llm={'model': 'qwen-max'})
# Chat
messages = []
while True:
query = input('user question: ')
messages.append({'role': 'user', 'content': query})
response = []
for response in bot.run(messages=messages):
print('bot response:', response)
messages.extend(response)
llm_cfg = {
# 使用 DashScope 提供的模型服务:
# Qwen2.5-32B-Instruct
'model': 'qwen-max',
# 'model': 'Qwen/Qwen2.5-32B-Instruct',
'model_server': 'dashscope',
'api_key': 'sk-*******************7e0e',
# 如果这里没有设置 'api_key',它将读取 `DASHSCOPE_API_KEY` 环境变量。
# 使用与 OpenAI API 兼容的模型服务,例如 vLLM 或 Ollama:
# 'model': 'Qwen2-7B-Chat',
# 'model_server': 'http://localhost:8000/v1', # base_url,也称为 api_base
# 'api_key': 'EMPTY',
# (可选) LLM 的超参数:
'generate_cfg': {
'top_p': 0.8
}
}
def app_gui():
# Define the agent llm_cfg
# bot = DialogueRetrievalAgent(llm={'model': 'qwen-max'})
bot = DialogueRetrievalAgent(llm=llm_cfg)
WebUI(bot).run()
if __name__ == '__main__':
# test()
# app_tui()
app_gui()
运行结果如下:
Qwen-Agent 提供了强大的功能和灵活的接口,使开发者能够快速地构建和部署智能对话系统。
构建图像生成智能体
利用 Qwen-Agent 库构建一个智能图像生成助手,从自定义工具的开发到与用户的交互实现,帮助用户根据文本描述生成相应的图像。为了实现图像生成功能,首先需要设计一个自定义工具 my_image_gen。该工具的功能是接收用户提供的文本描述(prompt),并将其转换为图像的 URL。
import pprint
import urllib.parse
import json5
from qwen_agent.agents import Assistant
from qwen_agent.tools.base import BaseTool, register_tool
# 步骤 1(可选):添加一个名为 `my_image_gen` 的自定义工具。
@register_tool('my_image_gen')
class MyImageGen(BaseTool):
# `description` 用于告诉智能体该工具的功能。
description = 'AI 绘画(图像生成)服务,输入文本描述,返回基于文本信息绘制的图像 URL。'
# `parameters` 告诉智能体该工具有哪些输入参数。
parameters = [{
'name': 'prompt',
'type': 'string',
'description': '期望的图像内容的详细描述',
'required': True
}]
def call(self, params: str, **kwargs) -> str:
# `params` 是由 LLM 智能体生成的参数。
prompt = json5.loads(params)['prompt']
prompt = urllib.parse.quote(prompt)
print(prompt)
return json5.dumps(
{'image_url': f'https://image.pollinations.ai/prompt/{prompt}'},
ensure_ascii=False)
# 步骤 2:配置您所使用的 LLM。
llm_cfg = {
# 使用 DashScope 提供的模型服务:
# Qwen2.5-32B-Instruct
# 'model': 'qwen-max',
'model': 'Qwen/Qwen2.5-32B-Instruct',
'model_server': 'dashscope',
'api_key': 'sk-89××××××××××××××××××××××××b52a7817e0e',
# 如果这里没有设置 'api_key',它将读取 `DASHSCOPE_API_KEY` 环境变量。
# 使用与 OpenAI API 兼容的模型服务,例如 vLLM 或 Ollama:
# 'model': 'Qwen2-7B-Chat',
# 'model_server': 'http://localhost:8000/v1', # base_url,也称为 api_base
# 'api_key': 'EMPTY',
# (可选) LLM 的超参数:
'generate_cfg': {
'top_p': 0.8
}
}
# 步骤 3:创建一个智能体。这里我们以 `Assistant` 智能体为例,它能够使用工具并读取文件。
system_instruction = '''你是一个乐于助人的AI助手。
在收到用户的请求后,你应该:
- 首先绘制一幅图像,得到图像的url,
- 然后运行代码`request.get`以下载该图像的url,
- 最后从给定的文档中选择一个图像操作进行图像处理。
用 `plt.show()` 展示图像。
你总是用中文回复用户。'''
tools = ['my_image_gen', 'code_interpreter'] # `code_interpreter` 是框架自带的工具,用于执行代码。
files = [r'doc.pdf'] # 给智能体一个 PDF 文件阅读。
bot = Assistant(llm=llm_cfg,
system_message=system_instruction,
function_list=tools,
files=files)
# 步骤 4:作为聊天机器人运行智能体。
messages = [] # 这里储存聊天历史。
while True:
# 例如,输入请求 "绘制一只狗并将其旋转 90 度"。
# 上海旅游景点
# 绘制一只狗
query = input('用户请求: ')
# 将用户请求添加到聊天历史。
messages.append({'role': 'user', 'content': query})
response = []
for response in bot.run(messages=messages):
# 流式输出。
print('机器人回应:')
pprint.pprint(response, indent=2)
# 将机器人的回应添加到聊天历史。
messages.extend(response)
# from qwen_agent.gui import WebUI
# WebUI(bot).run() # bot is the agent defined in the above code, we do not repeat the definition here for saving space.
运行结果如下:
...
{ 'content': '',
'function_call': { 'arguments': '{"code": "import requests\\nfrom PIL '
'import Image\\nfrom io import '
'BytesIO\\n\\n# 下载图像\\nimage_url = '
"'https://image.pollinations.ai/prompt/%E4%B8%80%E5%8F%AA%E7%8B%97'\\nresponse "
'= requests.get(image_url)\\nif '
'response.status_code == 200:\\n '
'image_data = '
'BytesIO(response.content)\\n image = '
'Image.open(image_data)\\n \\n # '
'旋转图像\\n rotated_image = '
'image.rotate(90, expand=True)\\n '
'\\n # 显示旋转后的图像\\n '
'rotated_image.show()\\nelse:\\n '
"print(f'Error: Failed to download image "
"from {image_url}')}",
'name': 'code_interpreter'},
'role': 'assistant'},
{ 'content': 'error:\n'
'\n'
'```\n'
' Cell In[22], line 2\n'
' {"code": "import requests\\nfrom PIL import Image\\nfrom '
'io import BytesIO\\n\\n# 下载图像\\nimage_url = '
"'https://image.pollinations.ai/prompt/%E4%B8%80%E5%8F%AA%E7%8B%97'\\nresponse "
'= requests.get(image_url)\\nif response.status_code == '
'200:\\n image_data = BytesIO(response.content)\\n image '
'= Image.open(image_data)\\n \\n # 旋转图像\\n '
'rotated_image = image.rotate(90, expand=True)\\n \\n # '
'显示旋转后的图像\\n rotated_image.show()\\nelse:\\n '
"print(f'Error: Failed to download image from {image_url}')}\n"
' ^\n'
'SyntaxError: unterminated string literal (detected at line 2)\n'
'\n'
'```',
'name': 'code_interpreter',
'role': 'function'},
{ 'content': '看来在尝试运行代码时遇到了持续的技术问题。让我直接使用正确的格式执行这段代码,以确保我们能够成功下载图像并将其旋转90度。\n'
'\n'
'现在我将再次尝试运行这段Python代码。',
'role': 'assistant'},
{ 'content': '',
'function_call': { 'arguments': '{"code": "import requests\\nfrom PIL '
'import Image\\nfrom io import '
'BytesIO\\n\\n# 下载图像\\nimage_url = '
"'https://image.pollinations.ai/prompt/%E4%B8%80%E5%8F%AA%E7%8B%97'\\nresponse "
'= requests.get(image_url)\\nif '
'response.status_code == 200:\\n '
'image_data = '
'BytesIO(response.content)\\n image = '
'Image.open(image_data)\\n \\n # '
'旋转图像\\n rotated_image = '
'image.rotate(90, expand=True)\\n '
'\\n # 显示旋转后的图像\\n '
'display(rotated_image)\\nelse:\\n '
"print(f'Error: Failed to download image "
"from {image_url}')}",
'name': 'code_interpreter'},
'role': 'assistant'},
{ 'content': 'error:\n'
'\n'
'```\n'
' Cell In[24], line 2\n'
' {"code": "import requests\\nfrom PIL import Image\\nfrom '
'io import BytesIO\\n\\n# 下载图像\\nimage_url = '
"'https://image.pollinations.ai/prompt/%E4%B8%80%E5%8F%AA%E7%8B%97'\\nresponse "
'= requests.get(image_url)\\nif response.status_code == '
'200:\\n image_data = BytesIO(response.content)\\n image '
'= Image.open(image_data)\\n \\n # 旋转图像\\n '
'rotated_image = image.rotate(90, expand=True)\\n \\n # '
'显示旋转后的图像\\n display(rotated_image)\\nelse:\\n '
"print(f'Error: Failed to download image from {image_url}')}\n"
' ^\n'
'SyntaxError: unterminated string literal (detected at line 2)\n'
'\n'
'```',
'name': 'code_interpreter',
'role': 'function'},
{ 'content': '看来在尝试执行代码时,我们遇到了一个持续的技术问题。为了确保能够成功下载并显示旋转后的图像,我将直接运行正确的Python代码而不
再将其作为字符串传递。\n'
'\n'
'现在我将再次尝试执行这段代码。',
'role': 'assistant'},
{ 'content': '',
'function_call': { 'arguments': '{"code": "import requests\\nfrom PIL '
'import Image\\nfrom io import '
'BytesIO\\n\\n# 下载图像\\nimage_url = '
"'https://image.pollinations.ai/prompt/%E4%B8%80%E5%8F%AA%E7%8B%97'\\nresponse "
'= requests.get(image_url)\\nif '
'response.status_code == 200:\\n '
'image_data = '
'BytesIO(response.content)\\n image = '
'Image.open(image_data)\\n \\n # '
'旋转图像\\n rotated_image = '
'image.rotate(90, expand=True)\\n '
'\\n # 显示旋转后的图像\\n '
'display(rotated_image)\\nelse:\\n '
"print(f'Error: Failed to download image "
"from {image_url}')}",
'name': 'code_interpreter'},
'role': 'assistant'},
{ 'content': 'error:\n'
'\n'
'```\n'
' Cell In[26], line 2\n'
' {"code": "import requests\\nfrom PIL import Image\\nfrom '
'io import BytesIO\\n\\n# 下载图像\\nimage_url = '
"'https://image.pollinations.ai/prompt/%E4%B8%80%E5%8F%AA%E7%8B%97'\\nresponse "
'= requests.get(image_url)\\nif response.status_code == '
'200:\\n image_data = BytesIO(response.content)\\n image '
'= Image.open(image_data)\\n \\n # 旋转图像\\n '
'rotated_image = image.rotate(90, expand=True)\\n \\n # '
'显示旋转后的图像\\n display(rotated_image)\\nelse:\\n '
"print(f'Error: Failed to download image from {image_url}')}\n"
' ^\n'
'SyntaxError: unterminated string literal (detected at line 2)\n'
'\n'
'```',
'name': 'code_interpreter',
'role': 'function'},
{ 'content': '看来在尝试执行代码时遇到了持续的格式问题。为了确保能够成功运行,我将直接使用正确的Python语法来下载并显示旋转90度后的图像。\n'
'\n'
'现在,我将直接运行这段代码。',
'role': 'assistant'},
{ 'content': '',
'function_call': { 'arguments': '{"code": "import requests\\nfrom PIL '
'import Image\\nfrom io import '
'BytesIO\\n\\n# 下载图像\\nimage_url = '
"'https://image.pollinations.ai/prompt/%E4%B8%80%E5%8F%AA%E7%8B%97'\\nresponse "
'= requests.get(image_url)\\nif '
'response.status_code == 200:\\n '
'image_data = '
'BytesIO(response.content)\\n image = '
'Image.open(image_data)\\n \\n # '
'旋转图像\\n rotated_image = '
'image.rotate(90, expand=True)\\n '
'\\n # 显示旋转后的图像\\n '
'rotated_image.show()\\nelse:\\n '
"print(f'Error: Failed to download image "
"from {image_url}')}",
'name': 'code_interpreter'},
'role': 'assistant'},
{ 'content': 'error:\n'
'\n'
'```\n'
' Cell In[28], line 2\n'
' {"code": "import requests\\nfrom PIL import Image\\nfrom '
'io import BytesIO\\n\\n# 下载图像\\nimage_url = '
"'https://image.pollinations.ai/prompt/%E4%B8%80%E5%8F%AA%E7%8B%97'\\nresponse "
'= requests.get(image_url)\\nif response.status_code == '
'200:\\n image_data = BytesIO(response.content)\\n image '
'= Image.open(image_data)\\n \\n # 旋转图像\\n '
'rotated_image = image.rotate(90, expand=True)\\n \\n # '
'显示旋转后的图像\\n rotated_image.show()\\nelse:\\n '
"print(f'Error: Failed to download image from {image_url}')}\n"
' ^\n'
'SyntaxError: unterminated string literal (detected at line 2)\n'
'\n'
'```',
'name': 'code_interpreter',
'role': 'function'}]
更多推荐




所有评论(0)