Azure 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. 网络延迟:将语音资源移近应用程序

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

……

阅读全文

使用 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 的地方改为创建另一个线程来执行。

……

阅读全文

实现 Azure OpenAI 无密钥身份验证

与许多 Azure API 一样,Azure OpenAI 服务允许开发人员使用API密钥无密钥(通过Entra ID)进行身份验证。由于尽量避免使用密钥是安全最佳实践,因此我们在本文中将详细介绍如何使开发人员轻松地迁移到无密钥 Azure OpenAI 身份验证。如果您想立即行动,这里还提供了一个新的无密钥部署模板。

密钥的风险

首先让我们来谈谈API密钥的风险,使用密钥很省心,因为设置看起来很简单——你只需要一个端点URL和密钥:

……

阅读全文

使用 Semantic Kernel 构建自定义 Copilot

本文重点介绍如何使用由 Azure OpenAI 服务提供支持的 Semantic Kernel 创建自己的 Copilot。我们将尝试利用大型语言模型(LLM)的优势与外部服务的集成。这将使您了解如何真正实现您的 Copilot 目标,不仅与零售业,而且与任何行业,无论是电力和公用事业,政府和公共部门等。它的整体功能和潜在的应用场景都远超于聊天机器人。

……

阅读全文

GPTs action 中使用 Azure AI Search

OpenAI 的 GPTs 上线有一段时间了,在实际应用中发现 GPTs 内置对知识库的检索能力很一般,对话过程中经常拿不到期望的反馈内容。如果利用 GPTs 的 action 能很好地弥补这个缺陷。

总所周知加强检索知识库离不开 RAG,如果自建 RAG 将会是一个很大的工作量,而且还要考虑到知识库的更新问题。于是想到 Azure AI Search 提供了一个很好的解决方案,可以很方便地将知识库导入到 Azure AI Search 中,然后通过 API 调用来检索知识库。整个过程都不需要编码,所以将 Azure AI Search 与 GPTs action 结合起来是个不错的主意。

……

阅读全文

Azure 机器学习和 DataRobot 联手加速生成式和预测性 AI 的价值

Azure 机器学习 (AzureML) 与价值驱动 AI 领导者 DataRobot 之间的突破性集成,这是最近宣布的合作伙伴关系的结果。这种集成将 Azure 机器学习功能的强大功能与 DataRobot 在加速构建、部署和监视企业级 AI 解决方案的整个生命周期方面的专业知识结合在一起。

DataRobot AI 平台独特地将生成式和预测性 AI 功能结合在一个统一、开放和端到端的环境中。通过新的集成,DataRobot AI 平台现在可以轻松地直接在 Azure Kubernetes 服务 (AKS) 上运行。数据科学家现在可以在 DataRobot Notebooks Code-Assist 中利用 Azure OpenAI 服务的强大功能。他们还可以通过 Azure 机器学习托管的联机终结点为实时和批处理用例部署模型,同时在 DataRobot 中监视这些部署。

……

阅读全文

多种环境部署 Azure 机器学习 Prompt Flow

Prompt Flow 在 Azure 机器学习工作室、Azure AI Studio 和本地开发笔记本电脑上提供,是一种开发工具,旨在简化由 LLM(大型语言模型)提供支持的 AI 应用程序的整个开发周期。Prompt Flow 使提示处于前端和中心,而不是像其他工具那样混淆它们或将它们深埋在抽象层中。这种方法不仅允许开发人员构建编排,还可以像在传统软件开发周期中评估和迭代代码一样评估和迭代他们的提示。

……

阅读全文