基于Azure AI搜索和GPT-4o实时音频的语音化RAG

本文介绍了一种简单的语音生成式 AI 应用架构,通过结合新的 gpt-4o-realtime-preview 模型和 Azure AI Search,实现了 RAG 模式。新的 Azure OpenAI gpt-4o-realtime-preview 模型以其语音到语音的功能,为更自然的应用程序用户界面打开了大门。这种新的基于语音的界面也带来了一个有趣的新挑战:如何在使用音频作为输入和输出的系统中实现检索增强生成 (RAG)?

RAG 是一种将语言模型与您自己的数据相结合的流行模式。我们将介绍一种简单的语音生成式 AI 应用架构,该架构支持在实时音频 API 之上进行 RAG,并支持来自客户端设备的全双工音频流,同时安全地处理对模型和检索系统的访问。

……

阅读全文

AI 代理将成为操纵引擎

在2025年,我们可能会习惯于与一个个人AI代理聊天,这个代理了解我们的日程、朋友圈和我们去过的地方。它们被设计得如此贴心,以至于我们愿意让它们深入我们生活的方方面面。通过语音交流,这种亲密感变得更加强烈。

但这种亲密感其实是一种错觉,我们以为自己在和一个真正像人的代理互动,但实际上背后是一个服务于工业利益的系统,这些利益并不总是和我们的利益一致。这些AI代理拥有强大的能力,它们能微妙地影响我们的消费选择、去向和阅读内容。它们以一种几乎不易察觉的方式,让我们忘记它们真正的忠诚所在。

……

阅读全文

使用MLX调用Phi-4模型

在当今的AI技术浪潮中,微软推出的Phi-4模型无疑是一个令人瞩目的创新。作为小型语言模型(SLM)的最新成员,Phi-4以其14B参数的强大性能和卓越的复杂推理能力,展示了AI技术在数学、编程和长文本处理等领域的巨大潜力。本文将详细介绍如何使用MLX框架调用Phi-4模型,并探讨其在不同应用场景中的实际效果。

……

阅读全文

Magentic-One:用于解决复杂任务的通用多代理系统

微软研究团队推出了一个新开发的多智能体系统——Magentic-One。这个系统能够解决各种领域的开放性网络和文件任务,是朝着开发能够完成人们在工作和生活中遇到的各种任务的智能体迈出的重要一步。他们还在微软的AutoGen框架上发布了Magentic-One的开源实现。

现场1

未来的AI将更加注重行动。AI系统正在从简单的对话转变为实际完成任务,这将是AI价值的真正体现。比如,从推荐晚餐选项的生成性AI,到能够自主下单和安排送餐的代理助手。从总结研究论文到积极搜索和整理相关研究以完成全面的文献综述。

……

阅读全文

使用 GPT-4o 实时 API 构建一个语音机器人

语音技术正在改变我们与机器互动的方式,使与AI的对话感觉比以往任何时候都更加自然。随着 GPT-4o 实时API的公开测试版发布,开发人员现在可以使用这些工具在应用程序中创建低延迟、多模态的语音体验,从而为创新开辟了无限的可能性。

过去构建语音机器人需要将多个模型拼接在一起,用于语音识别、推理和文本转语音等操作。而现在借助实时API,开发者只需通过一个API调用即可完成整个过程,从而实现流畅、自然的语音对话。这对于客户支持、教育和实时语言翻译等行业来说是一个重大变革,因为在这些行业中,快速、无缝的交互至关重要。

……

阅读全文

检索增强微调:使用 GPT-4o 微调 GPT-4o mini 模型以适用于特定领域应用

对企业来说,生成式AI最具影响力的应用之一是创建自然语言界面,这些界面已根据特定领域和使用场景的数据进行了定制,以提供更准确、更准确的响应。这意味着回答与银行、法律和医疗等特定领域相关的问题。

