一个基于 Streamlit 框架、利用 Google Gemini API 和语义嵌入技术构建的实验性交互式对话管理与可视化系统。它旨在帮助用户更直观、高效地组织、理解和回顾复杂的多轮对话。
- 💬 智能对话分块与归属
- 系统根据消息内容与现有对话块的全局主题相似度及局部连续性相似度,智能地将用户和 AI 的消息归入最相关的对话块。
- 支持自定义相似度阈值(
low,high)。
- 🎯 多模式对话管理
- 自动模式: 根据相似度自动判断新消息所在上下文与归属的对话块。
- 专注模式: 将对话固定在某个特定对话块,后续消息都将添加到该块。
- 一次性目标模式: 临时指定下一条消息的归属块,之后恢复自动模式。
- 上下文“画笔”模式: 允许用户选择多个对话块作为 LLM 提问的额外上下文,实现跨话题引用。
- 🚀 富文本LLM交互
- 集成 Google Gemini API (
gemini-2.0-flash模型) 进行自然语言生成。 - 支持多轮对话历史作为 LLM 上下文。
- 集成 Google Gemini API (
- 📊 可视化对话结构
- 图形视图: 使用 Matplotlib 渲染对话块的容器视图,以彩色矩形展示各个块,并包含其内部消息摘要,清晰展示对话结构。
- 时间线视图: 以聊天气泡样式按时间顺序展示所有消息,并根据所属对话块进行颜色高亮。
- 支持中文字体显示优化。
- 🛠️ 高级对话块操作
- 合并对话块: 将两个或多个语义相似的对话块合并为一个新块,简化管理。
- 重命名对话块: 为对话块提供更具描述性的自定义名称或由 LLM 自动生成总结标题。
- 搜索对话块: 通过语义搜索快速定位与查询相关的对话块。
- 消息移动与删除: 灵活调整单条消息的归属块或将其删除。
- 自动总结: 调用 LLM 为指定对话块生成简短概括性的标题。
- 💾 持久化状态管理
- 利用 Streamlit 的
session_state持久化管理所有对话消息、对话块及其状态,确保应用刷新或重载时数据不丢失。
- 利用 Streamlit 的
- ✨ 现代化用户界面
- 基于 Streamlit 框架,提供响应式、交互性强的 Web 界面。
- 自定义 CSS 样式,优化按钮点击效果和聊天气泡视觉。
├── packages/ # 核心数据结构和逻辑
│ ├── dataclasses.py # 核心数据类 (Message, DialogueBlock, ConversationSession)
│ ├── LLM.py # Google Gemini API 封装
│ └── metabot.py # MetaBot 核心逻辑 (消息处理, 块归属, LLM 调用, 块操作)
├── ui/ # Streamlit 用户界面组件
│ ├── app_controller.py # 主应用控制器,协调所有 UI 组件
│ ├── block_manager.py # 对话块管理界面 (搜索, 列出, 操作块)
│ ├── chat_interface.py # 聊天界面 (消息渲染, 输入处理, 状态栏)
│ ├── dialogue_visualizer.py # 对话结构可视化 (Matplotlib 图表)
│ ├── session_manager.py # Streamlit Session State 统一管理
│ └── styles.py # 自定义 CSS 样式注入
├── main.py # 应用入口文件
├── requirements.txt # Python 依赖列表
├── README.md # 项目说明
└── LICENSE # 项目许可证
- Python 3.9+
- 有效的网络连接 (调用 Google Gemini API)
在你的项目根目录下,安装所有必需的 Python 库:
pip install -r requirements.txt你需要设置 Google Gemini API Key:
Windows (PowerShell):
$env:GOOGLE_API_KEY="YOUR_GEMINI_API_KEY_HERE"Linux/Mac:
export GOOGLE_API_KEY="YOUR_GEMINI_API_KEY_HERE"请将 YOUR_GEMINI_API_KEY_HERE 替换为你在 Google AI Studio 获取的 API Key。
在项目根目录下执行以下命令来启动 Streamlit 应用:
streamlit run main.py应用将会在你的浏览器中自动打开。
- 输入消息: 在底部的输入框中输入你的问题或回复。
- 状态栏: 关注输入框上方的状态栏,它会提示当前是“自动模式”、“专注模式”还是“一次性目标模式”,以及是否有“上下文画笔”激活。
- 消息操作: 每条消息旁边都有按钮,可以将其“移动”到其他对话块或“删除”。
- 新建对话块: 点击 "➕ 专注于新对话块" 按钮,创建一个新块并自动进入对其的“专注模式”。
- 搜索对话主题: 在搜索框中输入关键词,系统将根据语义相似度搜索并高亮相关对话块。
- 对话块列表:
- 每个对话块都显示其名称/摘要、消息数量和ID。
- ✅ 复选框: 勾选后,该块将被纳入“上下文画笔”,其内容将作为你下次提问的额外上下文。
- 🎯 目标按钮: 点击后,你的下一条消息将被强制添加到此块(一次性目标模式)。
- 📌 专注按钮: 点击后,进入/退出对此块的“专注模式”,此后所有消息都将默认归入此块。
- 对话块详情 (点击展开)
- ID: 显示完整的块 ID。
- ✨ 生成总结: 调用 LLM 为此块生成一个简洁的标题/摘要。
- 重命名: 手动修改对话块的名称。
- 合并: 从下拉菜单选择另一个对话块,点击“Merge”将其合并到当前块。
- Graph View (图形视图): 展示对话块的层次和关联,每个块以彩色容器表示,内部包含消息摘要。
- Timeline View (时间线视图): 以传统聊天气泡形式按时间顺序显示所有消息,并根据所属块颜色高亮。
- Python 3.9+
- Streamlit: 构建交互式 Web 应用界面
- Google Gemini API (
google-generativeai): LLM 对话生成 - Sentence Transformers (
paraphrase-multilingual-MiniLM-L12-v2): 消息嵌入和语义相似度计算 - Scikit-learn:
cosine_similarity计算 - Matplotlib: 对话结构可视化
- NumPy: 嵌入向量操作
- UUID, Datetime: 唯一 ID 和时间戳生成
解决方案: 请确保按照“配置环境变量”步骤正确设置了 GOOGLE_API_KEY。
解决方案: 请运行 pip install -r requirements.txt 确保所有依赖库都已安装。
解决方案: dialogue_visualizer.py 中已尝试配置中文字体 (Arial Unicode MS, Microsoft YaHei 等)。如果仍有问题,请确保你的操作系统中安装了这些字体。
解决方案: 运行 streamlit run main.py 后,终端会显示一个本地 URL (例如 http://localhost:8501),你可以手动在浏览器中打开它。
欢迎提出 Issue 或 Pull Request 来改进此项目!