InsCode GPT API + Streamlit实现多轮对话

1、摘要(Abstract)

调用InsCodeGPTAPI的能力,实现参数(temperature和token)可调的多轮对话功能。使用python的streamlit库进行网页界面的创作,以一种全新的形式便捷地实现网页功能。


使用语言:python
参考文档(Reference):
https://docs.streamlit.io/develop/api-reference
https://inscode-doc.inscode.cc/ide/gpt-api.html
https://aiui-doc.xf-yun.com/project-1/doc-43/
https://www.xfyun.cn/doc/spark/API.html

受众:即将开始gptapi调用,python stremlit尝试,好奇Inscode的使用方式


2、介绍(Introduction)

为什么要写这个呢,首先是笔者想体验一下这个云平台的功能以及发布实现流程。第二是手痒了有些好奇为啥这个不知名的GPT售价居然比讯飞星火高,也正好,整个多轮对话出来。

2.1、InsCode

InsCode 是 CSDN提供的一个交互式的学习环境,帮助开发者快速学习和实践各种编程技能和知识。

主要特点:

用户可以直接在平台上进行编写、运行和调试代码,提供支持多种热门的编程语言模板。
还提供了一个活跃的社区,用户可以在社区中与其他开发者进行交流、分享经验和解决问题。
同时,与Git Code平台密切结合,实现了版本管理

GPT:

InsCode GPT 是一个基于GPT(Generative Pre-trained Transformer)模型的自然语言处理工具,是一个强大的代码生成和代码自动补全工具,它能够大大提高开发者的工作效率和代码质量。
它可以根据用户的描述和需求生成符合规范的代码,减少了手动编写代码的时间和工作量。根据用户提供的上下文信息给出更准确的建议。它可以识别潜在的错误和问题,并提供相应的修复建议,帮助开发人员改善代码质量和可靠性。

2.2、Streamlit

Streamlit 是一个用于创建数据科学和机器学习应用程序的Python库。提供了一系列简单的API,使开发人员能够通过一些简单的Python脚本创建交互式应用。开发人员可以使用常见的Python库(如Pandas、Matplotlib、Plotly等)来处理和可视化数据,并使用Streamlit来构建用户界面

2.3、相关工作(Related work)

讯飞星火的API调用

两者的API调用方法并没有太大的差别,而且星火也有自己的社区。
不过,与此不同的是,星火还支持模型微调自定义讯飞智能体创建等,其中包括了三种方式来定制自己的模型,并且提供免费的API服务,还有很多其他免费的API功能可供使用。
而令人困惑的是,InsCode的API使用次数却被限制在了10次,因此笔者对于InsCode的能力还是十分期待的。

3、方法(Method)

3.1、创建环境

创建环境
从csdn的标题栏进入界面后,点击快速开始,选用官方提供的Streamlitb模板,就能搭建一个1 核/2 GB 云端开发环境,这对于简单网页功能的测试来说是完全足够的。

3.2、代码界面按钮介绍

主界面
进入后就看到这样的界面,左边就是源文件,中间编辑区,右边是一些配置,当然也可以直接使用AI进行创作。同时可以直接调用终端。点击上方运行按钮后,还能将项目运行至右侧预览窗口。部署需要Pro功能,据了解应该是可以提供公网接口。环境变量用于存放一些敏感数据,比如apikey,(这个环境变量是真的环境变量,笔者之前傻傻的以为是全局变量,死活调用不出来)。

3.3、代码规划

笔者始终认为,思想,是最重要的。
这个项目呢也不是什么任务,秉持轻松写代码的原则,笔者打算将其全都集中在一个文件中,先完成界面搭建,再将输入封装入请求体发起请求。
依据样例提供的代码我们不难发现一些“蹊跷”:没错,按照常规的理解这个代码只执行了一次,但是众所周知,网页不可能只执行一次,那究竟是什么使得平台代码执行了多次呢?
不错,正是这行运行命令:
运行命令
所以python代码只当关注界面的实现就行了。
然后打开文档一瞅,倒吸一口凉气!我嘞个乖乖这我之前前端白雪了吗?这,这这,你告诉我都只要两行代码?
streamlitdoc
接着看看gpt的文档,咱就是说,那叫一个简洁明了,例子也不少,python更有直接两种方式,笔者自然需要使用全部参数,就用post的方式了。
gptdocgptdoc2

3.4、界面搭建

这么一梳理,咱么的工作量其实并不大,开干!

3.4.1、用户输入

本来按照一个输入框一个按钮的想法,正在文档里边巴拉怎么监听按钮事件,获取输入文本的。结果找着找着,眼前一亮:
chatinput

我嘞个,,,,我在瞎起什么劲啊?十分容易的找到了copy按钮,对比了一下参数,on_submit就能实现事件的绑定,还非常贴心的返回value of text
example1在这里插入图片描述

3.4.2、参数输入

参数的输入就直接使用滚条吧(普通用户也不太清楚temperature和token是什么玩意=。=)回到gpt的文档中,也是如愿看到了我们要的参数上下限。
inputgptdoc

