Streamlit项目:基于讯飞星火认知大模型开发Web智能对话应用

2023-11-05

在这里插入图片描述

1 前言

科大讯飞公司于2023年8月15日发布了讯飞认知大模型V2.0,这是一款集跨领域知识和语言理解能力于一体的新一代认知智能大模型。前日,博主对讯飞认知大模型进行了详细的分析,详情请至博文《星星之火:国产讯飞星火大模型的实际使用体验(与GPT对比)》了解。

总的来说,讯飞星火认知大模型表现出卓越的整体性能,在多个领域展现出优秀水平,并且独具多模交互的能力,使其适用的领域更为广泛。特别值得关注的是其中的语义测试、常识性测试以及事件分类测试,这些测试项目揭示了讯飞认知大模型与GPT之间的差异。在常识和事件分类测试中,讯飞认知大模型展示出更出色的表现,而在语义测试中,GPT在准确识别讽刺意味方面更为优秀!

本篇博文聚焦于利用讯飞星火认知大模型的API,基于Streamlit构建个人Web智能对话应用的实践案例。

在本文中,我们将深入探讨如何利用讯飞星火认知大模型的强大功能,为个人Web应用赋予智能对话的能力。我们将介绍整个开发过程的步骤和技术细节,并分享一些关键的使用经验和优化策略。无论您是对智能对话应用开发感兴趣的开发者,还是想要了解讯飞星火认知大模型在实际应用中的表现的研究者,本文都将为您提供宝贵的参考和实践经验。

如果您对Streamlit感兴趣,并且希望深入了解更多相关知识,我强烈推荐您关注我的专栏——《最全Streamlit教程》。

在这个专栏中,我将分享一系列深入而详尽的Streamlit教程和实战案例。我们将探索Streamlit在Web应用开发中的广泛应用,从基本概念到高级功能的全方位覆盖。

通过这些教程,您将深入了解Streamlit的核心原理、工作流程和常见用法。我将解析Streamlit的各个组件和功能,并提供实用的示例代码和技巧,助您快速上手并构建出令人惊叹的交互式应用程序。

在这里插入图片描述

2 API获取

要使用讯飞星火认知大模型的功能,您需要向讯飞官方提交申请表单(官网地址)。

在这里插入图片描述

在页面上点击"API测试申请",按照指示填写并创建应用,填写正确的信息后,您只需稍等一两天,便可收到讯飞发来的短信通知。随后,您可以登录到开发者工作台,获取所需的appid、api_secret、api_key等关键信息。

3 官方文档的调用代码

为了在Python环境下使用Streamlit工具,博主下载了讯飞官方文档中的Python调用示例,以便更好地理解和应用该工具。您可以通过以下链接下载官方文档:下载链接

在解压后的文件夹中,您将找到两个Python文件:SparkApi.py和test.py。其中,SparkApi.py是讯飞官方提供的库文件,无需进行任何修改。而我们的重点将放在对test.py文件的研究和修改上。
在这里插入图片描述
在您的环境中,为了确保能够成功搭建本篇博文所介绍的项目,您至少需要安装以下必要的库:

pip install streamlit
pip install websocket-client
pip install streamlit_chat

我们来看看test.py文件中的代码:

import SparkApi
#以下密钥信息从控制台获取
appid = "XXXXXXXX"     #填写控制台中获取的 APPID 信息
api_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"   #填写控制台中获取的 APISecret 信息
api_key ="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"    #填写控制台中获取的 APIKey 信息

#用于配置大模型版本,默认“general/generalv2”
domain = "general"   # v1.5版本
# domain = "generalv2"    # v2.0版本
#云端环境的服务地址
Spark_url = "ws://spark-api.xf-yun.com/v1.1/chat"  # v1.5环境的地址
# Spark_url = "ws://spark-api.xf-yun.com/v2.1/chat"  # v2.0环境的地址


text =[]

# length = 0

def getText(role,content):
    jsoncon = {}
    jsoncon["role"] = role
    jsoncon["content"] = content
    text.append(jsoncon)
    return text

def getlength(text):
    length = 0
    for content in text:
        temp = content["content"]
        leng = len(temp)
        length += leng
    return length

def checklen(text):
    while (getlength(text) > 8000):
        del text[0]
    return text
    