我们经常谈到实现这一目标的两种方法:

  1. 检索增强生成(RAG):将这些文档存储在向量数据库中,在查询时根据它们与问题的语义相似度来检索文档,然后将它们作为LLM的上下文。
  2. 监督微调(SFT):在一组代表特定领域知识的提示和响应上对现有的基线模型进行训练。

虽然大多数尝试使用RAG的组织都试图通过其内部知识库来扩展LLM的知识,但许多组织在没有进行显著优化的情况下未能达到预期效果。同样,精心挑选一个足够大且高质量的数据集用于微调也是一项具有挑战性的任务。这两种方法都有局限性:微调将模型限制在其已训练的数据上,使其容易受到近似和幻觉的影响,而RAG虽然可以使模型落地,但它仅根据查询与文档的语义接近程度来检索文档——这可能与查询无关,并导致给出的解释不充分。

……

阅读全文

语音识别与合成中的延迟问题及解决策略

语音识别和合成的延迟可能是创建无缝和高效应用程序的一个重大障碍。减少延迟不仅可以改善用户体验,还可以提升实时应用程序的整体性能。本文将探讨在一般转录、实时转录、文件转录和语音合成中减少延迟的策略。

1. 网络延迟:将语音资源移近应用程序

导致语音识别延迟的主要因素之一是网络延迟。为了减轻这一延迟,关键是减少应用程序与语音识别资源之间的距离。以下是一些建议:

……

阅读全文

LLM 是脑,RPA 是手

LLM 是脑,RPA 是手——大模型与自动化技术的深度融合分析

一、引言

在数字化转型的浪潮中,人工智能(AI)技术正以前所未有的速度改变着我们的世界。其中,大模型(LLM,Large Language Model)和机器人流程自动化(RPA,Robotic Process Automation)作为两大关键技术,正在各自领域发挥着巨大的作用。LLM以其强大的语言理解和生成能力,被誉为“智能的大脑”,而RPA则以其高效的自动化执行能力,被称为“数字的手”。当这两者结合在一起,会擦出怎样的火花?本文将从多个维度深入探讨大模型LLM与RPTA结合的必要性与可行性,并分析其带来的变革与挑战。

……

阅读全文

使用 Azure 机器学习对小型语言模型 Phi-3 进行微调

Phi-3 是由微软研究团队开发的小型语言模型。在多个公开基准测试(例如在 MMLU 上 Phi-3 达到了69%的成绩)中,Phi-3 表现良好并且可以支持长达128k的上下文。Phi-3-mini 3.8B版于2024年4月末首次发布,而 Phi-3-small、Phi-3-medium 和 Phi-3-vision 于5月在微软 Build 大会上揭晓。

……

阅读全文

Azure OpenAI 语音聊天

本文介绍使用 Azure AI 语音与 Azure OpenAI 服务实现全语音对话聊天,以及如何改进非阻塞式的对话。

要点

  • Azure AI 语音服务识别文本
  • 将文本发送到 Azure OpenAI,获取流式回复
  • Azure AI 语音服务对流式响应的文本合成语音

代码示例(Python)

以下是 Python 版本的示例,想要了解更多语言的示例,请参考 OpenAI-Speech

安装依赖

1
2
pip install azure-cognitiveservices-speech
pip install openai

添加代码

  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
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import os
import azure.cognitiveservices.speech as speechsdk
from openai import AzureOpenAI

# This example requires environment variables named 
# "OPEN_AI_KEY", "OPEN_AI_ENDPOINT" and "OPEN_AI_DEPLOYMENT_NAME"

# Your endpoint should look like the following:
# https://YOUR_OPEN_AI_RESOURCE_NAME.openai.azure.com/
client = AzureOpenAI(
azure_endpoint=os.environ.get('OPEN_AI_ENDPOINT'),
api_key=os.environ.get('OPEN_AI_KEY'),
api_version="2024-05-01-preview"
)

# This will correspond to the custom name you chose for 
# your deployment when you deployed a model.
deployment_id=os.environ.get('OPEN_AI_DEPLOYMENT_NAME')

