AI:Azure OpenAI 基于你的数据

Azure OpenAI 自然语言处理(NLP)和完成功能集成为提高用户工作效率提供了重大潜力。 通过利用适当的提示和规则,AI 助手可以有效地生成各种形式的通信,例如电子邮件、短信等。 此功能可提高用户效率和简化工作流。

虽然此功能本身非常强大,但在某些情况下,用户可能需要根据公司的自定义数据生成完成。 例如,你可能有一系列产品手册,在用户协助客户解决安装问题时可能很难导航。 或者,你可以维护与医疗保健权益相关的一组全面的常见问题解答(常见问题解答),这可能证明用户难以阅读并获取他们需要的答案。 在这些情况下,Azure OpenAI 服务使你能够利用自己的数据生成完成情况,确保对用户问题做出更定制和上下文准确的响应。

下面是 Azure OpenAI 文档中“自带数据”功能的快速概述。

注释

基于自有数据的 Azure OpenAI 的主要特点之一是它能够以增强模型输出的方式检索和利用数据。 基于自有数据的 Azure OpenAI 与 Azure AI 搜索相配合,可以根据用户输入和提供的对话历史记录确定从指定数据源检索哪些数据。 然后,此数据经过增强,作为提示重新提交到 OpenAI 模型,并将检索到的信息追加到原始提示中。 尽管检索到的数据将追加到提示中,但生成的输入仍由模型处理,就像处理任何其他提示一样。 检索数据并将提示提交到模型后,模型将使用此信息提供补全。

通过学习本练习,你将能够:

  • 使用 Azure AI Foundry 门户创建自定义数据源。
  • 使用 Azure AI Foundry 门户部署嵌入模型。
  • 上传自定义文档。
  • 在聊天操场中启动聊天会话,以试验基于自己的数据生成完成。
  • 浏览使用 Azure AI 搜索和 Azure OpenAI 生成基于你自己的数据完成的代码。

让我们首先在 Azure AI Foundry 中部署嵌入模型和添加自定义数据源。