if __name__ == '__main__':
    text.clear
    while(1):
        Input = input("\n" +"我:")
        question = checklen(getText("user",Input))
        SparkApi.answer =""
        print("星火:",end = "")
        SparkApi.main(appid,api_key,api_secret,Spark_url,domain,question)
        getText("assistant",SparkApi.answer)
        # print(str(text))


在上述代码中,我们需要从控制台获取以下信息:appid、api_secret、api_key。为了确保代码顺利运行,我们需要将 domain 和 Spark_url 更改为 V2.0 版本。

此外,确保 SparkApi.py 文件与 test.py 文件在同一目录下,以便能够轻松地进行导入操作。同样,在将此功能嵌入到 Streamlit 网页项目时,也需要遵循同样的文件路径规则和导入方式。

这些信息是访问讯飞API所必需的凭证和身份验证信息。您可以在讯飞的开发者控制台中获取这些信息。确保您输入的凭证信息正确无误,这样才能够正常连接到讯飞API并获取所需的数据和结果。

以下是运行结果:

在这里插入图片描述

很好!已经成功地调用了讯飞API并获得所需的结果。现在,我们可以将这个功能嵌入到一个 Streamlit 网页中,以方便用户使用和体验。

4 Streamlit 网页的搭建

4.1 代码及效果展示

在基于官方提供的示例代码的基础上,我们成功搭建了一个使用 Streamlit 的网页。以下是完整的网页源码(注释很详细):

import streamlit as st
from streamlit_chat import message

import SparkApi

# 以下密钥信息从控制台获取
appid = "XXXXXXXX"  # 填写控制台中获取的 APPID 信息
api_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"  # 填写控制台中获取的 APISecret 信息
api_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"  # 填写控制台中获取的 APIKey 信息

# 用于配置大模型版本,默认“general/generalv2”
# domain = "general"   # v1.5版本
domain = "generalv2"  # v2.0版本
# 云端环境的服务地址
# Spark_url = "ws://spark-api.xf-yun.com/v1.1/chat"  # v1.5环境的地址
Spark_url = "ws://spark-api.xf-yun.com/v2.1/chat"  # v2.0环境的地址

text = []  # 用于存储对话内容的列表

def getText(role, content):
    """
    构造包含角色和内容的对话信息,并添加到对话列表中
    
    参数:
    role (str): 对话角色,可以是 "user"(用户)或 "assistant"(助手)
    content (str): 对话内容
    
    返回值:
    text (list): 更新后的对话列表
    """
    jsoncon = {}
    jsoncon["role"] = role
    jsoncon["content"] = content
    text.append(jsoncon)
    return text

def getlength(text):
    """
    计算对话列表中所有对话内容的字符长度之和
    
    参数:
    text (list): 对话列表
    
    返回值:
    length (int): 对话内容的字符长度之和
    """
    length = 0
    for content in text:
        temp = content["content"]
        leng = len(temp)
        length += leng
    return length

def checklen(text):
    """
    检查对话列表中的对话内容字符长度是否超过限制(8000个字符)
    如果超过限制,删除最早的对话内容,直到满足字符长度限制
    
    参数:
    text (list): 对话列表
    
    返回值:
    text (list): 更新后满足字符长度限制的对话列表
    """
    while getlength(text) > 8000:
        del text[0]
    return text

if __name__ == '__main__':
    # 在 Streamlit 网页上显示欢迎文本
    st.markdown("#### 我是讯飞星火认知模型机器人,我可以回答您的任何问题!")
    
    # 初始化对话历史和生成的响应列表
    if 'generated' not in st.session_state:
        st.session_state['generated'] = []
    if 'past' not in st.session_state:
        st.session_state['past'] = []
    
    # 获取用户输入的问题
    user_input = st.text_input("请输入您的问题:", key='input')
    
    if user_input:
        # 构造用户输入的对话信息
        question = checklen(getText("user", user_input))
        
        # 调用 SparkApi 中的函数进行问题回答
        SparkApi.answer = ""
        print("星火:", end="")
        SparkApi.main(appid, api_key, api_secret, Spark_url, domain, question)
        output = getText("assistant", SparkApi.answer)
        
        # 将用户输入和生成的响应添加到对话历史和生成的响应列表中
        st.session_state['past'].append(user_input)
        st.session_state['generated'].append(str(output[1]['content']))
        
    if st.session_state['generated']:
        # 在网页上显示对话历史和生成的响应
        for i in range(len(st.session_state['generated']) - 1, -1, -1):
            message(st.session_state["generated"][i], key=str(i))
            message(st.session_state['past'][i], is_user=True, key=str(i) + '_user')

