AI语言模型的创建(通义千问)


前言

上一篇文章记录了我对通义千问api模型调用的学习,在上篇文章的基础上,我设计了一个简易的ai交流界面,该文章记录了我设计此界面的思路与学习过程,该设计较为简单,感兴趣的同学可以尝试并在此基础上改进。


一、安装所需要的工具(安装库)

1.确保依赖安装

首先,确保你已经安装了 PyQt5 库,可以使用以下命令进行安装:

pip install PyQt5

具体安装方法在之前的文章中,具体见pyqt5入门笔记

2.界面设计工具安装

需要安装QtDesigner和PyUic两个工具,以此来对交流界面进行设计,安装步骤在之前也介绍过,大家自行查询

3.虚拟环境的配置

一般在之前下载pycharm的时候我们在环境配置上进行了学习,但是按之前的方法,我在之后的设计中出现了问题,有多种原因导致,比如版本不匹配,工具安装丢失,问了我的学长后,我下载了Anaconda,在这里进行了环境的配置,该软件也包含了多个版本的python为大家提供安装使用,该方法在下面链接的文章中
Anaconda安装

二、ai交流界面的制作

1.使用Qt Designer设计界面

这里我们要用到之前下载好的工具QtDesigner,用它来设计界面
打开Qt Designer工具,选择一个合适的窗口模板(比如 Main Window )作为基础。

在窗口中添加以下控件:

  • 输入框(QLineEdit):用于输入向AI提问的问题,可适当调整其大小、位置,并设置一个合适的对象名称

  • 按钮(QPushButton):用来触发提问操作,设置显示的文本(如 提问 ),同样设置好对象名称

  • 文本展示框(QTextBrowser或QPlainTextEdit等):用于展示通义千问返回的回答内容,设置好合适的大小和位置

通过布局管理器(如水平布局、垂直布局等)对这些控件进行合理布局,让界面看起来更规整,然后保存该界面设计文件,保存类型选择 .ui 格式,比如保存为 uii.ui 。
大致界面如下
在这里插入图片描述

2.将.ui文件转换为.py文件

这里我们运用之前下载好的PyUic工具将文件转化

三.交流程序的设计

以下是我所设计程序的详细讲解(仅供参考):

整体结构与功能概述

这段代码实现了一个基于 PyQt5 的图形用户界面(GUI)应用程序,该程序能够与通义千问的模型进行交互。用户可以在界面的输入框中输入问题,点击按钮后,程序会调用通义千问模型获取回答,并将回答显示在界面的文本框中。

1.导入模块

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from ui_main import Ui_MainWindow
import dashscope
from dashscope import Generation
  • import sys :导入 sys 模块,该模块提供了对 Python 解释器相关的变量和函数的访问

  • from PyQt5.QtWidgets import QApplication, QMainWindow :从 PyQt5 的 QtWidgets 模块中导入 QApplication 和 QMainWindow 类。 QApplication 是 PyQt5 应用程序的基础类,用于管理应用程序的控制流和主要设置; QMainWindow 是创建主窗口的类,提供了一个应用程序框架,包括菜单栏、工具栏、状态栏等常见元素(在本程序中暂未使用全部功能,我们只需要这两个)

  • from uii import Ui_MainWindow :从 uii.py 文件中导入 Ui_MainWindow 类。 uii.py 是由 Qt Designer 设计界面后转换生成的 Python 代码

  • import dashscope 和 from dashscope import Generation :导入 dashscope 库及其 Generation 类。 dashscope 库用于与通义千问模型进行交互, Generation 类提供了调用模型生成内容的方法

2.设置 API 密钥

dashscope.api_key = "YOUR_DASHSCOPE_API_KEY"

这行代码设置了通义千问 API 的密钥。在使用通义千问模型进行调用时,需要提供有效的 API 密钥进行身份验证,只有通过验证后才能正常使用模型服务。将 “YOUR_DASHSCOPE_API_KEY” 替换为你自己在通义千问平台申请到的有效 API 密钥,具体方法见API通义千问大语言模型学习

3.定义 call_model 函数