将自定义数据源添加到 Azure AI Foundry

  1. 导航到 Azure OpenAI Studio 并使用有权访问 Azure OpenAI 资源的凭据登录。

  2. 从导航菜单中选择 “部署 ”。

  3. 选择“部署模型”-->工具栏中的“部署基本模型”。

  4. 从模型列表中选择 文本嵌入-ada-002 模型,然后选择 “确认”。

  5. 选择以下选项:

    • 部署名称: text-embedding-ada-002
    • 模型版本: 默认
    • 部署类型: 标准
    • 每分钟令牌速率限制 (千) 值设置为 120K
    • 内容筛选器: DefaultV2
    • 启用动态引号: 已启用
  6. 选择“部署”按钮

  7. 创建模型后,从导航菜单中选择“ 开始 ”转到欢迎屏幕。

  8. 在欢迎屏幕上找到“ 自带数据 ”磁贴,然后选择“ 立即试用”。

    Azure OpenAI Studio 自带数据

  9. 选择 “添加数据 ”,然后选择 “添加数据源”。

  10. “选择数据源 ”下拉列表中,选择“ 上传文件”。

  11. “选择 Azure Blob 存储资源 ”下拉列表下,选择“ 创建新的 Azure Blob 存储资源”。

  12. “订阅 ”下拉列表中选择 Azure 订阅。

  13. “选择 Azure Blob 存储资源 ”下拉列表下,选择“ 创建新的 Azure Blob 存储资源”。

  14. 这会将你带到Azure 门户,你可以在其中执行以下任务:

    • 输入存储帐户的唯一名称,例如 byodstorage[姓氏]。
    • 选择靠近你的位置的区域。
    • 选择“ 审阅 ”,然后选择 “创建”。
  15. 创建 Blob 存储资源后,返回到 Azure AI Foundry 对话框,然后从 “选择 Azure Blob 存储资源”下拉列表中选择新创建的 Blob 存储资源 。 如果未列出它,请选择下拉列表旁边的刷新图标。

  16. 需要启用跨域资源共享(CORS),以便访问存储帐户。 在 Azure AI Foundry 对话框中选择 “打开 CORS ”。

    Azure OpenAI Studio 自带数据打开 CORS

  17. “选择 Azure AI 搜索资源 ”下拉列表下,选择“ 创建新的 Azure AI 搜索资源”。

  18. 这会将你带回Azure 门户,你可以在其中执行以下任务:

    • 输入 AI 搜索资源的唯一名称,例如 byodsearch-[姓氏]。
    • 选择靠近你的位置的区域。
    • “定价层 ”部分中,选择“ 更改定价层 ”,然后选择“ 基本 ”,然后选择“ 选择”。 不支持免费层,因此在本教程结束时,你将清理 AI 搜索资源。
    • 选择“ 审阅 ”,然后选择 “创建”。
  19. 创建 AI 搜索资源后,转到“资源 概述 ”页,并将 URL 值复制到本地文件。

    Azure OpenAI Studio AI 搜索 URL

  20. 在导航菜单中选择 “设置 ”-->“键 ”。

  21. “API 访问控制 ”页上,选择“ 两者 ”以允许使用托管标识或密钥访问服务。 出现提示时选择“是”。

    注释

    尽管我们将在本练习中使用 API 密钥,因为添加角色分配最多可能需要 10 分钟,但可以稍作额外努力,使系统分配的托管标识能够更安全地访问服务。

  22. 在左侧导航菜单中选择 “密钥 ”,并将 “主管理密钥 ”值复制到本地文件。 稍后在练习中需要 URL 和键值。

  23. 在导航菜单中选择 “设置 ”-->语义排名器 ,并确保已选择 “免费 ”。

    注释

    若要检查语义排名器在特定区域中是否可用,请检查 Azure 网站上的“ 产品可用 区域”页,以查看区域是否已列出。

  24. 返回到“Azure AI Foundry 添加数据 ”对话框,然后从 “选择 Azure AI 搜索资源 ”下拉列表中选择新创建的搜索资源。 如果未列出它,请选择下拉列表旁边的刷新图标。

  25. 输入输入索引名称byod-search-index 的值。

  26. 选中“ 将此搜索资源添加矢量搜索 ”复选框。

  27. “选择嵌入模型 ”下拉列表中,选择前面创建的 text-embedding-ada-002 模型。

  28. 在“ 上传文件 ”对话框中,选择“ 浏览文件”。

  29. 导航到项目的 客户文档 文件夹(位于项目的根目录),然后选择以下文件:

    • 时钟 A102 安装 Instructions.docx
    • 公司 FAQs.docx

    注释

    此功能目前支持以下文件格式进行本地索引创建:.txt、.md、.html、.pdf、.docx和.pptx。

  30. 选择“上传文件”。 这些文件将上传到前面创建的 Blob 存储资源的 fileupload-byod-search-index 容器中。

  31. 选择 “下一步 ”转到 “数据管理 ”对话框。

  32. “搜索类型 ”下拉列表中,选择“ 混合 + 语义”。

    注释

    此选项支持关键字和矢量搜索。 返回结果后,使用深度学习模型将辅助排名过程应用于结果集,从而提高用户的搜索相关性。 若要了解有关语义搜索的详细信息, 请查看 Azure AI 搜索文档中的语义搜索

  33. 确保 “选择大小 ”值设置为 1024

  34. 选择“下一步”。

  35. 对于 Azure 资源身份验证类型,请选择 API 密钥。 详细了解如何在 Azure AI 搜索身份验证文档中选择正确的身份验证类型。

  36. 选择“下一步”。

  37. 查看详细信息,然后选择“ 保存并关闭”。

  38. 上传自定义数据后,数据将编制索引并可用于 聊天场。 此过程可能需要几分钟时间。 完成后,请继续下一部分。

