首页 > 编程语言 >python实战(五)——构建自己的大模型助手

python实战(五)——构建自己的大模型助手

时间:2024-10-31 16:18:27浏览次数:3  
标签:实战 engine python chrome 助手 语音 import open response

一、任务目标

        本文将利用大语言模型强大的对话能力,搭建一个PC端问答助手。具体来说,我们将使用API来调用我们想要的大模型,并结合Prompt让大模型根据任务类型生成对应的输出。为了更方便地调用大模型助手,我们将结合python第三方库中的语音识别库进行开发,实现调用麦克风语音输入和音箱语音响应的人机交互。

二、简易版问答助手

        得益于目前高度集成的工具库,我们只需要少量的代码便可以实现语音的交互以及大模型的调用,这里直接给出代码:

import pyttsx3
import openai
import random
import speech_recognition as sr


# 使用默认麦克风
recognizer = sr.Recognizer()
microphone = sr.Microphone()
# 初始化tts引擎
engine = pyttsx3.init()
# 设置发音人的语音
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[0].id)
# 设置发音人的语速
engine.setProperty('rate', 200)

# api
openai.api_key = "your api key"
openai.api_base = "your api base"

# 持续识别语音,直到用户输入退出指令
while True:
    with microphone as source:
        print("请开始说话...")
        audio = recognizer.listen(source)

    try:
        # 将音频转换为文字
        print('语音识别中...')
        text = recognizer.recognize_google(audio, language='zh-CN')
        print(f"你说了:{text}")
        # 要转换的文本
        # 这里使用一个简单的触发词
        if '嘿小娜' == text:
            responses = ['您好,有什么可以帮您的吗?', '在呢!有什么吩咐?', '需要我做些什么?']
            response = random.choice(responses)
            # 将文本转换为语音
            engine.say(response)
            # 播放声音
            engine.runAndWait()
        # 理解用户输入意图
        elif '嘿小娜' in text and '再见' not in text:
            chat_completion = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=[{"role": "system",
                           "content": "你是一个私人的电脑语音助手,名字叫小娜,你将以尊敬的语气回答你主人提出的问题。请注意,输入给你的文本是麦克风语音转化成的汉语文本,没有标点符号,你需要根据语境进行标点符号位置的判断从而理解语义,并回答相应的问题。需要注意的是,你回答的文字应当在50个汉字以内。"},
                          {"role": "user", "content": text}]
            )
            response = chat_completion.choices[0].message.content
            # 将文本转换为语音
            engine.say(response)
            # 播放声音
            engine.runAndWait()
        if '嘿小娜' in text and '再见' in text:
            engine.say('下次见!')
            # 播放声音
            engine.runAndWait()
            break
    except sr.UnknownValueError:
        print("未识别出触发词")
    except sr.RequestError as e:
        print(f"识别服务出错; {e}")

        这里主要有以下几个需要注意的地方:

  • 语音识别模块使用了比较基础的python库,识别并转文字之后的文本不包含标点符号,因此需要在prompt中特别说明,当然这也是一个明显可以优化的地方(换个更强大的语音识别库)。
  • 同样,语音响应模块也较为简单,助手发出的声音较为正式(播音腔),发音也算流畅,但与真人对话场景还是存在比较大的差异,这里可以使用诸如chattts之类的强大的文本转语音库,实现极其逼真的语音响应(例如输入一段真人语音,chattts可以学习这个人的声纹信息,从而发出几乎一模一样的声音,着实令人震惊!)。
  • 大模型输出模块并没有采用流式输出,实际上,流式输出可以让语音响应更加及时,不需要等大语言模型把回复完全生成了之后再进行朗读(当然,不选择流式输出的另一个考量就是流式输出较难对大模型输出的文本进行后处理)。

三、结合电脑交互的个人助手

        这里还是以上面的代码为基础,我们给问答助手加入一些控制浏览器的能力,同时通过prompt让大模型生成我们期望的输出格式,便于后续调用对应的控制能力

1、prompt输出优化

        下面的代码主体结构和前述内容一致,但为了更充分的利用大模型的理解能力和交互能力,我们通过修改prompt让大模型输出半格式化的响应,进而对半格式化的响应进行解析,并调用对应交互功能。

import pyttsx3
import openai
import speech_recognition as sr
# 导入自建模块
from automation.open_chrome import open_website
from automation.web_address import web_dic
from automation.open_search import open_search

# 使用默认麦克风
recognizer = sr.Recognizer()
microphone = sr.Microphone()
# 初始化tts引擎
engine = pyttsx3.init()
# 设置发音人的语音
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[0].id)
engine.setProperty('rate', 200)
openai.api_key = "Your api key"
openai.api_base = "Your api base"

