Type something to search...
打造未来:使用 LangGraph 开发自己的语音助手

打造未来:使用 LangGraph 开发自己的语音助手

今天,语音助手已经发展成为智能系统中需要先进自然语言处理的基本组成部分。本文提供了使用 LangGraph 开发语音助手的技术指南,LangGraph 是一个旨在管理复杂代理系统的编排框架。在整个文本中,我们将探讨 LangGraph 如何实现多个节点的协调,从而创建高效且高度可扩展的流程。本指南面向希望利用 LangGraph 功能在 AI 环境中实施解决方案的开发者。

什么是 LangGraph?

LangGraph 作为一个关键工具,帮助开发者应对构建多个 LLM 代理的应用程序的复杂性。该框架是 LangChain 生态系统的一部分,提供了一种高效的架构,用于多代理系统的协调,能够清晰地定义工作流程并管理代理之间的交互。其创建循环图的能力优化了应用程序的性能和灵活性,便于在单一环境中集成多样化的功能。借助 LangGraph,开发者可以实现更连贯和有效的解决方案,改变传统的对话系统开发方法。

设计语音助手流程

该过程始于用户的语音捕获,语音被转换为文本以进行处理。该文本作为决策节点的输入,评估用户的请求并确定从四个可用选项中执行哪些任务:

  1. 在日历中安排会议。
  2. 撰写包含特定信息的电子邮件。
  3. 通过互联网搜索回答问题。
  4. 计划旅行,包括寻找航班、酒店以及为季节选择合适的衣物建议。

通过允许助手同时执行多个任务,这种配置不仅提升了用户体验,还展示了LangGraph框架在构建复杂对话系统方面的多功能性和强大能力。

构建语音组件

要构建语音组件,我们需要一个语音到文本的组件和一个文本到语音的组件。

下面是这两个组件的代码:

  • 语音转文本
import speech_recognition as sr
from assistant import config as cfg


def parse_voice() -> tuple[bool, str]:
    r = sr.Recognizer()
    with sr.Microphone() as source:
        recognized = False
        try:
            r.pause_threshold = 1.5
            r.adjust_for_ambient_noise(source)
            audio_data = r.listen(source)
            text = r.recognize_google(audio_data, language=cfg.SELECTED_LANGUAGE)
            recognized = True

        except sr.UnknownValueError:
            text = cfg.LANGUAGE_MSG["unknown_value"][cfg.SELECTED_LANGUAGE]

        except sr.RequestError:
            text = cfg.LANGUAGE_MSG["request_error"][cfg.SELECTED_LANGUAGE]

        except sr.WaitTimeoutError:
            text = cfg.LANGUAGE_MSG["request_error"][cfg.SELECTED_LANGUAGE]

    return recognized, text
  • 文本转语音
def play_audio(text: str) -> None:
    myobj = gTTS(text=text, lang=cfg.MSG_SELECTED_LANGUAGE, slow=False)

    mp3_fp = io.BytesIO()
    myobj.write_to_fp(mp3_fp)
    mp3_fp.seek(0)

    audio = AudioSegment.from_file(mp3_fp, format="mp3")
    audio = audio.speedup(playback_speed=cfg.AUDIO_SPEED)

    with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as temp_mp3:
        audio.export(temp_mp3.name, format="mp3")
        temp_filename = temp_mp3.name

    pygame.mixer.init()
    pygame.mixer.music.load(temp_filename)
    pygame.mixer.music.play()

    while pygame.mixer.music.get_busy():
        pygame.time.Clock().tick(10)

构建多代理流程

在语音组件正常工作后,我们继续构建语音助手的核心,换句话说,就是从接收到输入到获得响应的整个流程。为此,我们利用图形和子图,以便拥有一个多代理、可扩展和细粒度的调度器,使流程保持可维护和可复制。

def build_assistant_graph() -> CompiledGraph: 
    graph_builder = StateGraph(GraphState) 
    graph_builder.add_node(Node.DECIDER.value, decider_node) 
    graph_builder.add_edge(START, Node.DECIDER.value) 
    graph_builder.add_conditional_edges( 
        Node.DECIDER.value, 
        route_tasks_nodes, 
        [Graph.MAIL.value, Graph.CALENDAR.value, Graph.TRAVEL.value, Graph.QUESTION.value, END], 
    ) 

    graph_builder.add_node(Graph.MAIL.value, mail_graph) 
    graph_builder.add_node(Graph.CALENDAR.value, calendar_graph) 
    graph_builder.add_node(Graph.TRAVEL.value, travel_graph) 
    graph_builder.add_node(Graph.QUESTION.value, question_graph) 

    graph_builder.add_edge(Graph.MAIL.value, END) 
    graph_builder.add_edge(Graph.CALENDAR.value, END) 
    graph_builder.add_edge(Graph.TRAVEL.value, END) 
    graph_builder.add_edge(Graph.QUESTION.value, END) 

    return graph_builder.compile() 

