news 2026/5/13 12:24:35

基于Azure AI Search与OpenAI构建企业级智能问答系统实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Azure AI Search与OpenAI构建企业级智能问答系统实战指南

1. 项目概述:当企业级搜索遇上生成式AI

如果你正在为如何让公司内部的知识库、产品文档或客服系统变得更“聪明”而头疼,那么你很可能已经听说过或将接触到这个项目:Azure-Samples/azure-search-openai-demo。这不仅仅是一个简单的代码示例,它是一个完整的、生产就绪的“样板间”,展示了如何将传统的企业级搜索(Azure AI Search)与前沿的生成式AI(Azure OpenAI Service)无缝集成,从而构建出能够“理解问题并生成答案”的智能应用。

简单来说,这个项目解决的核心痛点是:传统的关键词搜索在面对复杂、口语化或需要综合多份文档信息的问题时,往往力不从心。用户输入“我们产品的退款政策是什么?”,传统搜索可能只是返回一堆包含“退款”、“政策”关键词的PDF或网页链接,用户需要自己点开一个个文件去翻找。而这个Demo所构建的系统,则能直接理解你的问题,从海量文档中精准定位相关信息,并组织成一段通顺、准确的文字回答你:“根据您的问题,我们的退款政策是:在购买后30天内,未拆封的产品可申请全额退款,具体流程请登录用户中心提交工单...”

我之所以花大量时间深入研究并部署这个项目,是因为它精准地踩中了当前企业数字化转型的关键需求——从“信息检索”到“知识问答”的升级。它不是一个玩具,其架构设计考虑了身份认证、数据分块、向量化、提示工程、引用溯源等企业级应用必须面对的问题。接下来,我将以一个实际部署者的视角,为你彻底拆解这个项目的里里外外,从设计思路到每一步的实操细节,再到我踩过的坑和总结出的调优经验。

2. 核心架构与设计思路拆解

这个Demo的官方名称是“Azure OpenAI + Azure AI Search 聊天应用示例”,但它的价值远不止“聊天”。其核心设计思想是构建一个“检索增强生成”(Retrieval-Augmented Generation, RAG)系统。RAG是当前解决大模型“幻觉”(即编造信息)和知识滞后问题的首选架构。它的工作流程可以概括为:用户提问 → 系统检索相关文档片段 → 将片段和问题一起交给大模型 → 大模型基于提供的“证据”生成答案

2.1 技术栈选型背后的逻辑