while True:
    with microphone as source:
        print("请开始说话...")
        audio = recognizer.listen(source)

    try:
        # 将音频转换为文字
        print('语音识别中...')
        text = recognizer.recognize_google(audio, language='zh-CN')
        print(f"你说了:{text}")
        if '小娜' not in text:
            continue
        # 要转换的文本
        prompt = (f"你是一个强大的私人电脑管家,名字叫小娜。你可以使用谷歌浏览器打开用户指定的网站(B站、百度、谷歌中的其中一个),也可以使用谷歌浏览器搜索用户指定的内容。"
                  f"用户给你的指令将以三个井号符合进行分隔,你需要根据用户的需求返回对应的回答格式。如果用户需要你打开指定的网站,你需要返回‘打开网站|网站名称’的答复格式;"
                  f"如果用户需要你帮助他搜索指定内容,你需要返回‘搜索|待搜索内容’的答复格式;如果用户输入的指令既不是打开指定网站也不是搜索指定内容,则你需要以尊敬的态度回复用户的对话,"
                  f"返回答复的格式为‘问答|你的回复’,需要注意的是,你回复的文字应当在50个汉字以内。以下是用户的指令:###{text}###,请务必返回指定格式的答复。"
                  f"另外,如果用户与你说再见,则你只需要需要返回‘退出程序|你的告别语’即可。")
        chat_completion = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[{"role": "system", "content": prompt}]
        )
        response = chat_completion.choices[0].message.content
        print(response)
        response = response.strip('(')
        response = response.strip(')')
        response = response.strip('(')
        response = response.strip(')')
        response = response.strip("'")
        print(response)
        order_type, answer = response.split('|')[0], response.split('|')[1]
        if '问答' in order_type:
            # 将文本转换为语音
            engine.say(answer)
            # 播放声音
            engine.runAndWait()
        elif '打开网站' in order_type:
            if answer not in web_dic:
                answer = '谷歌'
            address = web_dic[answer]
            open_website(address)
        elif '搜索' in order_type:
            browser = 'https://www.google.com'
            open_search(browser, answer)
        elif '退出程序' in order_type:
            # 将文本转换为语音
            engine.say(answer)
            # 播放声音
            engine.runAndWait()
            break
    except sr.UnknownValueError:
        print("未识别出触发词")
    except sr.RequestError as e:
        print(f"识别服务出错; {e}")

        上述代码中的prompt为:

        f"你是一个强大的私人电脑管家,名字叫小娜。你可以使用谷歌浏览器打开用户指定的网站(B站、百度、谷歌中的其中一个),也可以使用谷歌浏览器搜索用户指定的内容。"
        f"用户给你的指令将以三个井号符合进行分隔,你需要根据用户的需求返回对应的回答格式。如果用户需要你打开指定的网站,你需要返回‘打开网站|网站名称’的答复格式;"
        f"如果用户需要你帮助他搜索指定内容,你需要返回‘搜索|待搜索内容’的答复格式;如果用户输入的指令既不是打开指定网站也不是搜索指定内容,则你需要以尊敬的态度回复用户的对话,"
        f"返回答复的格式为‘问答|你的回复’,需要注意的是,你回复的文字应当在50个汉字以内。以下是用户的指令:###{text}###,请务必返回指定格式的答复。"
        f"另外,如果用户与你说再见,则你只需要需要返回‘退出程序|你的告别语’即可。"

        这里面,我们指定了四种响应类型——打开网站、搜索、常规问答以及退出程序。我们通过.split()方法即可对模型的响应进行分隔,如果是“打开网站”或者“搜索”则调用open_website或者open_search功能,而对于“退出程序”或者“常规问答”则无需任何操作,直接输出大模型的回答。此外,对于“打开网站”和“搜索”,我们让大模型总结和推断需要打开哪个网站,或者需要搜索什么问题,open_website和open_search直接输入大模型的响应结果。

2、控制浏览器

        这里我们实现了简单的控制代码,读者可自行优化。

(1)打开网站(automation/open_chrome.py)

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options

def open_website(website_address):
    # 配置ChromeDriver的路径
    chrome_driver_path = ChromeDriverManager().install()

    # 创建Chrome选项对象
    chrome_options = Options()
    chrome_options.add_experimental_option("detach", True)

    # 创建Chrome浏览器的实例
    driver = webdriver.Chrome(service=Service(chrome_driver_path), options=chrome_options)

    # 将浏览器窗口最大化
    driver.maximize_window()

    # 打开指定的网站
    driver.get(website_address)

(2)搜索(automation/open_search.py)

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