在前面的代码(对应于图1)中,可以看到如何定义主图,其中调用了一个决策节点,并通过其余子图并行路由响应:

子图的一个例子是旅行组件:

def build_travel_graph() -> CompiledGraph: 
    graph_builder = StateGraph(ViajeState) 
    graph_builder.add_node(TravelNode.PARSER.value, parser_travel_node) 
    graph_builder.add_node(TravelNode.FLIGHTS.value, flights_node) 
    graph_builder.add_node(TravelNode.PACKING.value, packagin_node) 
    graph_builder.add_edge(START, TravelNode.PARSER.value) 

    graph_builder.add_conditional_edges( 
        TravelNode.PARSER.value, 
        route_travel_nodes, 
        [ 
            TravelNode.FLIGHTS.value, 
            TravelNode.PACKING.value, 
        ], 
    ) 

    graph_builder.add_node(TravelNode.BOOK.value, book_node) 
    graph_builder.add_edge(TravelNode.FLIGHTS.value, TravelNode.BOOK.value) 
    graph_builder.add_edge(TravelNode.BOOK.value, END) 
    graph_builder.add_edge(TravelNode.PACKING.value, END) 

    return graph_builder.compile() 

节点是执行特定功能的代理。在这种情况下,决策者是一个调用 gpt-4o-mini 模型的过程,根据输入决定执行哪个节点,而其余节点则覆盖其他功能,例如通过 tavily 搜索答案或通过 API 连接客户端以搜索航班、酒店等。

决策 Pydantic 模型:

class DeciderOptions(BaseModel):
    mail: bool
    calendar: bool
    travel: bool
    question: bool

旅行组织节点:

注意:API 连接尚未开发,因为我们希望展示 LangGraph 的功能。

...

def parser_travel_node(state: ViajeState) -> dict[str, Any]: 
    travel_chain = build_travel_chain() 
    user_input = state["travel_input"] 
    res = travel_chain.invoke({"text": user_input}) 

    return {"travel": res} 

def flights_node(state: TravelState) -> dict[str, str]:
    # TODO: 开发 API 组件以推荐航班,如果日期不具体,或在确切日期购买机票
    formatted_string = cfg.LANGUAGE_MSG["flights_output"][cfg.MSG_SELECTED_LANGUAGE].format(
        destination=state["travel"].destination,
        date=state["travel"].date
    )
    return {"flights_output": formatted_string}
...

下一步

我们的重点是扩展功能,增强用户体验,并加强应用程序的基础设施,以支持更广泛的能力。下一步将分为三个主要阶段:

1. 功能操作的API集成

初始开发阶段将涉及构建API集成,以扩展助手的能力,使用户能够无缝地与基本服务进行交互。此阶段将专注于以下关键操作:

  • 酒店和航班预订:实施API以访问酒店和航空公司预订平台,使用户能够通过语音命令直接检查可用性、进行预订和确认预订。
  • 日历管理:启用日历API集成,以允许助手设置、修改和发送会议邀请,提供免提的日程安排体验。
  • 电子邮件自动化:与电子邮件服务集成,允许助手发送、阅读和分类电子邮件,使用户能够更有效地管理他们的收件箱。

2. 用户界面和体验优化

随着应用程序核心功能的扩展,下一阶段将专注于专业化用户体验,以确保其符合行业标准并增强用户满意度。重点领域将包括:

  • 前端重新设计:全面的用户界面刷新,以现代化应用程序外观,使其视觉上吸引人且易于导航。这可能涉及采用干净、简约的设计,并使用用户友好的元素直观地引导用户使用应用程序的功能。
  • 语音交互优化:提高语音识别和响应系统的准确性、响应性和个性化。这包括优化语音提示,使其听起来自然,改善上下文理解,并确保助手在各种使用案例中准确响应。

3. 基础设施扩展和优化

为了支持新功能,并确保应用程序能够处理随着采用增长而增加的需求,建立强大的基础设施至关重要。此阶段将优先考虑:

  • 可扩展的云基础设施:过渡到可扩展的云解决方案,能够处理高负载,支持快速扩展,并提供冗余以保持正常运行时间。
  • 数据安全和合规性:实施严格的安全协议,包括数据加密、安全的API通信和GDPR合规性,以保护用户数据并增强信任。
  • 性能监控和优化:建立对系统性能和API正常运行时间的持续监控,使我们能够主动识别和解决问题。这可能包括设置自动警报系统和优化服务器响应时间。