在代码中,将以下变量替换为您从讯飞开放平台获得的信息:

  • appid:替换为您的APPID。
  • api_secret:替换为您的APISecret。
  • api_key:替换为您的APIKey。

终端运行 Streamlit 应用程序:

streamlit run your_app.py

在这里插入图片描述

4.2 Streamlit相关知识点

  1. st.markdown():用于在Streamlit应用程序中显示Markdown格式的文本。
  2. st.text_input():用于在Streamlit应用程序中创建一个文本输入框,用来获取用户的输入。
  3. st.session_state:用于在Streamlit应用程序中存储和访问会话状态,可以在不同的函数之间传递数据。在这段代码中,使用st.session_state来保存和获取对话历史和生成的响应。
  4. st.session_state[‘generated’]和st.session_state[‘past’]:这些变量用于存储对话历史和生成的响应的列表。
  5. message()函数:这是一个自定义的Streamlit组件,用于显示消息。在这段代码中,使用message()函数来显示对话历史和生成的响应。

如果您对Streamlit感兴趣,并且希望深入了解更多相关知识,我强烈推荐您关注我的专栏——《最全Streamlit教程》。

5 结语

本博文介绍了如何使用Streamlit和讯飞星火认知模型机器人构建一个问答应用程序。通过集成讯飞开放平台的API和自定义的Streamlit组件,我们可以实现实时的问答功能,并在网页上显示对话历史和生成的响应。

在使用这段代码前,需要完成一些准备工作,包括在讯飞开放平台注册账号、创建应用程序并获取相关信息。然后,需要安装所需的Python库,并将提供的源代码修改为适用于自己的API密钥和地址信息。最后,运行Streamlit应用程序并在浏览器中访问生成的URL即可。

在实现问答功能的过程中,我们学习了一些与Streamlit相关的知识点,包括显示Markdown文本、创建文本输入框、存储会话状态等。这些功能使得构建交互式的Web应用程序变得简单易用。

通过本博文的介绍,您现在可以开始使用讯飞星火认知模型机器人构建自己的问答应用程序了。希望这对您有帮助,祝您在开发过程中顺利前进!

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Streamlit项目:基于讯飞星火认知大模型开发Web智能对话应用 的相关文章

