当前位置: 首页 > news >正文

克隆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

题目链接 头一回用不是正解的方法做出来&#xff0c;也是比较极限&#xff0c;直接说做法就是二分数位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不是线程安全的&#xff0c;主要有以下几个问题&#xff1a; ①、多线程下扩容会死循环。JDK1.7 中的 HashMap 使用的是头插法插入元素&#xff0c;在多线程的环境下&#xff0c;扩容的时候就有可能导致出现环形链表&#xff0c;造成死循环。 JDK 8 时已经修复了这个问…...

MFC 创建Ribbon样式窗口

然后点击下一步直到完成即可...

uv 安装包

是的&#xff0c;你可以使用 uv 来安装 Python 包。uv 是一个高性能的 Python 包安装器和解析器&#xff0c;由 astral.sh 团队开发&#xff0c;旨在替代 pip 和 pip-tools&#xff0c;提供更快的包安装体验。 ### 如何使用 uv 安装包 1. **安装 uv**&#xff1a; 如果你还…...

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 开发的图书管理系统&#xff0c;可用于 添加、编辑、删除和管理图书信息&#xff0c;适合前端开发者学习 前端交互设计、Axios 数据请求 以及 Bootstrap 样…...

基于OSAL的嵌入式裸机事件驱动框架——整体架构调度机制

参考B站up主【架构分析】嵌入式祼机事件驱动框架 感谢大佬分享 任务ID &#xff1a; TASK_XXX TASK_XXX 在系统中每个任务的ID是唯一的&#xff0c;范围是 0 to 0xFFFE&#xff0c;0xFFFF保留为SYS_TSK_INIT。 同时任务ID的大小也充当任务调度的优先级&#xff0c;ID越大&#…...

c++ string类 +底层模拟实现

提醒: 本片博客只是小编的听课笔记&#xff0c;介意勿看。 基础 包含在头文件<string>&#xff0c;才能使用string类似函数接口。 string常见构造类 string s1; cin>>s1;//无参构造 string s2(s1);//拷贝构造 string s1("jfksa");//传参构造 三种…...

六十分之三十七——一转眼、时光飞逝

一、目标 明确可落地&#xff0c;对于自身执行完成需要一定的努力才可以完成的 1.第三版分组、激励、立体化权限、智能设备、AIPPT做课 2.8本书 3.得到&#xff1a;头条、吴军来信2、卓克科技参考3 4.总结思考 二、计划 科学规律的&#xff0c;要结合番茄工作法、快速阅读、…...

Shell基础:中括号的使用

在Shell脚本中&#xff0c;中括号&#xff08;[ ... ] 和 [[ ... ]]&#xff09;是一种常见的条件测试结构。它们用于进行文件类型检查、值比较以及逻辑判断。通过了解它们的不同特点和用法&#xff0c;能够帮助你编写更加高效、安全且易读的脚本。本文将详细介绍Shell中单中括…...

《基于Scapy的综合性网络扫描与通信工具集解析》

在网络管理和安全评估中&#xff0c;网络扫描和通信是两个至关重要的环节。Python 的 Scapy 库因其强大的网络数据包处理能力&#xff0c;成为开发和实现这些功能的理想工具。本文将介绍一个基于 Scapy 编写的 Python 脚本&#xff0c;该脚本集成了 ARP 扫描、端口扫描以及 TCP…...

面经--C语言——sizeof和strlen,数组和链表,#include <>和 #include ““ #define 和typedef 内存对齐概述

文章目录 sizeof 和 strlen数组和链表总结 #include <>和 #include ""#define 和typedef内存对齐概述对齐规则示例&#xff1a;结构体的内存对齐分析&#xff1a; 内存对齐的常见规则&#xff1a;填充字节的计算对齐影响的实际例子 sizeof 和 strlen 特性size…...

使用 Kotlin 将 Vertx 和 Springboot 整合

本篇文章目的是将 Springboot 和 Vertx 进行简单整合。整合目的仅仅是为了整活&#xff0c;因为两个不同的东西整合在一起提升的性能并没有只使用 Vertx 性能高&#xff0c;因此追求高性能的话这是在我来说不推荐。而且他们不仅没有提高很多性能甚至增加了学习成本 一、整合流…...

线性回归算法-01

线性回归简介 学习目标 了解线性回归的应用场景知道线性回归的定义 1 线性回归应用场景 房价预测销售额度预测贷款额度预测 2 什么是线性回归 2.1 定义与公式 线性回归(Linear regression)是利用 回归方程(函数)对 一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模…...

洛谷 P1130 红牌 C语言

题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌。获得红牌的过程是相当复杂&#xff0c;一共包括 N 个步骤。每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件。为了加快进程&#xff0c;每一步政府都派了 M 个工作人员来检查材料。不幸的是&…...

虚幻UE5手机安卓Android Studio开发设置2025

