在当今人工智能迅猛发展的时代,构建一个个人化的大模型问答助手不仅能够提高工作效率,还能为日常生活带来便利。本篇博客将详细解析如何使用Python和Streamlit框架,结合OpenAI的API,搭建一个类似于ChatGPT的问答系统。我们将分步骤介绍代码实现,同时确保敏感信息的安全性。
目录
项目概述
本项目旨在通过Python和Streamlit框架,结合OpenAI的API,构建一个个人化的问答助手。该助手允许用户选择不同的语言模型,与之进行对话,同时管理聊天历史记录,实现保存、加载、备份和删除功能。通过这一项目,用户可以体验到类似于ChatGPT的对话体验,并根据需求进行定制。
环境准备
在开始编码之前,确保你的开发环境中已经安装了以下软件和库:
- Python 3.7+
- Streamlit:用于构建Web应用的框架。
- OpenAI Python SDK:用于与OpenAI的API进行交互。
- 其他辅助库:如
json
,os
,glob
,re
,shutil
等。
可以使用以下命令安装必要的库:
pip install streamlit openai
代码实现详解
下面,我们将对整个代码进行逐段详细解析,帮助读者深入理解每一部分的功能与实现。
导入必要的库
from openai import OpenAI
import streamlit as st
import json
import os
import glob
import re
import shutil # 用于文件移动
解析:
这些库为项目提供了必要的功能支持:
- openai:与OpenAI API交互。
- streamlit:构建用户界面。
- json:处理JSON数据格式。
- os, glob, re, shutil:文件和目录管理。
API密钥与模型配置
# 示例:模型和相应的 API 密钥
default_key = "sk-***" # 默认令牌
sale_key = "sk-***" # 自定义默认1.0
guan_key = "sk-***" # 管转令牌3倍
az_key = "sk-***" # 纯AZ,1.5倍
claude_key = "sk-***" # claude 8倍
guan5_key = "sk-***" # 管转令牌5倍
model_keys = {
"gpt-4o-mini-2024-07-18": az_key, #1.5
"o1-mini": guan5_key, #3
"gpt-4o-2024-08-06": az_key,
"claude-3-5-sonnet-20240620": claude_key
}
解析:
- API密钥管理:为不同的模型配置不同的API密钥,以实现对不同服务的调用和控制。
- 模型选择:通过
model_keys
字典,将模型名称与对应的API密钥关联,方便用户在界面上选择。
安全建议:
将API密钥硬编码在代码中存在安全风险。建议使用环境变量或配置文件来存储这些密钥,并在代码中通过读取环境变量的方式获取,以避免泄露风险。
界面构建
st.title("ChatGPT-like Clone")
selected_model = st.sidebar.selectbox("选择模型", list(model_keys.keys()))
api_key = model_keys[selected_model]
api_url = "https://api.manyi88.top/v1" #ManyiAPI聚合接口站:https://api.manyi88.top
client = OpenAI(api_key=api_key, base_url=api_url)
解析:
- 标题设置:通过
st.title
函数设置应用的标题。 - 模型选择:在侧边栏提供一个下拉菜单,用户可以选择不同的模型。
- API客户端初始化:根据用户选择的模型,获取对应的API密钥和API URL,初始化OpenAI客户端。
数据管理
data_dir = "data"
backup_dir = "data_bak"
if not os.path.exists(data_dir):
os.makedirs(data_dir)
if not os.path.exists(backup_dir):
os.makedirs(backup_dir)
解析:
- 数据目录:
data_dir
用于存储聊天记录。 - 备份目录:
backup_dir
用于备份历史聊天记录。 - 目录检查与创建:如果目录不存在,自动创建,确保文件操作的顺利进行。
会话ID管理
session_id_file = os.path.join(data_dir, "session_id.txt")
def load_session_id():
if os.path.exists(session_id_file):
with open(session_id_file, "r") as f:
return