在聊天操场中使用自定义数据源

  1. 在 Azure OpenAI Studio 中找到页面的 聊天会话 部分,并输入以下 用户查询

    What safety rules are required to install a clock?
    
  2. 提交用户查询后,应会看到如下所示的结果:

    Azure OpenAI Studio 聊天会话 - 时钟安装安全规则

  3. 展开聊天响应中的 1 个引用 部分,并注意到 “时钟 A102 安装 Instructions.docx 文件已列出,你可以将其选中以查看文档。

  4. 输入以下 用户消息

    What should I do to mount the clock on the wall?
    
  5. 应会看到如下所示的结果:

    Azure OpenAI Studio 聊天会话 - 时钟装载说明

  6. 现在,让我们试验公司常见问题解答文档。 在 “用户查询 ”字段中输入以下文本:

    What is the company's policy on vacation time?
    
  7. 应会看到该请求未找到任何信息。

  8. “用户查询 ”字段中输入以下文本:

    How should I handle refund requests?
    
  9. 应会看到如下所示的结果:

    Azure OpenAI Studio 聊天会话 - 常见问题解答结果

  10. 展开聊天响应中的 1 个引用 部分,注意 公司 FAQs.docx 文件已列出,你可以将其选中以查看文档。

  11. 选择聊天场工具栏中的“查看代码”。

    Azure OpenAI Studio 聊天会话 - 查看代码

  12. 请注意,可以在不同语言之间切换,查看终结点并访问终结点的密钥。 关闭“ 示例代码 ”对话框窗口。

    Azure OpenAI Studio 聊天会话 - 示例代码

  13. 打开聊天消息上方 的“显示原始 JSON ”切换开关。 请注意,聊天会话以类似于以下内容的消息开头:

    {
        "role": "system",
        "content": "You are an AI assistant that helps people find information."
    }
    
  14. 创建自定义数据源并在聊天操场中对其进行试验后,让我们看看如何在项目的应用程序中使用它。

在应用程序中使用“自带数据”功能

  1. 返回到 VS Code 中的项目并打开 .env 文件。 使用 AI Services 终结点、密钥和索引名称更新以下值。 在本练习中,你已将终结点和密钥复制到本地文件。

    AZURE_AI_SEARCH_ENDPOINT=<AI_SERVICES_ENDPOINT_VALUE>
    AZURE_AI_SEARCH_KEY=<AI_SERVICES_KEY_VALUE>
    AZURE_AI_SEARCH_INDEX=byod-search-index
    
  2. 上一练习 中,你启动了数据库、API 和应用程序。 还更新了 .env 该文件。 如果未完成这些步骤,请按照前面的练习结束时的说明继续操作。

  3. 应用程序加载到浏览器中后,选择应用程序右上角的 “聊天帮助 ”图标。

    聊天帮助图标

  4. 聊天对话框中应显示以下文本:

    How should I handle a company refund request?
    
  5. 选择“ 获取帮助 ”按钮。 应会看到之前在 Azure OpenAI Studio 中上传 的公司 FAQs.docx 文档返回的结果。 如果要阅读文档,可以在项目根目录 的“客户文档 ”文件夹中找到该文档。

  6. 将文本更改为以下内容,然后选择“ 获取帮助 ”按钮:

    What safety rules are required to install a clock?
    
  7. 应会看到之前在 Azure OpenAI Studio 中上传的 时钟 A102 安装 Instructions.docx 文档返回的结果。 此文档也位于项目根目录的客户 文档 文件夹中。

浏览代码

小窍门

如果使用的是 Visual Studio Code,可以通过选择以下方法直接打开文件:

  • Windows/Linux: Ctrl + P
  • Mac: Cmd + P

