最近在学习Agent的一些知识,了解到了modelscop-Agent的开源框架。感觉还是蛮有意思,就基于此做了一个有趣的小助手。只要用户输入城市名称,该小助手便可以生成一篇该城市的小红书风格的图文介绍。
希望写下博客记录一下自己的学习历程,本人刚开始写博客,有很多疏漏,希望大家多多包容。后面会继续更新关于Agent的一些有趣小项目,希望对该方向比较感兴趣的同学,可以关注一波。
目录
前言
Modelscope-Agent是一个可定制的、可扩展的Agent代码框架。单Agent具有角色扮演、LLM调用、工具使用、规划、记忆等能力。 主要具有以下特点:
主要功能
用户只需输入想要了解的城市名称,该小助手即可生成小红书类似的图文介绍。当输入“北京”时,其效果如下:
主要代码
环境配置:
import os
import gradio as gr
from modelscope_agent.agents.role_play import RolePlay
ZHIPU_API_KEY = os.environ.get('ZHIPU_API_KEY')
DASHSCOPE_API_KEY = os.environ.get('DASHSCOPE_API_KEY')
首先需要去下载modelscope-Agent框架的代码,其链接为:https://github.com/modelscope/modelscope-agent
配置好环境,python的版本需要3.9以上,按照要求安装需要的库。去相应的平台上获取需要的API-KEY,我这里用的是智谱的API,新人用户会有2千万token的免费额度,当然阿里云的通义系列模型也可以,不过我由于之前已经用过,现在送的额度过期了。
环境变量的配置的方法
为了安全,建议将密钥添加到环境变量中,
Linux系统
可以通过以下命令:
# 用您的 DashScope API-KEY 代替 YOUR_DASHSCOPE_API_KEY
export DASHSCOPE_API_KEY="YOUR_DASHSCOPE_API_KEY"
该命令是对当前用户添加永久性环境变量,使得在该用户的新会话中也可以使用该环境变量。
或直接运行以下命令将上述命令语句添加到~/.bashrc中:
# 用您的 DashScope API-KEY 代替 YOUR_DASHSCOPE_API_KEY
echo "export DASHSCOPE_API_KEY='YOUR_DASHSCOPE_API_KEY'" >> ~/.bashrc
添加完成后,您可以运行以下命令使得环境变量生效:
source ~/.bashrc
您可以新建立一个会话,运行以下命令检查环境变量是否生效:
echo $DASHSCOPE_API_KEY
windows系统
可以使用CMD中的命令行添加DashScope的API-KEY为环境变量,当在CMD中为当前用户添加永久性环境变量时,可以运行以下命令:
# 用您的 DashScope API-KEY 代替 YOUR_DASHSCOPE_API_KEY
setx DASHSCOPE_API_KEY "YOUR_DASHSCOPE_API_KEY"
然后新建立一个会话,运行以下命令检查环境变量是否生效:
echo %DASHSCOPE_API_KEY%
Agent的配置
Agent初始化
#Agent的描述
role_template_city = '你是城市介绍小助手,可以根据提供的城市名称介绍任何城市,包括城市历史、城市文化、城市交通、城市生活、城市环境等方面。记住你仅仅只需要输出文字内容。'
role_template_picture = '你是城市图片生成小助手,可以调用图片生成工具,根据提供的城市描述生成2张图片,图片尺寸为 512*512。记住你仅仅只需要输出图片链接。'
role_template_redbook = '你是图文排版小助手,可以根据提供的城市描述和2张该城市图片,排版成图文格式,类似小红书风格的形式。'
# LLM配置
llm_config = {'model': 'GLM-4-0520', 'model_server': 'zhipu'}
# 工具列表
function_list = ['image_gen']
# 初始化Agent
city= RolePlay(llm=llm_config, instruction=role_template_city)
picture = RolePlay(llm=llm_config, instruction=role_template_picture , function_list=function_list)
redbook = RolePlay(llm=llm_config, instruction=role_template_redbook)
我一共设置了三个大模型,其实不需要设置这么多,我将任务进行了分解,可以更好的完成总任务。
回复逻辑
def chat(city1, history):
history = history or []
city_prompt = f'城市 {city1}'
city_response_stream = city.run(city_prompt)
city_response = ''
for chunk in city_response_stream:
city_response += chunk
picture_prompt = f'{city1}城市描述为:{city_response}'
picture_response_stream = picture.run(picture_prompt)
picture_response = ''
for chunk in picture_response_stream:
picture_response += chunk
message = f'{city1}城市描述为:{city_response},城市图片为:{picture_response}'
response_generator = redbook.run(message)
history.append((message, ""))
for chunk in response_generator:
history[-1] = (message, history[-1][1] + chunk)
yield history
return
界面设计
为了更好的与设计的Agent交互,设计一个简单的交互界面是比较主要的,可以使用gradio库,可以快速构建出一个交互界面。
代码为:
with gr.Blocks() as demo:
gr.Markdown("# <center>基于小红书风格的城市介绍</center>")
gr.Markdown("请输入城市,我将为你提供关于该城市的小红书风格介绍。")
chatbot = gr.Chatbot(height=350)
msg = gr.Textbox(label="输入您的问题")
with gr.Row():
submit = gr.Button("提交")
clear_button = gr.Button("清除对话")
msg.submit(chat, [msg, chatbot], [chatbot])
submit.click(chat, [msg, chatbot], [chatbot])
clear_button.click(clear_chat, outputs=[chatbot, msg])
def clear_chat():
return None, ""
其结果为:
结果
当输入文本为“北京”时,小助手输出的结果为如下:
以下是北京城市的图文排版,类似小红书风格的格式:
🌃 北京城市风光 —— 首都的魅力之旅
📜 城市历史与文化
北京,这座拥有3000多年历史的古都,见证了中国的历史变迁。故宫、天坛、颐和园等地标性建筑,无不透露出深厚的历史文化底蕴。同时,作为文化中心,北京融合了传统与现代,798艺术区、国家大剧院等现代文化场所,让艺术在这里绽放。🚗 城市交通
北京的交通网络四通八达,地铁、公交、道路系统完善。未来,城市副中心站综合交通枢纽的建设,将进一步提升交通的便捷性。🏠 城市生活
在这里,国际化大都市的繁华与便利触手可及。尽管面临交通拥堵等挑战,但北京正通过智能交通系统等措施,让城市生活更加宜居。🌳 城市环境
环境治理让北京的空气质量得到显著改善,绿化面积的增加,为居民提供了更好的生活环境。以下是一些北京的城市风光:
📸 留下你的足迹
北京的每一条街道,每一个角落,都有故事等你来发现。不妨亲自走一走,感受这座城市的魅力。
这样的排版风格,既展示了北京的城市特色,也融入了温馨的旅游提示,非常适合在小红书等社交平台上分享。
总结
modelscope-agent比较易上手,功能也比较全面,对于刚了解agent的人来说,可以快速学习搭建自己的agent,后面会继续更新关于agent的一些有趣的小项目。
附录——完整代码
import os
import gradio as gr
from modelscope_agent.agents.role_play import RolePlay
ZHIPU_API_KEY = os.environ.get('ZHIPU_API_KEY')
DASHSCOPE_API_KEY = os.environ.get('DASHSCOPE_API_KEY')
#Agent的描述
role_template_city = '你是城市介绍小助手,可以根据提供的城市名称介绍任何城市,包括城市历史、城市文化、城市交通、城市生活、城市环境等方面。记住你仅仅只需要输出文字内容。'
role_template_picture = '你是城市图片生成小助手,可以调用图片生成工具,根据提供的城市描述生成2张图片,图片尺寸为 512*512。记住你仅仅只需要输出图片链接。'
role_template_redbook = '你是图文排版小助手,可以根据提供的城市描述和2张该城市图片,排版成图文格式,类似小红书风格的形式。'
# LLM配置
llm_config = {'model': 'GLM-4-0520', 'model_server': 'zhipu'}
# 工具列表
function_list = ['image_gen']
# 初始化Agent
city= RolePlay(llm=llm_config, instruction=role_template_city)
picture = RolePlay(llm=llm_config, instruction=role_template_picture , function_list=function_list)
redbook = RolePlay(llm=llm_config, instruction=role_template_redbook)
def chat(city1, history):
history = history or []
city_prompt = f'城市 {city1}'
city_response_stream = city.run(city_prompt)
city_response = ''
for chunk in city_response_stream:
city_response += chunk
picture_prompt = f'{city1}城市描述为:{city_response}'
picture_response_stream = picture.run(picture_prompt)
picture_response = ''
for chunk in picture_response_stream:
picture_response += chunk
message = f'{city1}城市描述为:{city_response},城市图片为:{picture_response}'
response_generator = redbook.run(message)
history.append((message, ""))
for chunk in response_generator:
history[-1] = (message, history[-1][1] + chunk)
yield history
return
def clear_chat():
return None, ""
with gr.Blocks() as demo:
gr.Markdown("# <center>基于小红书风格的城市介绍</center>")
gr.Markdown("请输入城市,我将为你提供关于该城市的小红书风格介绍。")
chatbot = gr.Chatbot(height=350)
msg = gr.Textbox(label="输入您的问题")
with gr.Row():
submit = gr.Button("提交")
clear_button = gr.Button("清除对话")
msg.submit(chat, [msg, chatbot], [chatbot])
submit.click(chat, [msg, chatbot], [chatbot])
clear_button.click(clear_chat, outputs=[chatbot, msg])
demo.queue()
demo.launch()