一、下载Android Studio历史版本 步骤1&#xff1a;虚幻4.27、5.0、5.1、5.2官方要求Andrd Studio 4.0版本&#xff1b; 5.3、5.4、5.5官方要求的版本为Android Studio Flamingo | 2022.2.1 Patch 2 May 24, 2023 虚幻官网查看对应Andrd Studiob下载版本&#xff1a; https:/…...

别只盯着ChatGPT了!SpringAI工具调用帮你低成本打造专属‘AI员工’(避坑指南)

别只盯着ChatGPT了&#xff01;SpringAI工具调用帮你低成本打造专属‘AI员工’&#xff08;避坑指南&#xff09; 想象一下&#xff0c;你的电商团队每天要处理上百条"库存还有吗&#xff1f;"、"订单能改地址吗&#xff1f;"这样的重复咨询。客服人力成本…...

深入解析 vSphere 7 vMotion 迁移实战:从单中心到跨中心的无缝迁移策略

1. vMotion迁移的核心价值与场景定位 当你凌晨三点接到机房断电预警电话时&#xff0c;vMotion可能是你最想拥抱的技术。作为vSphere的"灵魂功能"之一&#xff0c;vMotion允许我们将运行中的虚拟机在不同主机间无缝迁移&#xff0c;就像给飞行中的飞机更换引擎——用…...

别再瞎调优先级了!STM32CubeMX配置FreeRTOS任务调度器的5个实战避坑点

别再瞎调优先级了&#xff01;STM32CubeMX配置FreeRTOS任务调度器的5个实战避坑点 刚接触FreeRTOS的嵌入式开发者&#xff0c;往往会在STM32CubeMX的图形化配置界面里迷失方向。那些看似简单的下拉菜单和复选框&#xff0c;背后却藏着让系统崩溃的陷阱。我曾见过一个工程师将任…...

nuScenes多传感器融合:毫米波雷达点云与图像时空对齐实战

1. 多传感器融合的核心挑战 自动驾驶系统就像一位全天候工作的司机&#xff0c;需要同时处理来自不同"感官"的信息。毫米波雷达擅长测距和测速&#xff0c;摄像头则能识别颜色和纹理&#xff0c;但要让它们像人类感官一样协同工作&#xff0c;首先要解决时空对齐的问…...

【回归儿童本位,重构专业底色】学前教育行业的深度思辨与价值坚守(二)

吕坤阳亲笔二、行业高质量发展的核心&#xff1a;回归儿童&#xff0c;摒弃功利化教育随着学前教育普惠政策的推进&#xff0c;行业规范化程度不断提升&#xff0c;但功利化、形式化的教育倾向依然存在&#xff0c;成为高质量发展的阻碍。部分幼儿园为迎合家长“抢跑”需求&…...

TrackingNet评估实战:从注册到结果解析

1. TrackingNet评估平台入门指南 第一次接触TrackingNet这个目标跟踪领域的权威评估平台时&#xff0c;我和大多数研究者一样有点懵。这个平台不像GitHub那样有直观的界面&#xff0c;操作流程也相对复杂。不过别担心&#xff0c;跟着我的实战经验走&#xff0c;保证你能少踩8…...

Ollama+Qwen2.5-VL搭建教程:打造你的智能视觉分析工具

OllamaQwen2.5-VL搭建教程&#xff1a;打造你的智能视觉分析工具 1. 引言&#xff1a;为什么选择Qwen2.5-VL 在当今AI技术快速发展的时代&#xff0c;视觉-语言多模态模型正成为解决复杂问题的关键工具。Qwen2.5-VL-7B-Instruct作为通义千问系列的最新成员&#xff0c;在视觉…...

MT5 Zero-Shot参数详解:Temperature与Top-P对中文改写多样性的影响

MT5 Zero-Shot参数详解&#xff1a;Temperature与Top-P对中文改写多样性的影响 1. 项目概述 MT5 Zero-Shot Chinese Text Augmentation 是一个基于 Streamlit 和阿里达摩院 mT5 模型构建的本地化 NLP 工具。这个工具专门用于中文句子的语义改写和数据增强&#xff0c;能够在保…...

广东省高级会计师评审辅导知名品牌

在职业发展的道路上&#xff0c;专业资格认证是许多财务从业者提升自我、拓宽职业路径的重要一环。广东省高级会计师评审&#xff0c;作为一项专业性强、要求严格的职业能力认定&#xff0c;其准备过程需要系统性的指导与支持。中山力朗教育咨询有限公司&#xff0c;作为一家立…...

基于WebRTC的P2P文件传输系统:架构设计与实现原理

基于WebRTC的P2P文件传输系统&#xff1a;架构设计与实现原理 【免费下载链接】filepizza :pizza: Peer-to-peer file transfers in your browser 项目地址: https://gitcode.com/GitHub_Trending/fi/filepizza 在当今数字时代&#xff0c;文件传输已成为日常工作和协作…...