DeepSeek-WeChat: 微信风格的本地AI聊天应用实现文档


项目概述
DeepSeek-WeChat是一个基于PySide6开发的桌面聊天应用,具有类似微信的用户界面风格,集成了Ollama本地AI模型服务。该应用支持创建多个对话、动态头像生成、消息气泡显示等功能,为用户提供流畅的本地AI对话体验。
技术架构
核心技术栈
Python 3.7+: 编程语言
PySide6: GUI框架,用于构建桌面应用界面
Ollama: 本地AI模型服务,提供模型推理能力
Requests: HTTP客户端库,用于与Ollama API通信
项目结构
plaintext
deepseek_wechat_app.py
├── 常量定义
├── 枚举类型
├── OllamaWorker (QThread)
├── ContactItem (QWidget)
├── MessageBubble (QWidget)
└── ChatWindow (QMainWindow)
核心功能实现
1. 联系人管理
联系人列表项 (ContactItem)
python
class ContactItem(QWidget):
"""联系人列表项"""
clicked = Signal(str)
rename_requested = Signal(str)
delete_requested = Signal(str)
signature_requested = Signal(str)
主要特性:
动态圆形头像生成,使用QPainter绘制带字母标识的头像
支持右键菜单进行重命名、删除和设置个性签名
显示最后一条消息摘要
选中状态高亮显示
头像生成算法
python
def create_circular_avatar(self, color, size, text=""):
"""创建带字母的圆形头像"""
pixmap = QPixmap(size, size)
pixmap.fill(Qt.GlobalColor.transparent)
painter = QPainter(pixmap)
painter.setRenderHint(QPainter.RenderHint.Antialiasing)
painter.setPen(Qt.PenStyle.NoPen)
painter.setBrush(QBrush(color))
painter.drawEllipse(0, 0, size, size)
# 绘制字母
if text:
painter.setPen(QColor(255, 255, 255)) # 白色文字
font = QFont("Microsoft YaHei", size // 2 - 2, QFont.Weight.Bold)
painter.setFont(font)
painter.drawText(pixmap.rect(), Qt.AlignmentFlag.AlignCenter, text)
painter.end()
return pixmap
2. 消息气泡系统
消息气泡组件 (MessageBubble)
python
class MessageBubble(QWidget):
"""消息气泡"""
布局策略:
接收方消息: 头像 + 气泡 (左对齐)
发送方消息: 气泡 + 头像 (右对齐)
使用QHBoxLayout.Direction.RightToLeft确保发送方消息紧贴右侧头像
样式特点:
圆角气泡设计
微信绿发送气泡 (#4CAF50)
白色接收气泡
时间戳居中显示
3. Ollama集成
异步工作线程 (OllamaWorker)
python
class OllamaWorker(QThread):
"""Ollama API工作线程"""
response_received = Signal(str)
error_occurred = Signal(str)
token_received = Signal(str) # 实时传输token
流式响应处理:
**
python
# 启用流式传输
data = {
"model": self.model,
"messages": self.messages,
"stream": True
}
**
实时处理响应token
for line in response.iter_lines():
if line:
decoded_line = line.decode(‘utf-8’)
json_data = json.loads(decoded_line)
if ‘message’ in json_data and ‘content’ in json_data[‘message’]:
content = json_data[‘message’][‘content’]
full_response += content
self.token_received.emit(full_response)
4. 对话管理
新增对话功能
点击”+ 新增对话”按钮创建新对话
自动生成基于对话名称首字的头像标识
支持对话重命名和删除
保存对话历史记录
对话历史显示
显示最后一条消息摘要
时间戳显示
个性签名展示
UI/UX设计
界面布局
左侧联系人面板 (240px)
搜索框
新增对话按钮
联系人列表
中间聊天区域 (自适应)
聊天标题栏
消息显示区域
输入框和发送按钮
右侧资料面板 (280px)
用户头像
名称和备注
个性签名
模型信息
主题支持
浅色主题 (默认)
深色主题 (可切换)
微信风格配色方案
核心算法
1. 动态头像生成
python
# 根据联系人类型生成不同颜色头像
if self.name == "DeepSeek AI":
color = QColor(76, 175, 80) # 微信绿
text = "D"
elif "对话" in self.name or self.contact_id.startswith("conv_"):
hash_val = hash(self.contact_id) % 360
color = QColor.fromHsv(hash_val, 200, 200)
text = self.name[0] if self.name else ""
2. 消息气泡自适应大小
python
bubble_label.setMaximumWidth(MSG_BUBBLE_MAX_WIDTH) # 480px
bubble_label.setWordWrap(True)
bubble_label.setSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Minimum)
3. 流式响应更新
python
def update_ai_response(self, response):
"""实时更新AI响应显示"""
# 更新最后一条消息的内容而不是添加新消息
if self.chat_history and self.chat_history[-1]["role"] == "assistant":
self.chat_history[-1]["content"] = response
else:
# 如果没有最后一条消息,添加新的临时消息
self.chat_history.append({
"role": "assistant",
"content": response
})
部署与运行
环境要求
Python 3.10+
Ollama服务 (默认端口11434)
依赖包:
plaintext
pip install PySide6 requests
运行步骤
启动Ollama服务
拉取所需模型:
plaintext
ollama pull deepseek-r1:7b
运行应用:
plaintext
python deepseek_wechat_app.py
扩展功能
1. 模型管理
支持多种Ollama模型
模型信息显示
对话级别模型切换
2. 个性化设置
对话重命名
个性签名设置
备注显示
3. 用户体验优化
Shift+Enter换行
Enter发送消息
自动滚动到底部
消息选择和复制
性能优化
1. 内存管理
使用deleteLater()正确释放QWidget资源
及时清理布局中的子项
2. UI响应性
异步处理Ollama API调用
流式显示AI响应
非阻塞界面操作
3. 网络优化
HTTP连接复用
流式传输减少延迟
错误重试机制
总结
DeepSeek-WeChat通过结合PySide6的GUI能力和Ollama的本地AI模型服务,为用户提供了一个功能完整、界面美观的本地AI聊天应用。其微信风格的界面设计和流畅的交互体验,使得与AI的对话更加自然和直观。项目采用模块化设计,易于扩展和维护,为本地AI应用开发提供了良好的参考范例。

