221 lines
7.2 KiB
Markdown
221 lines
7.2 KiB
Markdown
# 🎭 AI 角色扮演聊天室
|
||
|
||
一个基于 DeepSeek API + Streamlit 构建的角色扮演聊天应用,支持多种预设角色和自定义角色创建。
|
||
|
||

|
||

|
||

|
||
|
||
## ✨ 功能特性
|
||
|
||
- 🎭 **多种预设角色**:傲娇猫娘、智慧老者、毒舌AI、科学怪人等
|
||
- ✨ **自定义角色**:创建你想象中的任何角色
|
||
- 💬 **多轮对话**:保留对话历史,角色会记住上下文
|
||
- ⚡ **流式输出**:打字机效果,实时显示 AI 回复
|
||
- 🎨 **美观界面**:精心设计的 UI,渐变色彩和动画效果
|
||
|
||
## 🖼️ 界面预览
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 🎭 角色设置 │ 🎭 AI 角色扮演聊天室 │
|
||
│ ───────────── │ ───────────────────── │
|
||
│ 🔑 API 配置 │ │
|
||
│ [DeepSeek API Key] │ 🐱 │
|
||
│ ───────────── │ 正在与 小喵 对话 │
|
||
│ 🎭 选择角色 │ │
|
||
│ [🐱 傲娇猫娘 ▼] │ ──────────────────────────── │
|
||
│ │ │
|
||
│ ┌─────────────────┐ │ 👤: 你好呀! │
|
||
│ │ 🐱 小喵 │ │ │
|
||
│ │ 你是一个傲娇的 │ │ 🐱: 哼,才不是特意来跟你打招 │
|
||
│ │ 猫娘... │ │ 呼的呢!...喵~ (。・ω・。) │
|
||
│ └─────────────────┘ │ │
|
||
│ │ ──────────────────────────── │
|
||
│ [🗑️ 清空对话历史] │ [输入你想说的话... ] │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
## 🚀 快速开始
|
||
|
||
### 1. 克隆/下载项目
|
||
|
||
```bash
|
||
cd 示例项目-角色扮演聊天室
|
||
```
|
||
|
||
### 2. 创建虚拟环境(推荐)
|
||
|
||
```bash
|
||
python -m venv venv
|
||
|
||
# Windows
|
||
venv\Scripts\activate
|
||
|
||
# macOS/Linux
|
||
source venv/bin/activate
|
||
```
|
||
|
||
### 3. 安装依赖
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
### 4. 配置 API Key
|
||
|
||
复制环境变量示例文件:
|
||
|
||
```bash
|
||
cp .env.example .env
|
||
```
|
||
|
||
编辑 `.env` 文件,填入你的 DeepSeek API Key:
|
||
|
||
```
|
||
DEEPSEEK_API_KEY=sk-your-actual-api-key
|
||
```
|
||
|
||
> 💡 **获取 API Key**:访问 [DeepSeek 开放平台](https://platform.deepseek.com),注册账号后在控制台创建。
|
||
|
||
### 5. 运行应用
|
||
|
||
```bash
|
||
streamlit run app.py
|
||
```
|
||
|
||
应用将在浏览器中自动打开,默认地址:http://localhost:8501
|
||
|
||
## 📁 项目结构
|
||
|
||
```
|
||
示例项目-角色扮演聊天室/
|
||
├── app.py # 主程序
|
||
├── requirements.txt # 项目依赖
|
||
├── .env.example # 环境变量示例
|
||
├── .env # 环境变量(需自行创建,不要提交!)
|
||
├── .gitignore # Git 忽略文件
|
||
└── README.md # 项目说明
|
||
```
|
||
|
||
## 🎭 预设角色介绍
|
||
|
||
| 角色 | 名称 | 特点 |
|
||
|:---:|:---|:---|
|
||
| 🐱 | 傲娇猫娘·小喵 | 傲娇但可爱,句尾带"喵~",会用颜文字 |
|
||
| 🧙 | 智慧老者·玄清子 | 富有哲理,喜欢引用古诗词 |
|
||
| 🤖 | 毒舌AI·犀利哥 | 说话犀利一针见血,但有建设性 |
|
||
| 👨🔬 | 科学怪人·Dr.Eureka | 疯狂科学家,热衷科学分析 |
|
||
| 🎮 | 游戏解说·电竞小王 | 充满激情,使用游戏术语 |
|
||
| 📚 | 文艺青年·林小诗 | 说话有诗意,会即兴创作 |
|
||
|
||
## 🛠️ 技术实现
|
||
|
||
### 核心技术点
|
||
|
||
1. **DeepSeek API 调用**
|
||
- 使用 OpenAI SDK 兼容接口
|
||
- 流式输出(Streaming)实现打字机效果
|
||
|
||
2. **Streamlit 组件**
|
||
- `st.chat_message` - 聊天消息展示
|
||
- `st.chat_input` - 聊天输入框
|
||
- `st.session_state` - 对话历史管理
|
||
- `st.write_stream` - 流式输出渲染
|
||
|
||
3. **角色扮演机制**
|
||
- System Prompt 定义角色性格和说话方式
|
||
- 多轮对话保持角色一致性
|
||
|
||
### 关键代码解析
|
||
|
||
#### 流式输出实现
|
||
|
||
```python
|
||
stream = client.chat.completions.create(
|
||
model=MODEL,
|
||
messages=messages_for_api,
|
||
stream=True, # 启用流式输出
|
||
)
|
||
|
||
response = st.write_stream(
|
||
chunk.choices[0].delta.content or ""
|
||
for chunk in stream
|
||
if chunk.choices[0].delta.content
|
||
)
|
||
```
|
||
|
||
#### 对话历史管理
|
||
|
||
```python
|
||
# 初始化
|
||
if "messages" not in st.session_state:
|
||
st.session_state.messages = []
|
||
|
||
# 添加消息
|
||
st.session_state.messages.append({"role": "user", "content": prompt})
|
||
|
||
# 构建 API 请求
|
||
messages_for_api = [
|
||
{"role": "system", "content": system_prompt} # 角色设定
|
||
] + st.session_state.messages # 历史消息
|
||
```
|
||
|
||
## 🎨 自定义角色指南
|
||
|
||
创建一个好的自定义角色,需要在角色设定中包含:
|
||
|
||
1. **身份定义**:角色是谁,背景是什么
|
||
2. **性格特点**:外向/内向、温柔/严厉等
|
||
3. **说话方式**:口癖、常用词、语气
|
||
4. **对用户态度**:如何称呼用户,关系定位
|
||
5. **特殊行为**:是否使用emoji、颜文字等
|
||
|
||
### 示例:创建一个"中二少年"角色
|
||
|
||
```
|
||
你是一个中二病少年,自称"黑暗骑士·雷恩"。你的特点:
|
||
- 认为自己拥有被封印的黑暗力量
|
||
- 经常用"我的右手又在疼了..."这样的台词
|
||
- 说话夸张,喜欢用"区区凡人"称呼用户
|
||
- 会假装痛苦地按住眼睛说"黑暗之眼快要觉醒了"
|
||
- 其实很好说话,问什么都会认真回答(虽然用中二的方式)
|
||
```
|
||
|
||
## 📝 开发心得
|
||
|
||
这个项目使用 **Vibe Coding** 方式开发,主要通过自然语言描述需求,让 AI 代码编辑器生成代码。
|
||
|
||
**开发过程中的 Prompt 示例:**
|
||
|
||
> "帮我创建一个角色扮演聊天应用,使用 DeepSeek API 和 Streamlit。
|
||
> 要求:左侧边栏选择角色,支持自定义角色,聊天界面要美观,
|
||
> 使用流式输出,要保存对话历史。"
|
||
|
||
**迭代优化:**
|
||
|
||
> "给界面加上渐变色效果,让角色卡片更好看一些"
|
||
|
||
> "添加一个清空对话的按钮"
|
||
|
||
## ⚠️ 注意事项
|
||
|
||
1. **保护 API Key**:不要将 `.env` 文件提交到代码仓库
|
||
2. **控制成本**:DeepSeek API 按 Token 计费,长对话会消耗更多 Token
|
||
3. **角色设定**:过长的 System Prompt 会增加每次请求的成本
|
||
|
||
## 📚 参考资料
|
||
|
||
- [DeepSeek API 文档](https://platform.deepseek.com/api-docs)
|
||
- [Streamlit 官方文档](https://docs.streamlit.io)
|
||
- [OpenAI Python SDK](https://github.com/openai/openai-python)
|
||
|
||
## 👤 作者
|
||
|
||
Python 程序设计课程设计 - 示例项目
|
||
|
||
---
|
||
|
||
**Happy Vibe Coding! 🚀**
|
||
|