使用Streamlit创建AutoGen用户界面

news2024/12/23 23:53:07

AutoGen作为一个最大化LLM(如GPT-4)能力的框架而脱颖而出。由微软研究院开发的AutoGen通过提供一种自动化、优化和编排工作流的方法,简化了复杂的、基于多代理llm的应用程序的创建。我们在以前的文章中也有过介绍,你可以与许多GPT交谈,并且GPT和GPT之间也可以互相交谈。每个GPT都是它自己的“代理”,并在总体业务流程中扮演特殊角色。但是AutoGen是用命令行模式进行交互的,这对我们的输入来说非常不方便,所以这次我们来对其进行改造,使用Streamlit创建一个web界面,这样可以让我们更好的与其交互。

这个项目略微粗糙,但它应该为为AutoGen代理创建简单的ui提供了一个很好的起点。

这里需要注意的是:

明确要求不要运行代码或将文件存储在本地,因为这是Streamlit限制—而不是AutoGen限制。

简单介绍AutoGen

我们之前已经介绍过AutoGen,所以这里再做个简单的回顾:

AutoGen自动化了LLM工作流,这在开发人员制作越来越复杂的基于LLM的应用程序时至关重要。

它提供了可定制的代理,这些代理不仅可以与用户进行自动对话,还可以在代理之间进行自动对话。

AutoGen代理可以合并llm、人工输入和其他工具的组合,克服每个组件单独的局限性。无论是代码生成、执行、调试还是复杂任务解决,AutoGen代理都可以处理各种高级操作。

创建Streamlit应用

我们的目标是这样的:

我们先安装如下包:

 aiohttp==3.8.6
 aiosignal==1.3.1
 altair==5.1.2
 async-timeout==4.0.3
 attrs==23.1.0
 blinker==1.6.3
 cachetools==5.3.2
 certifi==2023.7.22
 charset-normalizer==3.3.1
 click==8.1.7
 diskcache==5.6.3
 docker==6.1.3
 FLAML==2.1.1
 frozenlist==1.4.0
 gitdb==4.0.11
 GitPython==3.1.40
 idna==3.4
 importlib-metadata==6.8.0
 Jinja2==3.1.2
 jsonschema==4.19.1
 jsonschema-specifications==2023.7.1
 markdown-it-py==3.0.0
 MarkupSafe==2.1.3
 mdurl==0.1.2
 multidict==6.0.4
 numpy==1.26.1
 openai==0.28.1
 packaging==23.2
 pandas==2.1.2
 Pillow==10.1.0
 protobuf==4.24.4
 pyarrow==13.0.0
 pyautogen==0.1.13
 pydeck==0.8.1b0
 Pygments==2.16.1
 python-dateutil==2.8.2
 python-dotenv==1.0.0
 pytz==2023.3.post1
 referencing==0.30.2
 requests==2.31.0
 rich==13.6.0
 rpds-py==0.10.6
 six==1.16.0
 smmap==5.0.1
 streamlit==1.28.0
 tenacity==8.2.3
 termcolor==2.3.0
 toml==0.10.2
 toolz==0.12.0
 tornado==6.3.3
 tqdm==4.66.1
 typing_extensions==4.8.0
 tzdata==2023.3
 tzlocal==5.2
 urllib3==2.0.7
 validators==0.22.0
 websocket-client==1.6.4
 yarl==1.9.2
 zipp==3.17.0

然后创建

app.py

首先是导入包:

 import streamlit as st
 import asyncio
 from autogen import AssistantAgent, UserProxyAgent

streamlit用于创建UI。Asyncio对于异步控制流是必需的,它允许聊天响应。Autogen为聊天代理提供了类。

然后使用Streamlit的write函数设置应用的标题:

 st.write("# AutoGen Chat Agents")

这一行将在UI的顶部显示标题“AutoGen Chat Agents”。

然后就是创建自定义代理类,需要扩展AutoGen的AssistantAgent和UserProxyAgent:

 class TrackableAssistantAgent(AssistantAgent):
     def _process_received_message(self, message, sender, silent):
         with st.chat_message(sender.name):
             st.markdown(message)
         return super()._process_received_message(message, sender, silent)
 
 class TrackableUserProxyAgent(UserProxyAgent):
     def _process_received_message(self, message, sender, silent):
         with st.chat_message(sender.name):
             st.markdown(message)
         return super()._process_received_message(message, sender, silent)

这些类覆盖一个_process_received_message方法,在Streamlit聊天小部件中显示接收到的消息,为用户提供实时更新。

然后就是使用Streamlit的侧边栏功能进行配置:

 selected_model = None
 selected_key = None
 
 with st.sidebar:
     st.header("OpenAI Configuration")
     selected_model = st.selectbox("Model", ['gpt-3.5-turbo', 'gpt-4'], index=1)
     selected_key = st.text_input("API Key", type="password")

