克隆OpenAI(基于openai API和streamlit)
utils.py:
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
import osdef get_chat_response(api_key,prompt,memory): # memory不能是函数的内部局部变量,否则会被清空;而且它是引用传递model = ChatOpenAI(model="gpt-3.5-turbo",api_key=api_key,base_url="https://api.gptsapi.net/v1")# 利用带记忆的对话链chain = ConversationChain(llm=model,memory=memory)result = chain.invoke({"input":prompt # 默认提示模板里需要填充input变量}) #返回值是一个字典,包含了input、history、responsereturn result["response"]# memory = ConversationBufferMemory(return_messages=True) 记得创建记忆的实例
# print(get_chat_response(os.getenv("OPENAI_API_KEY"),"牛顿提出过那些知名的定律?",memory))
# print(get_chat_response(os.getenv("OPENAI_API_KEY"),"我上一个问题是什么?",memory))
main.py:
import streamlit as st
from utils import get_chat_response
from langchain.memory import ConversationBufferMemoryst.title("克隆ChatCPT")with st.sidebar:api_key = st.text_input("请输入OpenAI API 密钥:",type="password")st.markdown("[获取OpenAI API 密钥]()")# 初始化会话状态(记忆和消息列表)
if "memory" not in st.session_state:st.session_state.memory = ConversationBufferMemory(return_messages=True) st.session_state.messages = [{"role":"ai", "content":"你好,我是你的AI助手,有什么可以帮你的吗?"}] #messages为了便于在前端页面上展示对话# 显示历史对话消息(初始显示)
for message in st.session_state.messages:st.chat_message(message["role"]).write(message["content"])# 获取用户输入
prompt = st.chat_input()
if prompt:if not api_key:st.info("请输入你的OpenAI API密钥")st.stop()st.session_state.messages.append({"role":"human","content":prompt}) #将用户提问封装成消息对象,并添加进messages列表st.chat_message("human").write(prompt) # 在页面显示该消息内容# 获取AI回复with st.spinner("AI正在思考中,请稍等···"):response = get_chat_response(api_key=api_key,prompt=prompt,memory=st.session_state.memory)st.session_state.messages.append({"role":"ai","content":response}) #将AI的回复封装成消息对象,并添加进messages列表st.chat_message("ai").write(response) #在页面上显示该消息内容
补充:
1、初始化会话状态
- 如果会话状态中没有
memory变量,则创建一个ConversationBufferMemory实例,并将return_messages参数设置为True,表示返回消息列表。(记忆)- 同时,初始化会话状态中的
messages列表,包含一条初始的 AI 回复消息。(显示在页面上的消息列表)2、显示历史对话信息
遍历会话状态中的
messages列表,使用st.chat_message函数根据消息的角色(human或ai)创建聊天消息框,并自动选择图标和样式来显示消息内容。3、获取用户输入
st.chat_input:创建一个聊天输入框,获取用户输入的消息。- 如果用户输入了消息,首先检查是否输入了 API 密钥,如果没有输入,则显示提示信息并停止程序执行。
- 将用户输入的消息添加到会话状态的
messages列表中,并在界面上显示该消息。4、获得AI的回复并显示
- 调用
get_chat_response函数,传入 API 密钥、用户输入和对话记忆,获取 AI 的回复。- 将 AI 的回复封装成消息对象,添加到会话状态的
messages列表中,并在界面上显示该消息。5、关于messages和memory
基于数据结构的灵活性不同、功能侧重点不同以及代码的可读性和维护性,建议将memory和messages分开使用,各自发挥其优势。
6、
st.session_state.memory = ConversationBufferMemory(return_messages=True)
# 等价于st.session_state["memory"]=ConversationBufferMemory(return_messages=True)
st.session_state是 Streamlit 提供的一个用于在应用会话期间存储和共享数据的对象,从底层实现来讲,它的行为类似于 Python 的字典(dict)。所以可以有两种访问方式:
对象的属性访问—— .
obj = MyClass() obj.name = "John" # 设置属性 print(obj.name) # 访问属性字典的键值对访问—— [ ]
my_dict = {} my_dict["name"] = "John" # 设置键值对 print(my_dict["name"]) # 获取键对应的值
相关文章:
克隆OpenAI(基于openai API和streamlit)
utils.py: from langchain_openai import ChatOpenAI from langchain.memory import ConversationBufferMemory from langchain.chains import ConversationChain import osdef get_chat_response(api_key,prompt,memory): # memory不能是函数的内部局部变量&…...
位运算算法题
一.判断字符是否唯一 法一: 我们直接借助一个字符数组来模拟哈希表统计字符串即可,并且我们没有必要先将所有字符都放入字符数组中,边插入边判断,当我们要插入某个字符的时候,发现其已经出现了,此时必然重复…...
12 向量结构模块(vector.rs)
一vector.rs源码 // Copyright 2013 The Servo Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE…...
Android车机DIY开发之学习篇(六)编译讯为3568开发板安卓
Android车机DIY开发之学习篇(六)编译讯为3568开发板安卓 1.SDK解压到家目录下的 rk3588_android_sdk 目录 一. 全部编译 ###安装所需环境 sudo apt-get update sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g…...
Codeforces Round 863 (Div. 3) E. Living Sequence
题目链接 头一回用不是正解的方法做出来,也是比较极限,直接说做法就是二分数位dp 数位 d p dp dp 求 1 − n 1-n 1−n出现多少含 4 4 4的数字个数 这纯纯板子了 \sout{这纯纯板子了} 这纯纯板子了 设 f ( x ) f(x) f(x) 为 1 − x 1-x 1−x 中含有4的…...
一文讲解HashMap线程安全相关问题(上)
HashMap不是线程安全的,主要有以下几个问题: ①、多线程下扩容会死循环。JDK1.7 中的 HashMap 使用的是头插法插入元素,在多线程的环境下,扩容的时候就有可能导致出现环形链表,造成死循环。 JDK 8 时已经修复了这个问…...
MFC 创建Ribbon样式窗口
然后点击下一步直到完成即可...
uv 安装包
是的,你可以使用 uv 来安装 Python 包。uv 是一个高性能的 Python 包安装器和解析器,由 astral.sh 团队开发,旨在替代 pip 和 pip-tools,提供更快的包安装体验。 ### 如何使用 uv 安装包 1. **安装 uv**: 如果你还…...
IELTS口语练习题库
IELTS口语1-4月题库 Part 1 Gifts Have you ever sent handmade gifts to others? Yes, I have. I once made a scrapbook for my best friend’s birthday. It included photos of our memories together and some handwritten notes. She loved it because it was personal…...
图书管理系统 Axios 源码__获取图书列表
目录 核心功能 源码介绍 1. 获取图书列表 技术要点 适用人群 本项目是一个基于 HTML Bootstrap JavaScript Axios 开发的图书管理系统,可用于 添加、编辑、删除和管理图书信息,适合前端开发者学习 前端交互设计、Axios 数据请求 以及 Bootstrap 样…...
基于OSAL的嵌入式裸机事件驱动框架——整体架构调度机制
参考B站up主【架构分析】嵌入式祼机事件驱动框架 感谢大佬分享 任务ID : TASK_XXX TASK_XXX 在系统中每个任务的ID是唯一的,范围是 0 to 0xFFFE,0xFFFF保留为SYS_TSK_INIT。 同时任务ID的大小也充当任务调度的优先级,ID越大&#…...
c++ string类 +底层模拟实现
提醒: 本片博客只是小编的听课笔记,介意勿看。 基础 包含在头文件<string>,才能使用string类似函数接口。 string常见构造类 string s1; cin>>s1;//无参构造 string s2(s1);//拷贝构造 string s1("jfksa");//传参构造 三种…...
六十分之三十七——一转眼、时光飞逝
一、目标 明确可落地,对于自身执行完成需要一定的努力才可以完成的 1.第三版分组、激励、立体化权限、智能设备、AIPPT做课 2.8本书 3.得到:头条、吴军来信2、卓克科技参考3 4.总结思考 二、计划 科学规律的,要结合番茄工作法、快速阅读、…...
Shell基础:中括号的使用
在Shell脚本中,中括号([ ... ] 和 [[ ... ]])是一种常见的条件测试结构。它们用于进行文件类型检查、值比较以及逻辑判断。通过了解它们的不同特点和用法,能够帮助你编写更加高效、安全且易读的脚本。本文将详细介绍Shell中单中括…...
《基于Scapy的综合性网络扫描与通信工具集解析》
在网络管理和安全评估中,网络扫描和通信是两个至关重要的环节。Python 的 Scapy 库因其强大的网络数据包处理能力,成为开发和实现这些功能的理想工具。本文将介绍一个基于 Scapy 编写的 Python 脚本,该脚本集成了 ARP 扫描、端口扫描以及 TCP…...
面经--C语言——sizeof和strlen,数组和链表,#include <>和 #include ““ #define 和typedef 内存对齐概述
文章目录 sizeof 和 strlen数组和链表总结 #include <>和 #include ""#define 和typedef内存对齐概述对齐规则示例:结构体的内存对齐分析: 内存对齐的常见规则:填充字节的计算对齐影响的实际例子 sizeof 和 strlen 特性size…...
使用 Kotlin 将 Vertx 和 Springboot 整合
本篇文章目的是将 Springboot 和 Vertx 进行简单整合。整合目的仅仅是为了整活,因为两个不同的东西整合在一起提升的性能并没有只使用 Vertx 性能高,因此追求高性能的话这是在我来说不推荐。而且他们不仅没有提高很多性能甚至增加了学习成本 一、整合流…...
线性回归算法-01
线性回归简介 学习目标 了解线性回归的应用场景知道线性回归的定义 1 线性回归应用场景 房价预测销售额度预测贷款额度预测 2 什么是线性回归 2.1 定义与公式 线性回归(Linear regression)是利用 回归方程(函数)对 一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模…...
洛谷 P1130 红牌 C语言
题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌。获得红牌的过程是相当复杂,一共包括 N 个步骤。每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件。为了加快进程,每一步政府都派了 M 个工作人员来检查材料。不幸的是&…...
虚幻UE5手机安卓Android Studio开发设置2025
一、下载Android Studio历史版本 步骤1:虚幻4.27、5.0、5.1、5.2官方要求Andrd Studio 4.0版本; 5.3、5.4、5.5官方要求的版本为Android Studio Flamingo | 2022.2.1 Patch 2 May 24, 2023 虚幻官网查看对应Andrd Studiob下载版本: https:/…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...