with st.sidebar:
     self.temperature = st.slider("temperature:", 0.0, 1.0, 0.7)
     self.token = st.slider("token:", 0, 4000, 2048)
     st.write("temperature: ",self.temperature,"token: ",self.token)

3.5、InsCode GPT API调用

最主要的无疑是两个,请求体的封装和返回数据的解析。

3.5.1、请求体的封装

话不多说,直接上代码。

def encodeBody(self,content:str):
     message = {"role": "user", "content": content}
     self.messages.append(message)
     with open("./data",'w',encoding='utf-8') as f:
         json.dump(self.messages,f)
     return {
         "messages": self.messages,
         "temperature": self.temperature,
         "max_tokens": self.token,
         "stream_token": False,
         "apikey": self.apikey
     }

在这笔者为了方便数据的流通以及表述的方便,将整个封装在了一个类中,也就有了你看到的self 但是别慌,这些属性都是来自streamlit库的返回值,直接接收就行,连监听都不需要写,非常的方便。

3.5.2、数据的解析

这里的data返回的非常迷,文档中虽然给了不少例子,笔者也尝试了一下得到了一些,但是发现这里的response居然没法用json解析。而根据文档的提示(这个文档我只能说太简洁了),response.text是可用的,那就直接解析字符串,咱可不能在这浪费我们宝贵的十次API。
结果令人眼前震惊的是,文档的示例可能是一个,在诸多行返回之后,才有了data:[DONE]这窜玩意儿。所以有了这里的response.text[5:][:-15]将前后都给删了,然后用json进行解析。

def sendRequest(self,data):
    data = self.encodeBody(data)
    response = requests.post(self.url, json=data, headers=self.headers)
    a =  response.text[5:][:-15]
    print(a)
    response_dict = json.loads(a)
    if response.status_code == 200:
        return response_dict
    else:
        return "Request failed"

3.6、连接

现在两个都搭建好了就方便了,从streamlit的文档里找到了连接的方式。既然是要实现多轮对话,自然要将数据给储存起来,通过print实验笔者发现,这个不像是热部署,而更类似于每次刷新,所以内存中的数据必然是不可靠的,那就使用文件的形式进行存储。

if prompt := st.chat_input("Say something"):
      messages.chat_message("user").write(f"User: {prompt}")
      res = self.sendRequest(prompt)
      try:
          res_content = res["choices"][0]["delta"]["content"]
      except Exception:
          res_content = "let me think for a while"
      messages.chat_message("assistant").write(f"Robot: {res_content}")
      self.messages.append({"role": "assistant", "content": res})
      # self.messages.append({"role": "user", "content": prompt})
      # self.messages.append({"role": "assistant", "content": prompt})
      with open("./data",'w',encoding='utf-8') as f:
          json.dump(self.messages,f)
      # print(self.messages)

那问题又来了,如果不同的人同时运行了笔者的代码,不就会已读乱回了吗?所以,笔者在类的初始化阶段,将data历史限制在5条。

try:
   	with open("./data",'r',encoding='utf-8') as f:
      	self.messages = json.load(f)
except Exception:
    self.messages = []
if(len(self.messages) >= 5):
    self.messages=self.messages[-3:]

3.7、优化

现在核心的代码已经没有问题了,尝试运行,apikey果然开始作妖了,使用环境变量的方式将它调出来,好在这个问题不消耗次数。代码如下:
self.apikey = os.getenv('INSCODE_API_KEY')

4、测试(Experience)

4.1、运行

经过测试(忘了截图了),笔者也是实现了功能,但是API的量实在是太少了,笔者自己玩了两下就没了,效果难以评价。
result
咱再来看看星火的,能力行不行咱先不说,可人家量多啊哈哈哈哈。
在这里插入图片描述

4.2、发布

这里有个坑,点击发布之后这里默认直接发布的是模板,笔者也不知道为什么,明明已经运行过了,提交的审核版本居然是第一步中选择的Streamlit模板。而且无法撤回,于是在等待了漫长的13小时后,笔者提交的模板居然发布出去了。。。
笔者也是将其删掉之后,在右下角进行了版本设定,确认保存后再次进行了提交,不料预览的待审核版本还是那个模板,就当笔者疑惑时,发现了代码编辑区的左上角,居然有着一个更新按钮。点击之后审核预览没有变化,17小时后,发布的却是笔者的代码。
笔者没明白这个玩意正常该怎么操作,但是好歹是发出去了。
在这里插入图片描述

5、总结(Conclusion)

在一番折腾下呢笔者也是勉强体验完了这个平台(这下老实了),笔者认为平台最大的优势就是它庞大的生态,不论是csdn还是代码仓库,还是社区平台,都让这个嵌入进来的api有更好的发展机遇。
更重要的是感受了python的Streamlit库的便利,一些小的项目和科研代码的简单调用完全可以使用这个来负责前端,这个学习成本几乎为零,就能让一些布局轻松玩转。

st.balloons():
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值