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

发布时间:2024-12-08 10:15

Python的Scikit-learn库用于机器学习模型构建 #生活技巧# #工作学习技巧# #编程语言学习路径#

一、任务目标

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

二、简易版问答助手

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

import pyttsx3

import openai

import random

import speech_recognition as sr

recognizer = sr.Recognizer()

microphone = sr.Microphone()

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 '嘿小娜' == 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()

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):

chrome_driver_path = ChromeDriverManager().install()

chrome_options = Options()

chrome_options.add_experimental_option("detach", True)

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):

chrome_driver_path = ChromeDriverManager().install()

chrome_options = Options()

chrome_options.add_experimental_option("detach", True)

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管家!

网址:python实战(五)——构建自己的大模型助手 https://www.yuejiaxmz.com/news/view/411611

相关内容

Python推荐系统实战:构建个性化推荐系统
Python实现简单的智能助手
Python虚拟助手与自然语言理解
如何利用Python构建智能虚拟助手
用Python打造自己的虚拟助手,实现智能化生活!
云原生架构下的家庭自动化系统:Python编程实现智能生活
揭秘Python虚拟助手:与未来的对话
从零开始构建:Python自定义脚本自动化你的日常任务
大语言模型在语音助手领域的应用:创新的交互方式与用户体验
语音识别:AI大模型在语音助手和音频处理中的应用

随便看看