克隆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"])    # 获取键对应的值

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用 HTML、CSS 和 JavaScript 实现抽奖转盘效果

顺序抽奖 前言 这段代码实现了一个简单的抽奖转盘效果。页面上有一个九宫格布局的抽奖区域,周围八个格子分别放置了不同的奖品名称,中间是一个 “开始抽奖” 的按钮。点击按钮后,抽奖区域的格子会快速滚动,颜色不断变化&#xf…

【Linux】使用管道实现一个简易版本的进程池

文章目录 使用管道实现一个简易版本的进程池流程图代码makefileTask.hppProcessPool.cc 程序流程: 使用管道实现一个简易版本的进程池 流程图 代码 makefile ProcessPool:ProcessPool.ccg -o $ $^ -g -stdc11 .PHONY:clean clean:rm -f ProcessPoolTask.hpp #pr…

Elasticsearch的索引生命周期管理

目录 说明零、参考一、ILM的基本概念二、ILM的实践步骤Elasticsearch ILM策略中的“最小年龄”是如何计算的?如何监控和调整Elasticsearch ILM策略的性能? 1. **监控性能**使用/_cat/thread_pool API基本请求格式请求特定线程池的信息响应内容 2. **调整…

MQTT知识

MQTT协议 MQTT 是一种基于发布/订阅模式的轻量级消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用而设计,可以用极少的代码为联网设备提供实时可靠的消息服务。MQTT 协议广泛应用于物联网、移动互联网、智能硬件、车联网、智慧城市、远程医疗、…

LabVIEW如何高频采集温度数据?

在LabVIEW中进行高频温度数据采集时,选择合适的传感器(如热电偶或热电阻)和采集硬件是关键。下面是一些建议,帮助实现高效的温度数据采集: 1. 传感器选择: 热电偶(Thermocouple)&am…

前端 | 深入理解Promise

1. 引言 JavaScript 是一种单线程语言,这意味着它一次仅能执行一个任务。为了处理异步操作,JavaScript 提供了回调函数,但是随着项目处理并发任务的增加,回调地狱 (Callback Hell) 使异步代码很难维护。为此,ES6带来了…

gesp(C++六级)(10)洛谷:P10722:[GESP202406 六级] 二叉树

gesp(C六级)(10)洛谷:P10722:[GESP202406 六级] 二叉树 题目描述 小杨有⼀棵包含 n n n 个节点的二叉树,且根节点的编号为 1 1 1。这棵二叉树任意⼀个节点要么是白色,要么是黑色。之后小杨会对这棵二叉树…

【UE】 APlayerState

APlayerState 定义和功能 APlayerState用于保存关于游戏玩家状态的信息,例如得分、玩家名称和其他统计数据。这些信息通常在多人游戏中被用来持续跟踪玩家的表现。设计理念 APlayerState的目的是提供一个存储和传输玩家特定信息的方法,这样即使玩家的控…

如何用微信小程序写春联

​ 生活没有模板,只需心灯一盏。 如果笑能让你释然,那就开怀一笑;如果哭能让你减压,那就让泪水流下来。如果沉默是金,那就不用解释;如果放下能更好地前行,就别再扛着。 一、引入 Vant UI 1、通过 npm 安装 npm i @vant/weapp -S --production​​ 2、修改 app.json …

C# Winform enter键怎么去关联button

1.关联按钮上的Key事件按钮上的keypress,keydown,keyup事件随便一个即可private void textBox1_KeyDown(object sender, KeyEventArgs e){if (e.KeyCode Keys.Enter){this.textBox2.Focus();}}2.窗体上的事件private void textBox2_KeyPress(object sen…

FPGA 使用 CLOCK_DEDICATED_ROUTE 约束

使用 CLOCK_DEDICATED_ROUTE 约束 CLOCK_DEDICATED_ROUTE 约束通常在从一个时钟区域中的时钟缓存驱动到另一个时钟区域中的 MMCM 或 PLL 时使 用。默认情况下, CLOCK_DEDICATED_ROUTE 约束设置为 TRUE ,并且缓存 /MMCM 或 PLL 对必须布局在相同…

Ollama+OpenWebUI部署本地大模型

OllamaOpenWebUI部署本地大模型 前言 Ollama是一个强大且易于使用的本地大模型推理框架,它专注于简化和优化大型语言模型(LLMs)在本地环境中的部署、管理和推理工作流。可以将Ollama理解为一个大模型推理框架的后端服务。 Ollama Ollama安…

SpringBoot 整合 SpringMVC:SpringMVC的注解管理

分类&#xff1a; 中央转发器(DispatcherServlet)控制器视图解析器静态资源访问消息转化器格式化静态资源管理 中央转发器&#xff1a; 中央转发器被 SpringBoot 自动接管&#xff0c;不需要我们在 web.xml 中配置&#xff1a; <servlet><servlet-name>chapter2&l…

Zemax 中带有体素探测器的激光谐振腔

激光谐振腔是激光系统的基本组成部分&#xff0c;在光的放大和相干激光辐射的产生中起着至关重要的作用。 激光腔由两个放置在光学谐振器两端的镜子组成。一个镜子反射率高&#xff08;后镜&#xff09;&#xff0c;而另一个镜子部分透明&#xff08;输出耦合器&#xff09;。…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.5 高级索引应用:图像处理中的区域提取

2.5 高级索引应用&#xff1a;图像处理中的区域提取 目录/提纲 #mermaid-svg-BI09xc20YqcpUam7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BI09xc20YqcpUam7 .error-icon{fill:#552222;}#mermaid-svg-BI09xc20…

[免费]微信小程序智能商城系统(uniapp+Springboot后端+vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序智能商城系统(uniappSpringboot后端vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序智能商城系统(uniappSpringboot后端vue管理端) Java毕业设计_哔哩哔哩_bilibili 项目介绍…

本地部署DeepSeek-R1保姆级教程

近期&#xff0c;我国一款开源模型 DeepSeek-R1以低成本和高性能震撼了全球科技界。该模型的开源性使开发者能够在本地环境中部署和运行&#xff0c;提供了更高的灵活性和控制力。如果你也想在本地部署 DeepSeek-R1&#xff0c;可以参考以下完整的教程&#xff0c;涵盖Mac 版本…

仿真设计|基于51单片机的贪吃蛇游戏

目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现&#xff08;protues8.7&#xff09; 程序&#xff08;Keil5&#xff09; 全部内容 资料获取 具体实现功能 利用单片机8*8点阵实现贪吃蛇游戏的控制。 仿真演示视频&#xff1a; 51-基于51单片机的贪吃蛇游…

【4Day创客实践入门教程】Day2 探秘微控制器——单片机与MicroPython初步

Day2 探秘微控制器——单片机与MicroPython初步 目录 Day2 探秘微控制器——单片机与MicroPython初步MicroPython语言基础开始基础语法注释与输出变量模块与函数 单片机基础后记 Day0 创想启程——课程与项目预览Day1 工具箱构建——开发环境的构建Day2 探秘微控制器——单片机…

ubuntu 下使用deepseek

安装Ollama sudo snap install ollama 执行 ollama run deepseek-coder 然后进行等待。。。