Python桌面软件接入Deepseek

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
```


### 前言

在上一篇文章中,我们详细介绍了如何通过Python调用DeepSeek API实现基础对话功能。本篇文章将在此基础上更进一步,探讨如何将这些底层功能优雅地封装成用户友好的桌面应用程序。

将AI能力集成到终端应用有多种实现路径:
- **桌面应用程序**(本文重点)
- 微信小程序/公众号
- Web应用
- 移动端APP

通过PyQt框架,我们可以快速构建跨平台桌面应用。本文将以一个简单的文章润色工具为例(效果如图1所示),分享关键技术实现方案,希望能为大家的开发工作提供参考。

先放一张效果展示图:
![Pasted image 20250421164741.png|500](https://hello-jimmy.oss-cn-beijing.aliyuncs.com/20250421170929.jpg)

### 技术细节

#### 1、python调用deepseek
参考前文实现,我们首先构建一个稳定的API通信模块。关键代码(建议封装为独立类):

```python
from openai import OpenAI

client = OpenAI(api_key="这里请填入你的API keys", base_url="https://api.siliconflow.cn/v1")

response = client.chat.completions.create(
model="deepseek-ai/DeepSeek-V3",
messages=[
{"role": "system", "content": "You are a helpful assistant"},
{"role": "user", "content": "Hello"},
],
stream=False
)

print(response.choices[0].message.content)

这里只要把 response.choices[0].message.content取出来存入一个变量就可以了。
建议对返回内容做规范化处理:

  • 敏感信息过滤
  • 响应超时设置(建议10-15秒)
  • 错误重试机制
  • 内容长度截断(避免UI显示异常)

2、如何接入Pyqt程序

把第一步的代码封装成一个function,然后再Pyqt类里面调用即可。
但是呢,这样也会存在响应速度的问题,因为直接调用的话,界面会假死。
(下一章节会介绍如何解决这个问题)
言归正传,第一步中的 response.choices[0].message.content,可以按照下面的代码显示到界面UI上:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def add_left_aligned_text(self, text):
# 获取当前内容
current_content = self.ui.textEdit_main.toHtml()
# 添加靠右显示的文本
left_aligned_text = f'<div style="text-align: left;">{text}</div>'
# 更新 QTextEdit 的内容
self.ui.textEdit_main.setHtml(current_content + left_aligned_text)

def add_right_aligned_text(self, text):
# 获取当前内容
current_content = self.ui.textEdit_main.toHtml()
# 添加靠右显示的文本
right_aligned_text = f'<div style="text-align: right;">{text}</div>'
# 更新 QTextEdit 的内容
self.ui.textEdit_main.setHtml(current_content + right_aligned_text)

上面的两个function可以把deepseek返回的内容显示到UI上。
可以实现用户输入内容靠右显示,AI返回的内容靠左显示。
Pasted image 20250421165519.png
当然,你也可以设置pyqt显示markdown格式的文本,用这个function即可:

1
2
3
4
5
6
# 获取当前内容(转换为 Markdown 格式)
current_content = self.ui.textEdit_main.toMarkdown()

# 拼接新内容
updated_content = current_content + "\n" + "[AI]:\n%s"%data
self.ui.textEdit_main.setMarkdown(updated_content)

markdown 显示的效果会更好,有兴趣的小伙伴可以试试哦。

3、优化界面响应

如上一章节所说,deepseek是有响应速度,如果返回内容文本数量较多,你可能要等更久,这时候软件界面就会进入假死的状态。
如果此时用户去操作软件界面UI ,那么就会出现 未响应。如何解决这个问题呢?
答案是:多线程
这里分享一下本文中的多线程处理代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

class thread1(QThread):
sendData = pyqtSignal(str)
sendAI_article = pyqtSignal(str)
def __init__(self,input_=""):
QThread.__init__(self)
self.input = input_
self.is_article = False

def __del__(self):
self.wait()

def run(self):
try:

feedback = self.ai(self.input)
if self.is_article:
self.sendAI_article.emit(feedback)
else:
self.sendData.emit(feedback)

except Exception as e:
print("%s---%s" % (sys._getframe().f_lineno,e))

def ai(self,content):
client = OpenAI(api_key="sk-xxxx", base_url="https://api.siliconflow.cn/v1")
response = client.chat.completions.create(
model="deepseek-ai/DeepSeek-V3",
messages=[
{
"role": "user",
"content": "%s"%(content)
}
],
stream=False
)
feedback = response.choices[0].message.content
return feedback

用多线程去处理跟Deepseek沟通,用主程序的现成去显示UI,这样互不打扰,不会出现假死状态。
开发建议:

  1. 对话历史长度限制:建议保留最近20-30条对话
  2. 大文件分块处理:对于长文本润色,采用分块请求策略
  3. 资源释放:窗口关闭时确保线程终止

扩展方向建议

基于此框架,可以进一步扩展:

  1. 插件系统

    • 预设Prompt模板
    • 领域知识库集成
    • 第三方API联动
  2. 企业级功能

    • 用户认证系统
    • 使用情况分析
    • 团队协作功能
  3. 性能提升

    • 本地缓存系统
    • 请求批处理
    • 模型微调接口

总结

本文展示了将DeepSeek AI集成到桌面应用的完整流程。从基础API调用到界面优化,再到性能保障,每一步都需要精心设计。这个范例应用虽然简单,但已具备核心功能架构,读者可以根据实际需求进行扩展开发。建议在开发过程中特别注意:

  • 用户隐私保护
  • 异常处理机制
  • 国际化支持
  • 无障碍访问

欢迎大家留言分享自己的开发经验和创新想法。期待看到更多有趣的应用场景!