# This example requires environment variables 
# named "SPEECH_KEY" and "SPEECH_REGION"
speech_config = speechsdk.SpeechConfig(subscription=os.environ.get('SPEECH_KEY'), 
                                       region=os.environ.get('SPEECH_REGION'))
audio_output_config = speechsdk.audio.AudioOutputConfig(use_default_speaker=True)
audio_config = speechsdk.audio.AudioConfig(use_default_microphone=True)

# Should be the locale for the speaker's language.
speech_config.speech_recognition_language="zh-CN"
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, 
                                               audio_config=audio_config)

# The language of the voice that responds on behalf of Azure OpenAI.
speech_config.speech_synthesis_voice_name='zh-CN-YunyiMultilingualNeural'
speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, 
                                                 audio_config=audio_output_config)
# tts sentence end mark
tts_sentence_end = [ ".", "!", "?", ";", "。", "!", "?", ";", "\n" ]

# Prompts Azure OpenAI with a request and synthesizes the response.
def ask_openai(prompt):
    # Ask Azure OpenAI in streaming way
    response = client.chat.completions.create(model=deployment_id, 
                                              max_tokens=200, 
                                              stream=True, 
                                              messages=[
                                                {"role": "user", "content": prompt}
                                              ])
    collected_messages = []
    last_tts_request = None

    # iterate through the stream response stream
    for chunk in response:
        if len(chunk.choices) > 0:
            # extract the message
            chunk_message = chunk.choices[0].delta.content  
            if chunk_message is not None:
                # save the message
                collected_messages.append(chunk_message)  
                # sentence end found
                if chunk_message in tts_sentence_end: 
                    # join the recieved message together to build a sentence
                    text = ''.join(collected_messages).strip() 
                    if text != '': 
                        # if sentence only have \n or space, we could skip
                        print(f"Speech synthesized to speaker for: {text}")
                        last_tts_request = speech_synthesizer
                                                    .speak_text_async(text)
                        collected_messages.clear()
    if last_tts_request:
        last_tts_request.get()

# Continuously listens for speech input to recognize 
# and send as text to Azure OpenAI
def chat_with_open_ai():
    while True:
        print("""Azure OpenAI is listening. 
               Say 'Stop' or press Ctrl-Z to end the conversation.""")
        try:
            # Get audio from the microphone and 
            # then send it to the TTS service.
            speech_recognition_result = speech_recognizer.
                                           recognize_once_async().get()

            # If speech is recognized, send it to Azure OpenAI 
            # and listen for the response.
            if speech_recognition_result.reason == speechsdk.ResultReason
                                                         .RecognizedSpeech:
                if speech_recognition_result.text == "Stop." 
                             or speech_recognition_result.text == "Stop。":
                    print("Conversation ended.")
                    break
                print("Recognized speech: {}".format(
                                            speech_recognition_result.text))
                ask_openai(speech_recognition_result.text)
            elif speech_recognition_result.reason == speechsdk.ResultReason
                                                                  .NoMatch:
                print("No speech could be recognized: {}".format(
                                speech_recognition_result.no_match_details))
                break
            elif speech_recognition_result.reason == speechsdk.ResultReason
                                                                  .Canceled:
                cancellation_details = speech_recognition_result
                                                      .cancellation_details
                print("Speech Recognition canceled: {}".format(
                                               cancellation_details.reason))
                if cancellation_details.reason == speechsdk.CancellationReason
                                                                    .Error:
                    print("Error details: {}".format(
                                        cancellation_details.error_details))
        except EOFError:
            break

# Main
try:
    chat_with_open_ai()
except Exception as err:
    print("Encountered exception. {}".format(err))

非阻塞式改进

前面的示例运行起来的效果是固定一问一答交流的,如果希望实现对话的过程是可以被打断的,可以改变识别语音的代码为非阻塞式。 即把调用 ask_openai 的地方改为创建另一个线程来执行。

……

阅读全文