随机推荐

  • el-table 动态表格 + 动态合并多列单元格方法

    动态合并单元格 之前有篇文章写了 el table 通过 span method 方法实现合并单元格的方法 但是当时只写了合并第一列的 就有小伙伴询问 如果多列合并怎么办 刚好最近有个项目遇到了动态表格并且要合并多列单元格 在详细的记录一下
  • Ubuntu17.04禁用访客模式/忽略终端大小写

    在ubuntu17 04中禁用访客模式 只需一条命令就可以了 sudo sh c printf SeatDefaults nallow guest false n gt etc lightdm lightdm conf d 50 no gu
  • python matplotlib 画图参数简要说明

    文章目录 import matplotlib pyplot as plt 用来正常显示中文 否则中文是一堆方框 plt rcParams font sans serif SimHei 用来正常显示负号 plt rcParams axes u
  • 设计循环队列

    前言 队列中有一种特殊的存在 环形队列 其有一定的价值与意义 这篇文章主要由一道与其相关的例题来引出相关的知识内容 注 下述解题过程是用C语言实现 目录 一 题目简述 二 环形队列的简单介绍 三 环形队列的实现 1 数组实现 1 过程分析
  • java动态扩展_java栈内存动态扩展要怎么理解?要如何实现?

    小伙伴们知道如何在java栈中内存动态扩展吗 这是虚拟机中的一个概念 下面让我们一起来看看该如何实现吧 一 内存概念 在java中 我们一般会简单把java内存区域划为两种 堆内存与栈内存 其实这种划分是比较粗粒度的 其中栈内存就是指的是虚
  • 浅析C语言结构体及位段

    数据经常以组的形式存在 例如 学校需要了解每位学生的姓名 学号和成绩等 如果这些值储存在一起 访问起来会更加简单 但如果类型不同 就无法存储于同一个数组中 所以在C语言中可以使用结构把不同类型的值存储在一起 先来看看百度百科对结构体的定义
  • 数组小和问题

    描述 在一个数组中 每一个数左边比当前数小的数累加起来 叫做这个数组的小和 求一个数组的小和 例子 1 3 4 2 5 1左边比1小的数 没有 3左边比3小的数 1 4左边比4小的数 1 3 2左边比2小的数 1 5左边比5小的数 1 3
  • 【云原生之Docker实战】使用Docker部署Ferry开源工单系统

    云原生之Docker实战 使用Docker部署Ferry开源工单系统 一 Ferry介绍 1 Ferry简介 2 Ferry特点 3 Ferry系统功能 二 检查本地系统环境 1 检查docker版本 2 检查docker状态 3 检查do
  • thymeleaf 常量_thymeleaf全局常量定义

    微服务现在最流行的莫过于springboot 官方推荐两种模板语言 freemarker和thymeleaf 本文只介绍thymeleaf中如何定义全局常量 百度一搜thymeleaf的全局常量定义 都是让把常量写在 message 文件中
  • std::ifstream vShaderfile & vShaderfile.ifstream.exceptions(std::ifstream::badbit)

    一 利用 fstream ifstream类打开文件 string stringstream类读入流 写入string类 二 try catch 检测异常 1 Retrieve the vertex fragment source code
  • 与Power PMAC通讯

    与PMAC通讯 Power PMAC通讯 通用Internet协议套件概述 Power PMAC 网络协议套件的使用 启动Power PMAC SSH Telnet通讯 IDE通信与Power PMAC FTP访问Power PMAC 修改
  • 代码加密和反编译

    代码加密和反编译 概述 通过 NET编译的项目得到的dll文件 由于要翻译为虚拟机可以执行的中间语言IL 这种语言规则性比较强 很容易通过各种反编译软件翻译成源码 所以当部署到实际项目中就需要进行一些加密 公司的项目是 NET CORE框架
  • 谈谈自己对链表的理解

    先说一个大概念 物理结构区分数据结构 分为顺序存储 链式存储 逻辑上区分就是集合 线性 树形 图形 1 什么是链表 它是有数据域和和指针域组成 那么什么是数据域 就是存储数据的区域 那么什么是指针域 指针域其实就是指针 用来标记此数据的相邻
  • SaaSBase:最受欢迎的协同办公软件有哪些(上篇)

    在海量的协同办公软件中 企业该如何选择呢 不用担心 SaaSBase saasbase cn 来帮您 根据 SaaSBase saasbase cn 的数据统计 有较多的协同办公软件受到企业的欢迎 故小编将它们拆分为两篇为您揭晓 先看今天第
  • HTTPS 客户端与服务端的交互过程

    一 客户端向服务端发起 HTTPS 请求 请求中包含了请求头 请求主体等信息 1 这一步就是 tcp 的三次握手 二 服务端接收到请求后 发送数字证书给客户端 以便客户端验证服务端身份 1 这一步是 SSL TLS 协议的握手过程 其目的是
  • 关于mysql的mycat中间件安装配置与python使用mycat例子

    关于mysql的mycat中间件安装配置与python使用mycat例子 MyCAT是mysql中间件 Mycat数据库分库分表中间件国内最活跃的 性能最好的开源数据库中间件 它是一款开源的Mysql企业级集群应用 前身是阿里大名鼎鼎的Co
  • thrust STL 及 cub 官方测试用例的编译 build

    cub项目github网址 GitHub NVIDIA cub Cooperative primitives for CUDA C 1 构建 thrust Clone Thrust and CUB from Github CUB is lo
  • boa-0.94.13移植到uclinux arm s3c4510b的过程

    正在移植boa 0 94 13到uclinux上 几点笔记 大家分享 编译一个linux下的c系统 包含词法和语法分析模块 Linux上用bison和flex yacc是一个文法分析器的生成器 bison即是yacc的GNU版本 Lex和Y
  • python进程池pool的starmap的使用

    usr bin env python3 from functools import partial from itertools import repeat from multiprocessing import Pool freeze s
  • Streamlit项目:基于讯飞星火认知大模型开发Web智能对话应用

    文章目录 1 前言 2 API获取 3 官方文档的调用代码 4 Streamlit 网页的搭建 4 1 代码及效果展示 4 2 Streamlit相关知识点 5 结语 1 前言 科大讯飞公司于2023年8月15日发布了讯飞认知大模型V2 0