结论

在本文中,我们探讨了如何使用 LangGraph 开发语音助手,强调了其框架在协调复杂系统中的重要性。通过实现一个将语音输入转换为文本并使用决策节点管理各种任务的流程,例如安排会议、撰写电子邮件、回答问题和组织旅行,我们展示了 LangGraph 在创建先进对话应用程序中的多样性。

此外,我们详细说明了在不同操作系统上安装必要音频组件的步骤,使实时语音捕获和播放成为可能。这种集成对于提供流畅有效的用户体验至关重要。通过将 LangGraph 的强大功能与音频处理能力相结合,我们为一个强大且功能齐全的语音助手奠定了基础,该助手能够适应动态人工智能环境中用户不断变化的需求。随着语音技术的不断发展,改善和扩展这一助手的可能性是无穷无尽的,为人机交互的未来创新打开了大门。

您可以在 这里 查看完整代码。

Related Posts

使用 ChatGPT 搜索网络功能的 10 种创意方法

使用 ChatGPT 搜索网络功能的 10 种创意方法

例如,提示和输出 你知道可以使用 ChatGPT 的“搜索网络”功能来完成许多任务,而不仅仅是基本的网络搜索吗? 对于那些不知道的人,ChatGPT 新的“搜索网络”功能提供实时信息。 截至撰写此帖时,该功能仅对使用 ChatGPT 4o 和 4o-mini 的付费会员开放。 ![](https://images.weserv.nl/?url=https://cdn-im

阅读更多
在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和科技这样一个动态的行业中,保持领先意味着不断提升你的技能。无论你是希望深入了解人工智能模型性能、掌握数据分析,还是希望通过人工智能转变传统领域如法律,这些课程都是你成功的捷径。以下是一个精心策划的高价值课程列表,可以助力你的职业发展,并让你始终处于创新的前沿。 1. 生成性人工智能简介课程: [生成性人工智能简介](https://genai.works

阅读更多
10 个强大的 Perplexity AI 提示,让您的营销任务自动化

10 个强大的 Perplexity AI 提示,让您的营销任务自动化

在当今快速变化的数字世界中,营销人员总是在寻找更智能的方法来简化他们的工作。想象一下,有一个个人助理可以为您创建受众档案,建议营销策略,甚至为您撰写广告文案。这听起来像是一个梦想? 多亏了像 Perplexity 这样的 AI 工具,这个梦想现在成为现实。通过正确的提示,您可以将 AI 转变为您的 个人营销助理。在本文中,我将分享 10 个强大的提示,帮助您自动

阅读更多
10+ 面向 UI/UX 设计师的顶级 ChatGPT 提示

10+ 面向 UI/UX 设计师的顶级 ChatGPT 提示

人工智能技术,如机器学习、自然语言处理和数据分析,正在重新定义传统设计方法。从自动化重复任务到实现个性化用户体验,人工智能使设计师能够更加专注于战略思维和创造力。随着这一趋势的不断增长,UI/UX 设计师越来越多地采用 AI 驱动的工具来促进他们的工作。利用人工智能不仅能提供基于数据的洞察,还为满足多样化用户需求的创新设计解决方案开辟了机会。 1. 用户角色开发 目的

阅读更多
在几分钟内完成数月工作的 100 种人工智能工具

在几分钟内完成数月工作的 100 种人工智能工具

人工智能(AI)的快速发展改变了企业的运作方式,使人们能够在短短几分钟内完成曾经需要几周或几个月的任务。从内容创作到网站设计,AI工具帮助专业人士节省时间,提高生产力,专注于创造力。以下是按功能分类的100个AI工具的全面列表,以及它们在现实世界中的使用实例。 1. 研究工具 研究可能耗时,但人工智能工具使查找、分析和组织数据变得更加容易。**ChatGPT, Cop

阅读更多
你从未知道的 17 个令人惊叹的 GitHub 仓库

你从未知道的 17 个令人惊叹的 GitHub 仓库

Github 隐藏的宝石!! 立即收藏的代码库 学习编程相对简单,但掌握编写更好代码的艺术要困难得多。GitHub 是开发者的宝藏,那里“金子”是其他人分享的精心编写的代码。通过探索 GitHub,您可以发现如何编写更清晰的代码,理解高质量代码的样子,并学习成为更熟练开发者的基本步骤。 1. notwaldorf/emoji-translate *谁需

阅读更多