这里可以使用我们上次文章的本地 LLM 方案,这样就不用使用openai的付费API了

AutoGen完整教程和加载本地LLM示例

然后就是创建主聊天界面并处理输入:

 with st.container():
     # for message in st.session_state["messages"]:
     #    st.markdown(message)
 
     user_input = st.chat_input("Type something...")
     if user_input:
         if not selected_key or not selected_model:
             st.warning(
                 'You must provide valid OpenAI API key and choose preferred model', icon="⚠️")
             st.stop()
 
         llm_config = {
             "request_timeout": 600,
             "config_list": [
                 {
                     "model": selected_model,
                     "api_key": selected_key
                 }
             ]
         }

上面代码创建一个聊天输入字段,如果用户没有完成配置,将显示一个警告。

自定义我们的代理,并为异步聊天设置事件循环:

 # create an AssistantAgent instance named "assistant"
 assistant = TrackableAssistantAgent(
 name="assistant", llm_config=llm_config)
 
 # create a UserProxyAgent instance named "user"
 user_proxy = TrackableUserProxyAgent(
 name="user", human_input_mode="NEVER", llm_config=llm_config)
 
 # Create an event loop
 loop = asyncio.new_event_loop()
 asyncio.set_event_loop(loop)

代理的配置需要根据我们的需求自行定义,我们这里只给一个演示。除此以外还要使用asyncio为应用程序处理异步操作做好准备。

最后定义并运行异步函数来启动聊天:

 async def initiate_chat():
 await user_proxy.a_initiate_chat(
 assistant,
 message=user_input,
 )
 
 # Run the asynchronous function within the event loop
 loop.run_until_complete(initiate_chat())

当发送消息时,就可以在用户代理和助理代理之间发起聊天,结果如下:

总结

将AutoGen代理集成到Streamlit应用程序中,为创建由大型语言模型驱动的交互式智能ui提供了无数可能性。通过我们的以上代码可以建立一个响应式聊天界面,利用AutoGen的高级功能。AutoGen和Streamlit的结合为实现我们的需求提供了一个强大且对开发人员友好的途径。

本文完整代码:

https://avoid.overfit.cn/post/5b403f65a3084a9faf966b8bba0de2c7

作者:Dr. Ernesto Lee

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1183634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPU推理提速4倍!FlashDecoding++技术加速大模型推理

推理大模型(LLM)是AI服务提供商面临的巨大经济挑战之一,因为运营这些模型的成本非常高。FlashDecoding 是一种新的技术,旨在解决这一问题,它通过提高LLM推理速度和降低成本,为使用大模型赚钱提供了新的可能…

从F5 BIG-IP RCE漏洞(CVE-2023-46747)来看请求走私的利用价值

0x01 前言 F5 BIG-IP广域流量管理器是一种网络流量管理设备,用于提升链路性能与可用性。F5在金融行业具有特别广泛的使用量,做过各大银行攻防演练的小伙伴对这个系统应该不会陌生。 最近爆出的CVE-2023-46747漏洞能达到远程RCE的效果,属于严重…

浅谈消防设备电源监控系统在大型建筑内的应用

【摘要】:当建筑内火灾发生时,各类消防设备能否正常运行、能否发挥作用是初期火灾扑救是否成功的重要条件之一,而稳定可靠的消防设备电源则是消防设备正常工作的保障。因此针对消防设备电源的监测系统至关重要。 【关键词】:消防…

Python 既是解释型语言,也是编译型语言

哈喽大家好,我是咸鱼 不知道有没有小伙伴跟我一样,刚开始学习 Python 的时候都听说过 Python 是一种解释型语言,因为它在运行的时候会逐行解释并执行,而 C 这种是编译型语言 不过我今天看到了一篇文章,作者提出 Pytho…

5G与物联网应用:新一代网络技术融合开创新时代

5G与物联网应用:新一代网络技术融合开创新时代 随着信息技术的不断演进,5G和物联网作为新一代网络技术,正在引领我们走向一个更加智能化、互联互通的新时代。本文将分析5G与物联网应用的技术原理、应用场景与发展趋势,并探讨它们…

使用 matlab 的 Robotics ToolBox 完成5自由雄克机械臂的建模与运动学仿真,并计算8个点的运动轨迹,绘制运动动画

机器人包含5个关节,建立以下的DH参数表 matlab代码 %机器人学导论仿真大作业(RTB) clear clc h figure; axis tight manual filename SchunkRobot_Simulation.gif;%Schunk机械臂参数的输入 L10.35; L20.305; L30.3;%DH参数建立 Joint1 L…

TextMate v2.0.23(文本编辑器)