def open_search(browser, query):
    # 配置ChromeDriver的路径
    chrome_driver_path = ChromeDriverManager().install()

    # 创建Chrome选项对象
    chrome_options = Options()
    chrome_options.add_experimental_option("detach", True)

    # 创建Chrome浏览器的实例
    driver = webdriver.Chrome(service=Service(chrome_driver_path), options=chrome_options)

    # 将浏览器窗口最大化
    driver.maximize_window()

    # 打开指定的网站
    driver.get(browser)

    # 等待页面加载
    time.sleep(2)

    # 找到搜索框元素
    search_box = driver.find_element(By.NAME, "q")

    # 在搜索框中输入搜索内容
    search_box.send_keys(query)

    # 模拟按下回车键进行搜索
    search_box.send_keys(Keys.RETURN)

    # 等待搜索结果加载
    time.sleep(2)

(3)网站地址(automation/web_address.py)

web_dic = {
    'B站':'https://www.bilibili.com/',
    '百度':'https://www.baidu.com',
    '谷歌':'https://www.google.com',
    '微博':'https://www.weibo.com',
    'github':'https://github.com/'
}

四、总结

        本文实现了PC端智能问答助手的构建,基于大模型的交互能力和一些简单的控制代码,即可打造出一个专属于你自己的电脑AI管家!

标签:实战,engine,python,chrome,助手,语音,import,open,response
From: https://blog.csdn.net/ChaneMo/article/details/143164383

相关文章

  • Python工具箱系列:Pandas 数据清洗与预处理详解
    目录一、数据清洗与预处理的重要性二、Pandas简介三、Pandas数据清洗与预处理技巧1.读取数据2.查看数据3.处理缺失值4.处理重复值5.处理异常值6.处理数据类型不一致7.处理数据格式不一致8.数据标准化和归一化9.数据编码四、案例:使用Pandas进行数据清......
  • Python数据类型之自定义类型——Class与面向对象编程详解
    目录引言一、面向对象编程基础二、类的定义与对象的创建三、封装性四、继承性五、多态性六、特殊方法与数据类七、使用dataclass装饰器八、面向对象编程的优势结论引言Python是一门功能强大的编程语言,其面向对象编程(OOP)的特性更是为开发者提供了极大的灵活性和......
  • 美畅物联丨掌握Wireshark:GB28181协议报文分析实战指南
    Wireshark,一款在网络安全与协议分析领域享有盛誉的网络嗅探器,凭借其强大的功能集、直观的图形用户界面以及广泛的跨平台兼容性,已成为众多开发者不可或缺的得力助手。其开源特性吸引了大量开发者的积极参与,不断推动其功能的完善与升级。在GB/T28181协议(专为视频监控系统设......
  • python小白入手第一章基础知识
    单行注释:用#开头,#右边的部分即为所要注释的内容多行注释:用一对三个双引号引起来例子:print("Hi")#print("hello"),相应的第二个print语句不会执行钱包案例:目前学习的三种数据类型:string、int、floattype()语句的使用:在print语句中,直接输出类型信息,同时也可以将数据存储到变量中,......
  • Python三方库:Pika(RabbitMQ基础使用)
    https://www.cnblogs.com/-hz01/p/17985502  Python有多种插件都支持RabbitMQ,本文介绍的是RabbitMQ推荐的Pika插件。使用pip直接安装即可 pipinstallpika 。一、RabbitMQ简介1.MQ简介MQ(MessageQueue,消息队列),是一个在消息传输过程中保存消息的容器,多用在分布式系统之......
  • python变量
    1.变量Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。变量定义规则变量名只能是数字,字母或下划线的任意组合变量名的第一个字符不能是数字保留字即关键字,我们不能把它们用作任何标识符名称。Python的标准库提供了一个keyword......
  • python 自动将歌曲按照歌手分类创建软链接
    要使用Python获取MP3文件的信息,可以使用pymediainfo包。首先,你需要安装pymediainfo。下面是获取一首歌曲信息的例子"""Moduletodemonstratehowtouse`pymediainfo`toreadmetadatafromamediafile.Inthismodule,wereadthemetadataofagivenMP3fileand......
  • 西安短期驻场:python+flask/django 1.5万/月可谈
    驻场周期:2个月,不包食宿。地点:西安高新区费用:1.5万/月。可谈python后台开发岗位要求:-本科及以上学历,计算机相关专业,3年以上开发经验。-熟悉Python及其主流框架flask或django。-熟悉数据库设计与优化,如MySQL、Mango等,具备数据库性能调优经验。-熟练使用Git等版本控制工具,具备......
  • Leetcode刷题Python之3165.不包含相邻元素的子序列的最大和
    提示:利用线段树解决不包含相邻元素的子序列最大和问题。文章目录一、题目描述示例二、解题思路1.思路分析2.线段树的状态设计3.线段树的操作三、代码实现代码详细解释四、总结时间复杂度分析一、题目描述给定一个整数数组nums和一个二维数组queries,其中q......
  • Python+Django框架淘宝家用电器销售数据可视化系统作品截图和开题报告参考
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩,提供核心代码讲解,答辩指导。项目配有对应开发......