def call_model(prompt):
   messages = [{'role': 'user', 'content': f'{prompt}'}]
   responses = Generation.call(
       Generation.Models.qwen_turbo,
       messages=messages,
       result_format='message',
       stream=True,
       incremental_output=True
   )
   result = ""
   for response in responses:
       result += response.output.choices[0]['message']['content']
   return result
  • def call_model(prompt): :定义了一个名为 call_model 的函数,该函数接受一个参数 prompt ,表示用户输入的问题。

  • messages = [{‘role’: ‘user’, ‘content’: f’{prompt}'}] :创建一个列表 messages ,其中包含一个字典。字典的 “role” 键的值为 “user” ,表示这是用户发送的消息; “content” 键的值为用户输入的问题 prompt ,通过格式化字符串的方式将 prompt 的值插入到字典中。这种格式是通义千问模型所要求的消息格式,用于标识消息的来源和内容。

  • responses = Generation.call(…) :调用 Generation 类的 call 方法来与通义千问的 qwen - turbo 模型进行交互。

  • Generation.Models.qwen_turbo :指定要使用的模型为 qwen - turbo 。

  • messages=messages :将前面构建的 messages 列表作为参数传递给模型,告诉模型用户的提问内容。

  • result_format=‘message’ :设置结果的格式为 message ,这是通义千问模型支持的一种输出格式。

  • stream=True 和 incremental_output=True :这两个参数开启了流式输出和增量输出功能。流式输出意味着模型会逐步返回结果,而不是一次性返回全部内容;增量输出则表示每次返回的结果是新增的内容,而不是完整的结果。这样可以在模型生成回答的过程中实时获取部分内容,提高交互的实时性。

  • result = “” :初始化一个空字符串 result ,用于存储最终的回答内容。

  • for response in responses: :遍历模型返回的响应结果 responses 。由于开启了流式输出, responses 是一个可迭代对象,每次迭代会获取到模型返回的一部分内容。

  • result += response.output.choices[0][‘message’][‘content’] :从每次的响应中提取回答内容,并将其追加到 result 字符串中。 response.output.choices[0][‘message’][‘content’] 表示从响应的 output 部分中,获取第一个选择( choices[0] ,通常只有一个选择)的 message 中的 content 字段,即模型生成的文本内容。

  • return result :最后返回完整的回答内容。

以上内容理解就好,该程序算法为通义千问所要求,在其官网可查其API调用方法

4.定义 MainWindow 类(也就是将按钮与程序以槽函数的方式进行连接)

class MainWindow(QMainWindow, Ui_MainWindow):
  def __init__(self):
      super().__init__()
      self.setupUi(self)
      self.pushButton.clicked.connect(self.on_button_click)

  def on_button_click(self):
      user_prompt = self.lineEdit.text().strip()
      if not user_prompt:
          self.textEdit.setText("请输入有效的问题")
          return
      ai_response = call_model(user_prompt)
      self.textEdit.setText(ai_response)
      self.lineEdit.clear()
  • class MainWindow(QMainWindow, Ui_MainWindow): :定义了一个名为 MainWindow 的类,该类继承自 QMainWindow 和 Ui_MainWindow 。这使得 MainWindow 类既具有 QMainWindow 的窗口功能,又包含了 Ui_MainWindow 定义的界面布局和控件

  • def init(self): :类的初始化方法

  • super().init() :调用父类( QMainWindow 和 Ui_MainWindow 的父类)的初始化方法,确保父类的属性和方法得到正确的初始化

  • self.setupUi(self) :调用 Ui_MainWindow 类的 setupUi 方法,用于设置界面的布局和控件的初始状态。这个方法是由 Qt Designer 生成的代码中的重要部分,它会根据设计的界面文件创建并初始化界面元素

  • self.pushButton.clicked.connect(self.on_button_click) :将界面上的按钮( pushButton )的点击信号( clicked )连接到 on_button_click 槽函数。这意味着当用户点击按钮时,会触发 on_button_click 方法的执行

  • def on_button_click(self): :定义了按钮点击时的处理方法

  • user_prompt = self.lineEdit.text().strip() :从界面的输入框( lineEdit )中获取用户输入的文本,并使用 strip() 方法去除文本两端的空白字符

  • if not user_prompt: :检查用户输入是否为空。如果为空,执行 self.textEdit.setText(“请输入有效的问题”) ,在界面的文本框( textEdit )中显示提示信息,并通过 return 结束方法的执行,不再进行后续的模型调用操作

  • ai_response = call_model(user_prompt) :如果用户输入不为空,调用 call_model 函数,将用户输入的问题 user_prompt 作为参数传递进去,获取模型的回答 ai_response

  • self.textEdit.setText(ai_response) :将模型的回答 ai_response 设置到界面的文本框( textEdit )中进行显示

  • self.lineEdit.clear() :清空界面的输入框( lineEdit ),以便用户可以输入下一个问题
    以上程序的设计需要用到槽函数的相关知识,建议对此处并不了解的同学在网上找课程进行学习

5.对程序设置一个启动开关

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

四.最终效果如下

在这里插入图片描述

五.总程序

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from ui_main import Ui_MainWindow
import dashscope
from dashscope import Generation

#设置你的通义千问 API 密钥
dashscope.api_key = "YOUR_DASHSCOPE_API_KEY"


def call_model(prompt):
    messages = [{'role': 'user', 'content': f'{prompt}'}]
    responses = Generation.call(
        Generation.Models.qwen_turbo,
        messages=messages,
        result_format='message',
        stream=True,
        incremental_output=True
    )
    result = ""
    for response in responses:
        result += response.output.choices[0]['message']['content']
    return result


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.pushButton.clicked.connect(self.on_button_click)

    def on_button_click(self):
        user_prompt = self.lineEdit.text().strip()
        if not user_prompt:
            self.textEdit.setText("请输入有效的问题")
            return
        ai_response = call_model(user_prompt)
        self.textEdit.setText(ai_response)
        self.lineEdit.clear()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

六.总结

到这里该AI交流界面就设计完成了,我们可以在此基础上进行完善,比如加入登陆界面等等,可以按自己的想法改造。希望自己的学习笔记能帮到大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值