Mac上好用的文本编辑器是哪个?TextMate 2 mac版是Macos上一款文本编辑器,支持大量编程语言并作为开源开发。该软件与“BBEdit”并成为苹果电脑上的EMACS和vim,对于程序员来说非常的适合,可以定制许多贴心的功能。为专业脚本编写者…

计算一棵二叉树的单分支数(c语言代码实现)

本题代码如下 int num(tree t) {if (!t)return 0;else if ((t->lchild && t->rchildNULL)|| (t->lchildNULL&& t->rchild))//计算单支树return num(t->lchild) num(t->rchild) 1;else return num(t->lchild) num(t->rchild); } 完…

自制数据集:点云变化

代码 在干净的点云数据集中加入噪声时,由于不同点云的尺寸不同,很难控制噪声的幅度。为此,需要将所有点云变换到 [ − 0.5 , 0.5 ] 3 [-0.5,0.5]^3 [−0.5,0.5]3的空间当中。下面是一种将点云数据集中的所有点云变换到 [ − 0.5 , 0.5 ] 3 […

git命令行操作

git remote update origin --prune 更新本地的git分支保持和远程分支一致 git clone -b develop XXX 拉取某个分支的代码 1、创建一个空文件夹,在其中打开Git Bash Here,输入: git clone 刚刚复制的粘贴过来,回车 2、打开你拉下…

ArcGIS Pro设置谷歌影像(无水印)

1 打开软件,命名工程文件,底图(Basemap)选择【天地图】。 2 点击【视图(View)】——>【目录面板(Catalog pane)】,在【门户(Portal)】中搜索【…

20231107-前端学习炫酷菜单效果和折叠侧边栏

炫酷菜单效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>炫酷菜单效果</title><…

【达梦数据库】学习笔记

【达梦数据库】学习笔记 【一】如何使用idea连接达梦数据库【二】idea项目导入本地的达梦数据库驱动jar包&#xff08;方法一&#xff09;【三】idea项目把本地的达梦数据库驱动jar包安装到本地仓库&#xff08;方法二&#xff09; 【一】如何使用idea连接达梦数据库 &#xf…

[LeetCode]-138. 随机链表的复制

目录 题目 解题步骤 1.拷贝节点插入原节点的后面 2.置每个拷贝节点random 3.拷贝节点解下来&#xff0c;尾插到一起&#xff0c;恢复原链表 完整代码 题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表…

无人机红外相机的畸变矫正

在项目开展过程中&#xff0c;发现大疆M30T的红外相机存在比较明显的畸变问题&#xff0c;因此需要对红外图像进行畸变矫正。在资料检索过程中&#xff0c;发现对红外无人机影像矫正的资料较少&#xff0c;对此&#xff0c;我从相机的成像原理角度出发&#xff0c;探索出一种效…

Web前端—CSS高级(定位、高级技巧、CSS修饰属性、综合案例:购物网站轮播图)

版本说明 当前版本号[20231108]。 版本修改说明20231107初版20231108对知识点&#xff08;圆点&#xff09;进行补充 目录 文章目录 版本说明目录day08-CSS高级01-定位相对定位绝对定位定位居中固定定位堆叠层级 z-index定位总结 02-高级技巧CSS精灵案例-京东服务HTML结构CS…

Helix Toolkit:为.NET开发者带来的3D视觉盛宴

推荐一个基于.Net开源的3、功能强大的3D图形库和工具包&#xff0c;适用于WPF应用程序的3D渲染和开发。 01 项目简介 Helix Toolkit是一个开源的3D库&#xff0c;主要用于WPF应用程序。它有许多优点&#xff0c;例如提供各种各样的功能&#xff0c;包括基于MVVM的3D模型编辑器…

Python---ljust()--左对齐、rjust()--右对齐、center()--居中对齐

作用&#xff1a;返回原字符串左对齐、右对齐以及居中对齐&#xff0c;不足的使用 指定字符 进行填充。 ljust 左对齐 rjust 右对齐 center 居中对齐 类似于Excel、Word文档中的对齐。 基本语法&#xff1a; 字符串序列.ljust(长度, 填充字符) 案例&#xff1a; …

[100天算法】-搜索旋转排序数组(day 64)

题目描述 升序排列的整数数组 nums 在预先未知的某个点上进行了旋转&#xff08;例如&#xff0c; [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] &#xff09;。请你在数组中搜索 target &#xff0c;如果数组中存在这个目标值&#xff0c;则返回它的索引&#xff0c;否…

【黑马程序员】SpringCloud——Eureka

文章目录 前言一、提供者与消费者1. 服务调用关系 二、远程调用的问题三、eureka 原理分析1. eureka 的作用 四、Eureka 案例1. 搭建 eureka 服务1. 服务注册1.1 注册 user-service1.2 启动 user-service3. order-service 完成服务注册 3. 服务发现1. 在 order-service 完成服务…