项目选择了Azure全家桶,这并非偶然,而是基于企业级场景的深度考量:

  1. Azure AI Search(原Azure Cognitive Search): 这是系统的“记忆中枢”。它不仅仅是一个搜索引擎,更是一个强大的AI就绪的数据平台。它原生支持向量搜索(Vector Search),这意味着我们可以将文档和查询都转换成高维向量(由嵌入模型生成),然后进行相似度匹配。这种基于语义的搜索,比传统关键词搜索更能理解“笔记本电脑”和“便携式电脑”是同一个意思。选择它的理由很充分:与Azure生态无缝集成、托管服务免运维、支持混合搜索(同时使用关键词和向量)、具备完善的安全和权限控制。

  2. Azure OpenAI Service: 这是系统的“大脑”。项目主要使用其中的两个模型:

    • 嵌入模型(如text-embedding-ada-002: 负责将文本(无论是用户问题还是文档片段)转换成向量。这个步骤是语义搜索的基石。
    • 大语言模型(如gpt-35-turbogpt-4: 负责最终的答案生成和对话。选择Azure OpenAI而非直接调用OpenAI API,主要出于企业合规、数据安全(数据不出Azure区域)、网络稳定性以及与企业现有Azure Active Directory (AAD) 认证集成的便利性。
  3. 应用层(Python/JavaScript): 项目提供了Python和JavaScript(前端+后端)两种实现。Python版本更适合作为后端API服务或进行快速原型验证;JavaScript全栈版本则提供了一个开箱即用的Web聊天界面。选择哪种取决于你的团队技术栈和部署目标。我强烈建议从JavaScript版本开始,因为它包含了完整的前后端交互、流式响应等现代化功能。

这个技术栈组合确保了整个数据流都在Azure云内部完成,满足了企业对数据主权、安全性和集成度的要求,是构建企业内部智能助手的黄金标准方案。

2.2 数据流与核心组件交互

理解数据如何在各个组件间流动,是掌握这个系统的关键。整个过程可以分为“数据准备”和“问答推理”两个管道。

数据准备管道(一次性或定期运行):

  1. 原始文档: 你的知识库,可以是一堆PDF、Word、PPT、HTML或纯文本文件。
  2. 文档解析与分块: 系统使用Azure AI Document Intelligence(可选)或本地库解析文档内容,并将其切割成大小适中的“块”(Chunks)。分块策略至关重要,块太大则检索不精准,块太小则上下文信息可能不完整。项目默认策略是基于标记(Markdown)标题进行智能分块,这比简单的固定长度分块效果更好。
  3. 向量化: 每个文本块通过调用Azure OpenAI的嵌入模型,被转换成一个1536维的向量(以text-embedding-ada-002为例)。
  4. 索引构建: 将文本块的原内容、元数据(如来源文件名、页码)以及对应的向量,一并存入Azure AI Search的索引中。这个索引就是系统知识的核心载体。

问答推理管道(每次用户提问时触发):

  1. 用户提问: 用户在聊天界面输入问题。
  2. 查询向量化: 将用户的问题同样通过嵌入模型转换成向量。
  3. 混合检索: 在Azure AI Search索引中,同时执行向量搜索(寻找与问题向量最相似的文本块)和可选的关键词搜索(作为补充和精排)。系统会返回相关性最高的前k个文本块(例如,前5个)。
  4. 提示工程与答案生成: 将用户的问题和检索到的文本块(作为“证据”或“上下文”)组合成一个精心设计的提示(Prompt),发送给Azure OpenAI的大语言模型(如GPT-4)。这个Prompt通常会包含指令,例如:“请仅根据以下提供的上下文信息来回答问题。如果上下文信息不足以回答问题,请直接说‘根据现有信息无法回答’。” 这极大地减少了模型胡编乱造的可能。
  5. 流式响应与引用溯源: 模型生成的答案以流(Stream)的形式实时返回给前端,提供更好的用户体验。同时,答案中会标注引用的来源(例如,来自哪个文件的第几页),让回答的可信度倍增。

3. 从零到一的完整部署实操指南

理论讲完,我们进入实战环节。我将以最流行的JavaScript 全栈版本为例,带你走一遍从环境准备到成功对话的完整流程。请确保你有一个可用的Azure订阅,并已申请到Azure OpenAI服务的访问权限。

3.1 前期环境与资源准备

这一步的目标是在Azure门户上创建好所有必需的云资源。

  1. 创建资源组: 在Azure门户中,创建一个新的资源组(例如rg-chatgpt-search-demo),这有助于统一管理后续创建的所有资源。

  2. 部署Azure OpenAI资源

    • 在市场中搜索“Azure OpenAI”并创建。
    • 选择上一步创建的资源组。
    • 给资源起个名字,如oai-demo-eastus
    • 区域建议选择East US 2West Europe,这些区域模型部署比较全。
    • 定价层选择“Standard S0”。
    • 创建完成后,进入该资源,在“密钥和终结点”页面,记录下终结点和其中一个密钥。这是后续连接的关键。
  3. 部署模型: 在Azure OpenAI Studio中,为你的资源部署所需的模型。

    • 进入“部署”页面,点击“创建新部署”。
    • 部署一个聊天模型:选择模型gpt-35-turbo(或gpt-4),部署名称填gpt-35-turbo。这个名称将在代码中引用。
    • 部署一个嵌入模型:再次创建新部署,选择模型text-embedding-ada-002,部署名称填text-embedding-ada-002
  4. 创建Azure AI Search服务

    • 在市场中搜索“Azure AI Search”并创建。
    • 同样放在之前的资源组里。
    • 服务名称全局唯一,如aisearch-demo-xxx
    • 位置选择与OpenAI资源相同或相近的区域,以减少延迟。
    • 定价层:对于Demo,BasicStandard S1足够。生产环境需根据数据量和QPS选择更高层级。
    • 创建完成后,记录其服务名称管理密钥(在“密钥”页面)。
  5. (可选)创建Azure Blob Storage: 如果你的原始文档在本地,可以跳过此步,部署脚本支持从本地文件夹上传。但如果你希望构建一个能持续从云存储同步数据的管道,则需要创建。创建时,同样建议放在同一资源组和区域。

3.2 本地开发环境配置与代码获取

  1. 克隆项目代码

    git clone https://github.com/Azure-Samples/azure-search-openai-demo.git cd azure-search-openai-demo
  2. 切换到JavaScript版本

    cd scripts # 项目根目录的scripts文件夹下包含了各种语言的部署脚本 # 我们主要关注js版本
  3. 环境配置

    • 在项目根目录,复制./.env.example文件为./.env
    • 用你喜欢的编辑器打开./.env文件,填入之前记录的所有关键信息:
      # Azure OpenAI AZURE_OPENAI_API_KEY=你的OpenAI密钥 AZURE_OPENAI_API_INSTANCE_NAME=你的OpenAI服务名称(不含 .openai.azure.com) AZURE_OPENAI_API_DEPLOYMENT_NAME_GPT35=gpt-35-turbo # 你部署的聊天模型名称 AZURE_OPENAI_API_DEPLOYMENT_NAME_ADA=text-embedding-ada-002 # 你部署的嵌入模型名称 AZURE_OPENAI_API_VERSION=2024-02-15-preview # 使用较新的API版本 # Azure AI Search AZURE_SEARCH_SERVICE_ENDPOINT=https://你的搜索服务名称.search.windows.net AZURE_SEARCH_INDEX_NAME=gptkbindex # 索引名,可自定义 AZURE_SEARCH_ADMIN_KEY=你的搜索服务管理密钥 # 应用配置 AZURE_TENANT_ID=你的Azure租户ID(如果启用AAD认证则需要) AZURE_USE_AUTH=false # 是否启用身份认证,Demo可以先设为false AZURE_SERVER_PORT=3000 # 后端服务端口

    重要提示.env文件包含敏感信息,绝对不要将其提交到Git等版本控制系统。项目根目录的.gitignore文件通常已将其忽略。

3.3 运行部署脚本与数据导入

项目提供了一个极其方便的 PowerShell 脚本(也提供了Bash脚本)来一键完成所有繁重工作。

  1. 运行准备脚本

    • 如果你在Windows上,以管理员身份打开PowerShell,导航到./scripts目录。
    • 执行脚本:
      .\deploy.ps1
    • 脚本会交互式地引导你:
      • 选择编程语言:输入js
      • 输入你的Azure订阅ID。
      • 输入之前创建的资源组名称。
      • 脚本会自动检测或让你选择区域、OpenAI资源、搜索资源等。
      • 最关键的一步:选择数据源。脚本会问你是否要运行“数据准备”步骤。对于首次运行,必须选择“是”
      • 接着,它会让你选择数据来源。你可以选择:
        • local: 使用项目自带的示例数据(./data目录下的一些文档)。
        • 提供你自己的本地文件夹路径。
        • 或者指定一个Azure Blob Storage的SAS URL。
      • 之后,脚本会自动完成以下所有工作:
        • 在Azure AI Search中创建配置好的索引(包含文本、向量等字段)。
        • 启动一个临时的Python处理环境。
        • 读取你指定的文档,进行解析、分块、向量化。
        • 将处理好的数据块和向量上传到Azure AI Search索引中。

    这个过程可能需要几分钟到几十分钟,取决于你的文档数量和大小。当你在终端看到类似“Data preparation completed successfully”的提示时,就说明你的“知识库”已经构建完毕。

  2. 启动应用: 数据准备完成后,脚本会提示你是否要启动应用。选择“是”,它会自动安装前端和后端的依赖(npm install),并同时启动后端服务器(在./app目录)和前端开发服务器(在./app/frontend目录)。 最终,你的默认浏览器会自动打开http://localhost:3000,一个简洁的聊天界面就呈现在你面前了。

3.4 初体验与功能验证

在聊天界面中,你可以开始提问了。尝试问一些基于你上传文档内容的问题。例如,如果你使用了默认的示例数据(一些关于Azure的文档),可以问:

  • “什么是Azure Blob Storage?”
  • “如何创建一个Azure虚拟机?”
  • “请总结一下Azure AI Search的功能。”

观察系统的回答:

  1. 流式响应: 答案应该是一个字一个字地“打”出来,体验流畅。
  2. 引用来源: 在答案的末尾或侧边栏,你应该能看到“引用”部分,列出了答案所依据的文档片段及其来源(文件名、章节等)。点击引用可以展开查看原文。
  3. 遵循指令: 尝试问一个文档中绝对没有的问题,比如“明天的天气怎么样?”。一个良好配置的系统应该回答“根据提供的上下文信息,我无法回答这个问题。”或类似内容,而不是编造一个天气预报。

至此,一个功能完整的企业级智能问答应用就已经在你的本地环境和Azure云上跑起来了。

4. 核心配置深度解析与调优经验

部署成功只是第一步。要让这个系统在实际业务中发挥最大价值,必须深入理解其核心配置并进行精细调优。以下是我在多个项目中总结出的关键点。

4.1 索引架构设计:数据如何被“记住”

Azure AI Search的索引(Index)相当于数据库的表结构,它的设计直接决定了检索的效率和精度。通过查看脚本生成的索引定义(通常在./scripts下的data.json或部署日志中),我们可以看到其核心字段:

字段名类型说明调优要点
idEdm.String文档块的唯一标识。确保唯一性,通常由源文件路径和块序号生成。
contentEdm.String文本块的实际内容。这是检索和生成答案的原材料,分块质量直接影响此字段。
sourcepageEdm.String源文件名称。用于引用溯源。可考虑增加更细粒度的信息,如sourcepage: “用户手册.pdf#page=5”
sourcefileEdm.String源文件路径/URL。同上。
embeddingCollection(Edm.Single)文本块的向量表示(1536维)。必须与使用的嵌入模型维度匹配。text-embedding-ada-002固定为1536维。
categoryEdm.String文档类别(可选)。强烈建议添加。可用于过滤,例如只从“技术文档”或“客服日志”中检索。
titleEdm.String文档标题(可选)。有助于提升检索相关性,可在提示词中利用。

调优心得

  • 添加业务元字段: 除了默认字段,务必根据业务需求添加自定义字段。例如,添加department(部门)、product_version(产品版本)、publish_date(发布日期)。这样可以在用户提问时,通过前端或提示词附加过滤器,实现精准的垂直搜索。例如:“请从最新版的V2.0用户手册中查找...”。
  • 向量字段配置: 在索引定义中,embedding字段必须配置为可搜索,并且其vectorSearchProfile需指向一个配置好的向量搜索配置,其中定义了使用的向量化算法(通常是HNSW)和距离度量(cosine余弦相似度最常用)。这些配置脚本已帮你设置好,但了解其原理有助于排查问题。

4.2 文档分块策略:艺术与科学的结合

分块是RAG系统性能的“胜负手”。项目默认采用基于Markdown标题的递归分块,这是一个很好的起点,但并非万能。

  1. 默认策略分析: 它使用langchain库的MarkdownHeaderTextSplitter,按照标题层级(如#,##)将文档分割成语义相对完整的部分。这对于结构良好的技术文档、手册非常有效。
  2. 常见问题与策略
    • 问题:答案不完整。可能因为答案所需信息被分割在了两个相邻的块中。
      • 对策: 使用重叠分块。即在分块时,让相邻的块有一小部分文本重叠(例如100-200个字符)。这能保证边界概念不被切断。你可以在./scripts/prepdocs.py(数据准备脚本)中调整overlap参数。
    • 问题:检索到无关内容。可能因为块太大,包含了多个不相关的主题。
      • 对策: 减小块大小(chunk_size)。对于密集检索,通常建议在256-512个标记(Token)之间。但需要平衡:块太小会失去上下文,太大则降低精度。这是一个需要根据你的文档类型(法律条文 vs. 技术博客)进行实验的参数。
    • 问题:非结构化文档(如纯文本、对话记录)
      • 对策: 切换到按固定长度分块(RecursiveCharacterTextSplitter),并结合句子边界进行切分,尽量保证句子的完整性。
  3. 混合分块策略: 对于复杂文档库,可以采用多级索引。例如,同时存储“粗粒度块”(用于快速定位相关章节)和“细粒度块”(用于精准定位细节),在检索时进行融合。

我的经验: 没有“最好”的分块策略。务必为你的数据集建立评估基准。准备一组标准问题(Q&A),然后尝试不同的分块大小、重叠度和策略,观察检索到的前k个块的召回率(Recall)和答案的准确性。这是一个迭代的过程。

4.3 提示工程:如何与模型高效“对话”

系统的智能程度,很大程度上取决于你如何“问”模型。项目中的提示模板位于后端代码中(例如在./app/backend的某个路由处理文件中),核心部分通常如下:

你是一个智能助手,专门帮助用户解答基于提供文档的问题。 请严格根据以下“来源”部分提供的上下文信息来回答问题。 如果上下文信息不足以回答问题,请直接说“根据现有信息无法回答”。 不要使用你自己已有的知识。 如果上下文信息足够,请用清晰、有条理的语言进行总结和回答,并在答案末尾注明引用的来源编号。 上下文来源: {context} 问题:{question}

调优要点

  1. 角色设定(System Message)你是一个...助手这句话很重要,它设定了模型的“人设”和行为边界。你可以将其具体化,如“你是一名专业的IT技术支持工程师,负责解答公司内部Azure云服务的使用问题。”
  2. 指令清晰度: “严格根据...”、“如果不足...”、“不要使用...”这些指令必须强硬、明确,以最大限度抑制幻觉。
  3. 上下文格式化{context}是检索到的文本块拼接而成。确保每个块前面有清晰的来源标识(如[来源1] ...),这有助于模型理解和引用。
  4. 思维链(Chain-of-Thought): 对于复杂问题,可以鼓励模型分步思考。例如在提示词中加入:“请先一步步分析问题,再从上下文中寻找对应证据,最后组织答案。” 这有时能提升复杂推理的准确性。
  5. 温度(Temperature)和最大令牌数(Max Tokens): 在调用OpenAI API时,temperature参数控制创造性(通常设为0.1-0.3以获得更确定性的答案),max_tokens控制答案长度。需根据场景调整。

一个高级技巧——后处理重排(Rerank): 有时,向量搜索返回的前k个块,在语义上相关,但对于回答问题可能不是最直接的。可以引入一个轻量级的“重排模型”(如BAAI/bge-reranker-large),对检索到的候选块进行二次打分和排序,将最相关的1-2个块放在最前面,再送给大模型。这能显著提升答案质量,尤其是当k值设置较大时。

5. 生产级部署考量与安全加固

Demo跑在本地很顺畅,但要真正上线服务内部或外部用户,还有几道关键的坎要过。

5.1 身份认证与授权

默认配置(AZURE_USE_AUTH=false)是没有任何防护的,这在公网环境极其危险。

  1. 启用Azure AD认证

    • AZURE_USE_AUTH设为true
    • 在Azure门户中,为你的后端应用(App Service)注册一个应用(App Registration),并配置重定向URI。
    • 在前端代码中,集成@azure/msal-browser库,实现用户登录并获取访问令牌。
    • 后端API需要验证该令牌。项目JavaScript版本已包含此逻辑的框架,你需要填充你的租户ID、客户端ID等配置。
    • 这样,只有你企业AD内的用户才能访问应用。
  2. API密钥管理: 前端不应直接持有访问Azure OpenAI或Azure AI Search的管理密钥。所有对AI服务的调用都应通过你自己的后端API进行。后端从环境变量或安全的密钥管理服务(如Azure Key Vault)读取密钥。这样即使前端代码暴露,密钥也不会泄露。

5.2 性能、成本与监控优化

  1. 缓存策略

    • 嵌入缓存: 文档块的嵌入向量生成是耗时的(也有成本)。对于静态文档库,向量一旦生成即可永久缓存,无需重复计算。确保你的数据准备脚本有去重和增量更新的能力。
    • 答案缓存: 对于常见、重复的问题(如“公司地址是什么?”),可以在后端(使用Redis等)缓存问题-答案对,直接返回,避免重复调用昂贵的GPT-4 API。
  2. 成本控制

    • 模型选型: 在保证效果的前提下,优先使用gpt-35-turbo而非gpt-4,成本相差一个数量级。
    • 令牌限制: 严格控制提示词(上下文+问题)和答案的最大令牌数。过长的上下文不仅贵,还可能让模型注意力分散。
    • 使用情况监控: 在Azure OpenAI服务中设置预算警报,并定期查看分析面板,了解各模型的调用量、令牌消耗和成本。
  3. 应用监控与日志

    • 为后端服务(如部署到Azure App Service)启用Application Insights。记录每一次用户问答的元数据:用户ID(匿名化)、问题、检索到的文档ID、生成的答案、令牌使用量、响应时间。这有助于分析用户真实需求、发现检索系统的短板(哪些问题总回答不好),并进行持续优化。

5.3 从Demo到生产:架构演进

本地开发模式不可用于生产。典型的演进路径是:

  1. 容器化: 将前端(静态文件)和后端(Node.js/ Python服务)分别构建为Docker镜像。
  2. 部署到云服务
    • 方案A(全托管): 前端部署到Azure Storage静态网站Azure App Service(静态文件)。后端部署到Azure App Service(容器或代码)或Azure Container Apps。这是最简单的方式。
    • 方案B(微服务): 将数据准备管道(prepdocs.py)抽象成一个独立的、由事件(如Blob Storage文件上传)触发的Azure FunctionAzure Container Instances任务。将聊天API部署为独立的服务。
  3. CI/CD流水线: 使用Azure DevOps PipelinesGitHub Actions,实现代码提交后自动构建、测试和部署。

6. 常见问题排查与实战技巧实录

即使按照指南操作,你也可能会遇到一些坑。以下是我在多次部署和教学中遇到的高频问题及解决方案。

6.1 部署与运行阶段问题

问题现象可能原因排查步骤与解决方案
运行deploy.ps1脚本时报错,提示找不到模块或命令。1. PowerShell执行策略限制。
2. 本地缺少依赖(如Azure CLI、Python)。
1. 以管理员身份运行PowerShell,执行Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
2. 确保已安装 Azure CLI 并已登录 (az login)。
3. 脚本通常会检查并提示安装Python依赖,请确保网络通畅。
数据准备步骤失败,提示OpenAI API错误(如429, 401)。1. Azure OpenAI资源配额用尽或未开通。
2. API密钥或终结点错误。
3. 模型部署名称不对。
1. 登录Azure门户,检查OpenAI资源的“配额”状态,确保有足够令牌配额。
2. 仔细核对.env文件中的AZURE_OPENAI_API_KEYAZURE_OPENAI_API_INSTANCE_NAME终结点是https://[实例名].openai.azure.com/,但配置里只需填[实例名]
3. 进入Azure OpenAI Studio,确认gpt-35-turbotext-embedding-ada-002模型已成功部署,且部署名称与.env文件中的完全一致(区分大小写)。
应用启动后,前端能打开但无法回答问题,浏览器控制台报错(如404, 500)。1. 后端服务未成功启动。
2. 环境变量未正确加载。
3. 索引不存在或名称不匹配。
1. 检查终端,确保后端Node.js服务(通常在3001端口)和前端开发服务器(3000端口)都无报错并成功启动。
2. 确认后端服务读取到了正确的.env文件。可以在后端启动日志中查看输出的配置信息(部分敏感信息会被屏蔽)。
3. 登录Azure门户,进入你的AI Search服务,查看“索引”选项卡,确认是否存在脚本创建的索引(默认gptkbindex),且索引中有文档数据。
可以回答问题,但答案质量很差,经常“胡言乱语”或说“无法回答”。1. 检索环节失败,没有返回有效的上下文。
2. 提示词(Prompt)设计不佳。
3. 文档分块策略不合适。
1.首先检查检索结果: 这是最关键的一步。修改后端代码,在调用搜索API后,将检索到的原始文本块和其相关性分数打印到日志中。看看系统到底“看”到了什么。如果返回的块完全不相关,问题出在搜索(向量/关键词)或分块上。
2.检查提示词: 确认传递给模型的完整提示词是什么,是否包含了清晰的指令和正确的上下文。
3.简化测试: 上传一个只有一页简单内容的文档(如公司简介),问一个直接能从该页找到答案的问题。如果还不行,就是基础流程有问题。如果可以,再逐步增加文档复杂度,定位分块策略的问题。

6.2 效果优化阶段技巧

  • 技巧一:利用“引用”功能进行调试。当答案不准时,不要只看答案,一定要点开答案下方的引用来源,看看模型是基于哪些原文片段生成的答案。很多时候你会发现,模型“忠实”地根据你给的错误上下文生成了答案。问题出在检索,不在生成。
  • 技巧二:开启混合搜索(Hybrid Search)。在Azure AI Search中,纯向量搜索对某些关键词匹配、缩写、代码片段可能不敏感。确保你的搜索查询配置中同时使用了向量搜索和传统的关键词搜索(BM25),并将两者的结果进行融合计分。这能显著提升检索的鲁棒性。在项目的搜索查询参数中,寻找queryType: 'semantic'queryType: 'simple'的配置,尝试改为queryType: 'semantic'(如果已配置语义搜索)或确保vectorssearch参数都被合理使用。
  • 技巧三:调整检索数量(top_k)。默认可能只检索前3或前5个片段。对于复杂问题,可能需要更多的上下文。尝试逐步增加这个值(例如到10),观察答案质量变化。注意,这会增加提示词长度和成本。
  • 技巧四:清洗和预处理你的数据。Garbage in, garbage out. 在导入文档前,尽量对PDF、图片中的文字进行OCR校正,移除无关的页眉页脚、水印、乱码。结构清晰、干净的数据是高质量RAG的基石。

这个项目是一个强大的起点,但它不是终点。围绕它,你可以扩展出对话历史管理、多轮追问、基于答案的二次检索(追问时只检索与历史相关的信息)、甚至与业务系统(如CRM、工单系统)联动的智能体(Agent)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 12:23:10

基于确定性规则与AI辅助的PR风险扫描工具设计与实践

1. 项目概述:一个基于确定性规则的PR风险扫描工具在团队协作中,代码审查(Code Review)是保障代码质量、控制风险的核心环节。然而,随着项目规模扩大和变更频率加快,人工审查的负担越来越重,尤其…

作者头像 李华
网站建设 2026/5/13 12:22:26

REPENTOGON终极安装指南:从零开始打造你的以撒MOD开发环境

REPENTOGON终极安装指南:从零开始打造你的以撒MOD开发环境 【免费下载链接】REPENTOGON Script extender for The Binding of Isaac: Repentance 项目地址: https://gitcode.com/gh_mirrors/re/REPENTOGON REPENTOGON是《以撒的结合:悔改》最强大…

作者头像 李华
网站建设 2026/5/13 12:21:51

技能管理框架实战:从封装到集成,构建可组合的AI应用能力

1. 项目概述与核心价值 最近在和一些做AI应用开发的朋友交流时,发现一个挺有意思的现象:大家手头都攒了不少好用的工具、脚本或者API,但真要用的时候,要么是忘了具体怎么调用,要么是参数记不清,要么就是得翻…

作者头像 李华
网站建设 2026/5/13 12:21:24

SwiftUI入门实战:用List和HStack快速搭建你的第一个iOS App界面

SwiftUI入门实战:用List和HStack快速搭建你的第一个iOS App界面 当你第一次打开Xcode准备开发iOS应用时,面对UIKit复杂的视图层级和繁琐的约束代码,很容易感到无从下手。SwiftUI的出现彻底改变了这一局面——它让界面开发变得像搭积木一样直观…

作者头像 李华