然后键入要打开的文件的名称。

  1. 返回到 Visual Studio Code 中的项目源代码。

  2. 打开 服务器/apiRoutes.ts 文件并找到 completeBYOD 路由。 在“聊天帮助”对话框中选择“ 获取帮助 ”按钮时,将调用此 API。 它会从请求正文中检索用户提示,并将其 completeBYOD() 传递给 服务器/openAI.ts 文件中的函数。 然后,结果将返回到客户端。

    router.post('/completeBYOD', async (req, res) => {
        const { prompt } = req.body;
    
        if (!prompt) {
            return res.status(400).json({ 
                status: false, 
                error: 'The prompt parameter must be provided.' 
            });
        }
    
        let result;
        try {
            // Call OpenAI to get custom "bring your own data" completion
        result = await completeBYOD(prompt);
        }
        catch (e: unknown) {
            console.error('Error parsing JSON:', e);
        }
    
        res.json(result);
    });
    
  3. 打开 服务器/openAI.ts 文件并找到函数 completeBYOD()

    async function completeBYOD(userPrompt: string): Promise<string> {
        const systemPrompt = 'You are an AI assistant that helps people find information in documents.';
        return await callOpenAI(systemPrompt, userPrompt, 0, true);
    }
    

    此函数具有以下功能:

    • userPrompt 参数包含用户键入到聊天帮助对话框中的信息。
    • systemPrompt 变量定义用于帮助人们查找信息的 AI 助手。
    • callOpenAI() 用于调用 Azure OpenAI API 并返回结果。 它传递 systemPromptuserPrompt 值以及以下参数:
      • temperature - 要包括在响应中的创造力量。 在这种情况下,用户需要一致的(较少创意)答案,因此该值设置为 0。
      • useBYOD - 一个布尔值,该值指示是否将 AI 搜索与 Azure OpenAI 一起使用。 在本例中,它设置为 true 使用 AI 搜索功能。
  4. callOpenAI() 函数接受用于 useBYOD 确定要调用的 OpenAI 函数的参数。 在这种情况下,它将设置为useBYODtrue调用函数getAzureOpenAIBYODCompletion()

    function callOpenAI(systemPrompt: string, userPrompt: string, temperature = 0, useBYOD = false) {
        const isAzureOpenAI = OPENAI_API_KEY && OPENAI_ENDPOINT && OPENAI_MODEL;
    
        if (isAzureOpenAI) {
            if (useBYOD) {
                return getAzureOpenAIBYODCompletion(systemPrompt, userPrompt, temperature);
            }
            return getAzureOpenAICompletion(systemPrompt, userPrompt, temperature);
        }
    
        return getOpenAICompletion(systemPrompt, userPrompt, temperature);
    }
    
  5. 在服务器/openAI.tsgetAzureOpenAIBYODCompletion()函数。 它与前面检查的 getAzureOpenAICompletion() 函数非常相似,但显示为单独的函数,以突出显示 Azure OpenAI 在 Azure OpenAI 中提供的“Azure OpenAI 数据”方案特有的一些主要差异。

    async function getAzureOpenAIBYODCompletion(systemPrompt: string, userPrompt: string, temperature: number): Promise<string> {
        const dataSources = [
            {
                type: 'azure_search',
                parameters: {
                    authentication: {
                        type: 'api_key',
                        key: AZURE_AI_SEARCH_KEY
                    },
                    endpoint: AZURE_AI_SEARCH_ENDPOINT,
                    index_name: AZURE_AI_SEARCH_INDEX
                }
            }
        ];
    
        const completion = await createAzureOpenAICompletion(systemPrompt, userPrompt, temperature, dataSources) as AzureOpenAIYourDataResponse;
        console.log('Azure OpenAI Add Your Own Data Output: \n', completion.choices[0]?.message);
        for (let citation of completion.choices[0]?.message?.context?.citations ?? []) {
            console.log('Citation Path:', citation.filepath);
        }
        return completion.choices[0]?.message?.content?.trim() ?? '';
    }
    

    请注意函数中的 getAzureOpenAIBYODCompletion() 以下功能:

    • 将创建一个 dataSources 属性,其中包含 AI 搜索资源的 keyendpoint以及 index_name 在本练习前面添加到 .env 文件的值
    • createAzureOpenAICompletion()函数使用 systemPromptuserPrompttemperature> 和dataSources值调用。 此函数用于调用 Azure OpenAI API 并返回结果。
    • 返回响应后,文档引文将记录到控制台。 然后,完成消息内容将返回到调用方。
  6. 在继续下一练习之前要考虑的几个最后要点:

    • 示例应用程序在 Azure AI 搜索中使用单个索引。 可以将多个索引和数据源与 Azure OpenAI 配合使用。 dataSources函数中的getAzureOpenAIBYODCompletion()属性可以更新为根据需要包含多个数据源。
    • 必须使用这种类型的方案仔细评估安全性。 用户不应能够提出问题并从他们无法访问的文档获取结果。
  7. 现在,你已了解 Azure OpenAI、提示、完成以及如何使用自己的数据,接下来让我们转到下一个练习,了解如何使用通信功能来增强应用程序。 若要了解有关 Azure OpenAI 的详细信息,请查看 Azure OpenAI 服务 培训内容入门。 有关将自己的数据与 Azure OpenAI 配合使用的其他信息,请参阅 Azure OpenAI 的数据 文档。

下一步