当前位置: 首页 > article >正文

基于Azure Cosmos DB与OpenAI构建企业级RAG智能问答应用实战

1. 项目概述构建一个基于向量数据库的智能对话应用最近在折腾一个挺有意思的项目想和大家分享一下如何用 Azure Cosmos DB 和 Azure OpenAI Service 来搭建一个真正能用的“副驾驶”应用。这个项目的核心思路就是把你的数据变成 AI 能理解的语言然后让 AI 基于这些数据和你进行有上下文、有记忆的智能对话。听起来有点复杂别担心我会把每一步都拆开揉碎了讲清楚。简单来说这个项目就是一个聊天应用但它不是普通的聊天机器人。它背后连接着你自己的知识库比如公司文档、产品手册、技术资料当你问它问题时它能从你的知识库里找到最相关的信息然后组织成通顺的回答告诉你。这比让 AI 凭空想象要靠谱得多回答的准确性和专业性也高得多。整个过程涉及到几个关键技术用 Azure OpenAI 把文本转换成向量一种数学表示用 Cosmos DB 的向量搜索功能快速找到最匹配的文档再用 Semantic Kernel 这个框架来优雅地管理整个对话流程和上下文。无论你是想做个内部知识问答助手还是想给自家产品加个智能客服这个架构都值得参考。2. 核心架构与设计思路拆解2.1 为什么选择“检索增强生成”架构这个项目的技术选型背后有一个非常明确的架构模式在支撑叫做“检索增强生成”。这是目前构建可靠企业级 AI 应用最主流的方案之一。它的核心思想很简单不让大语言模型去“记忆”或“编造”它不知道的事实而是当用户提问时先去外部的、可信的数据源里检索出相关的信息片段然后把问题和这些信息片段一起交给大语言模型让它基于这些材料来组织答案。我选择这个架构主要是为了解决大语言模型的两个固有短板幻觉和信息过时。模型可能会自信地编造一个听起来合理但完全错误的答案这就是幻觉。另外模型的训练数据有截止日期它无法知道那之后发生的事。通过 RAG我们把答案的“事实依据”牢牢锚定在我们自己维护的、最新的知识库上极大地提升了回答的可信度。在这个项目里Azure Cosmos DB 就是那个强大、可扩展的“外部知识库”而向量搜索则是从海量文档中瞬间找到最相关片段的“搜索引擎”。2.2 核心组件选型与考量整个应用由几个关键部件组成每个部件的选型都经过了仔细的权衡。首先是Azure Cosmos DB for NoSQL我选择它而不是单纯的向量数据库看中的是它的“多模”能力。我的业务数据比如用户订单、产品目录本来就可能存在 Cosmos DB 里现在它原生支持向量搜索意味着我可以在同一个数据库、甚至同一张表里既存业务数据又存文档的向量嵌入。数据一致性、运维复杂度都大大降低。而且 Cosmos DB 的全球分布和弹性扩展能力为应用未来的增长铺平了道路。其次是Azure OpenAI Service。直接用 OpenAI 的 API 行不行技术上可以但从企业级应用的角度看Azure OpenAI 提供了更重要的东西数据隐私与合规承诺、网络延迟优化如果你的其他资源都在 Azure 上、以及与 Azure Active Directory 集成的身份验证和精细的成本监控。特别是用于生成文本嵌入的text-embedding-ada-002模型和用于对话的 GPT 模型通过 Azure 服务调用在安全性和可控性上更让人放心。最后是Semantic Kernel。这是一个由微软推出的开源 SDK你可以把它理解为 AI 应用开发的“胶水”和“脚手架”。它抽象了与不同 AI 服务OpenAI, Azure OpenAI, Hugging Face 等的交互细节提供了插件Plugins、规划器Planner、记忆Memory等高级概念。在这个项目里我用它主要是为了优雅地管理“对话历史”上下文窗口以及标准化调用嵌入生成和聊天补全的流程。它让代码更清晰也更容易未来扩展功能。注意在项目初期务必在 Azure 门户中为你的 Cosmos DB for NoSQL 账户申请加入“向量搜索”的预览功能。这是一个必要的准入步骤如果没有开启后续的向量索引创建和查询都会失败。申请通常很快会通过。2.3 数据流与交互逻辑全景理解数据是如何流动的是掌握这个项目的关键。整个交互过程可以分解为以下几个步骤我画个简单的逻辑图在脑子里大家跟着走一遍知识库准备预处理阶段首先你需要有一批文档比如 Markdown、PDF、Word。通过一个后台处理程序调用 Azure OpenAI 的嵌入模型为每一段有意义的文本例如一个段落生成一个高维向量比如1536维同时将原文存储起来。这个“向量-原文”对会被写入 Cosmos DB 的一个特定容器中。用户提问查询阶段当用户在聊天界面输入一个问题比如“我们产品的退货政策是什么”应用不会直接把问题扔给 GPT。而是先做同样的事情把这个问题转换成向量。向量检索核心阶段应用拿着问题的向量去 Cosmos DB 中执行向量相似度搜索通常使用余弦相似度。Cosmos DB 会利用我们预先创建好的向量索引快速从成千上万的文档片段中找出与问题向量最相似的几个比如 top 3片段。提示词工程与上下文组装检索到的几个原文片段被组合成一个“上下文”。然后我们精心设计一个“提示词”其结构通常是“你是一个客服助手。请根据以下上下文信息回答问题。如果上下文里没有答案就说你不知道。上下文{检索到的原文片段}。问题{用户原始问题}。回答”生成与返回这个组装好的提示词被发送给 Azure OpenAI 的聊天补全模型如 GPT-4。模型基于我们提供的上下文生成回答最后这个回答呈现给用户。同时本次的“问题-回答”对会被作为历史记录保存下来并入下一次对话的上下文从而实现多轮对话的记忆。这个流程确保了答案的根源来自你的知识库并且通过提示词约束了模型的发挥范围既利用了模型的强大理解和生成能力又规避了它的主要缺陷。3. 环境准备与项目初始化实操3.1 前置条件与资源创建动手之前我们需要把“舞台”搭好。所有的服务都基于 Azure所以你需要一个有效的 Azure 订阅。如果还没有可以去官网注册一个通常有免费额度和试用金。第一步开通 Azure OpenAI 服务访问权限。这是一个需要申请的服务。在 Azure 门户中搜索“Azure OpenAI”点击创建你会发现需要提交申请。点击“申请访问”链接填写一个简单的表格说明你的使用场景比如“开发智能问答原型用于内部知识管理”。审批速度有时很快有时需要一两天所以这一步建议最先做。第二步创建 Azure OpenAI 资源。申请通过后在 Azure 门户创建 OpenAI 资源。创建时注意选择离你用户近的区域比如East US或Southeast Asia。创建完成后进入该资源在“密钥和终结点”页面你会看到终结点 URL 和两个 API 密钥。妥善保存它们我们后续配置会用到。接着你需要部署模型。在资源的“模型部署”页面点击“管理部署”至少需要部署两种模型一个聊天模型例如选择gpt-35-turbo(或gpt-4)给它起个部署名比如chat-gpt35。一个嵌入模型选择text-embedding-ada-002部署名起为text-embedding。第三步创建 Cosmos DB 账户并开启向量搜索预览。在 Azure 门户创建 Azure Cosmos DB 账户API 类型选择“NoSQL”。创建时同样注意区域选择。创建完成后进入资源按照要求所述左侧菜单“设置” - “功能” - 找到“Vector Search in Azure Cosmos DB for NoSQL” - 点击“启用”进行注册。这个预览功能是免费的但必须显式开启才能使用向量索引功能。第四步安装 Azure Developer CLI (azd)。这是一个非常棒的工具它能把项目的代码、基础设施配置IaC和部署流水线统一管理。根据你的操作系统从官网下载安装。安装后在终端运行azd version确认安装成功。3.2 使用 Azure Developer CLI 一键部署项目原作者提供了azd模板这极大地简化了部署。打开终端进入一个你准备存放项目代码的目录。登录 Azure执行azd auth login。这会打开浏览器让你完成 Azure 身份验证。这一步每个环境通常只需做一次。初始化项目执行azd init --template cosmosdb-chatgpt。这个命令会从 GitHub 拉取这个示例项目的代码和基础设施即代码Bicep模板到当前目录。azd会交互式地询问你一些信息比如环境名称例如dev、Azure 订阅和区域。它会根据你的选择在本地生成配置文件。配置环境变量在项目根目录你会找到一个azure.yaml和infra文件夹。但关键的配置比如 OpenAI 的密钥和终结点通常需要通过.env文件或azd的环境来设置。你可能需要查看代码中的appsettings.json或类似文件了解需要哪些参数。一个典型的做法是在执行azd up之前通过azd config set命令来设置这些值或者直接修改infra目录下的 Bicep 参数文件。执行部署最关键的一步运行azd up。这个命令会做三件大事预配基础设施它在你的 Azure 订阅里按照 Bicep 模板的定义自动创建所需的所有资源包括 App Service 计划、Web 应用、Cosmos DB 账户和数据库容器。它甚至会帮你开启 Cosmos DB 的向量搜索预览功能如果模板支持。构建应用代码它会在云端或本地取决于配置构建你的 .NET 应用打包成 Docker 容器。部署应用到云将构建好的容器镜像部署到 Azure App Service。整个过程可能需要 10 到 20 分钟。部署成功后终端会输出应用访问的 URL通常是一个.azurewebsites.net的域名。用浏览器打开它你的聊天应用界面就应该出现了。实操心得第一次运行azd up时可能会因为 Azure 资源提供商注册问题而失败。如果遇到关于Microsoft.DocumentDB或Microsoft.CognitiveServices的错误可以到 Azure 门户的“订阅” - “资源提供程序”里手动搜索并注册一下这些提供程序然后重试azd up。3.3 手动部署与代码结构解析如果你不想用azd或者想更深入地理解每一部分也可以手动部署。项目代码结构通常是这样的cosmosdb-chatgpt/ ├── src/ │ ├── ChatWebApp/ # 前端 Blazor 项目 │ └── ChatService/ # 后端 .NET Core Web API 项目 ├── scripts/ # 数据库初始化、数据导入脚本 ├── infra/ # Bicep/ARM 模板azd 使用 └── README.md手动部署步骤概要创建资源手动在 Azure 门户创建前述的所有资源App Service Plan、Linux 上的 Web App支持容器、Cosmos DB NoSQL 账户开启向量预览、Azure OpenAI 资源并部署模型。配置连接字符串在 Web App 的“配置” - “应用程序设置”中添加所有必要的连接字符串和密钥例如CosmosDbConnectionStringOpenAiEndpointOpenAiKeyOpenAiChatDeploymentName(你部署的聊天模型名如chat-gpt35)OpenAiEmbeddingDeploymentName(你部署的嵌入模型名如text-embedding)构建与发布在本地用dotnet publish命令发布项目或者配置 GitHub Actions/Azure DevOps 流水线进行持续集成部署。初始化数据库运行项目中的数据库初始化脚本如果有或者通过应用首次启动时的逻辑来创建 Cosmos DB 容器和向量索引。手动部署的优点是控制力强每一步都清晰可见缺点是步骤繁琐容易出错。azd的方案更适合快速原型验证和可重复部署。4. 核心功能模块深度解析4.1 向量嵌入生成与存储策略向量是整个智能搜索的基石。这里用的模型是text-embedding-ada-002它会把一段文本映射到一个 1536 维的浮点数向量空间中。语义相近的文本其向量在空间中的距离通常用余弦相似度衡量也更近。在代码中你会看到一个专门处理嵌入的服务类比如OpenAITextEmbeddingService。它的核心工作就是调用 Azure OpenAI 的嵌入 API。这里有个非常重要的实践细节分块策略。你不能把一整本 100 页的 PDF 直接扔进去生成一个向量那样粒度太粗搜索精度会极差。常见的策略有固定大小分块比如每 500 个字符或 token 为一块。简单但可能割裂完整语义。基于分隔符分块按照段落\n\n、标题、句子等自然边界进行分割。递归分块先按大分隔符分如果块太大再按小分隔符继续分直到块大小在预定范围内。语义分块使用更复杂的 NLP 模型来识别语义边界成本较高。在这个示例中我建议采用一种重叠分块的策略。比如每块 1000 个 token块与块之间重叠 200 个 token。这样能确保即使答案的关键信息恰好落在两个块的边界也能被至少一个完整的块所包含提高检索召回率。生成向量后如何存入 Cosmos DB你需要设计一个容器Container其文档结构可能如下{ id: doc_chunk_12345, sourceDocumentId: policy_manual_v2.pdf, chunkIndex: 2, text: 根据退货政策商品在签收后30天内保持完好且未经使用可申请无理由退货..., embedding: [0.012, -0.045, 0.987, ...], // 1536维向量 metadata: { title: 消费者权益条款, page: 15, category: policy } }embedding字段就是存储向量的地方。为了能对这个字段进行高效相似度搜索你必须在 Cosmos DB 中创建一个向量索引策略。4.2 Cosmos DB 向量索引配置详解这是 Cosmos DB NoSQL 向量搜索的核心配置。你可以在创建容器时指定或者后期通过 SDK/Portal 添加。一个典型的向量索引策略如下{ indexingMode: consistent, automatic: true, includedPaths: [ { path: /* } ], excludedPaths: [ { path: /\_etag\/? } ], vectorIndexes: [ { path: /embedding, type: quantizedFlat } ] }关键部分是vectorIndexes。path指定了哪个字段是向量字段。type定义了索引算法quantizedFlat是预览阶段支持的一种类型它在精度和性能/成本之间取得了很好的平衡通过对向量进行量化一种有损压缩来减少存储和计算开销同时保持较高的搜索准确性。创建这个索引后你就可以使用 Cosmos DB SDK 中的新查询语法来执行向量搜索了。查询看起来会像这样以 .NET SDK 为例var embeddings await _embeddingService.GenerateEmbeddingsAsync(queryText); var query new QueryDefinition(SELECT TOP 3 c.text, c.metadata FROM c ORDER BY VectorDistance(c.embedding, embedding) DESC) .WithParameter(embedding, embeddings);VectorDistance是 Cosmos DB 提供的用于计算向量相似度的内置函数。这里按距离降序排序实际上就是取相似度最高的前 3 项。注意事项向量索引的创建和数据的插入是异步过程。在插入大量数据后立即进行搜索可能无法立即查到全部数据因为索引还在构建中。对于生产环境需要监控索引转换进度或设计数据预热流程。4.3 语义内核对话管理与上下文窗口Semantic Kernel 在这里扮演了“大脑皮层”的角色管理着对话的短期记忆和复杂逻辑。我们主要用到它的两个核心概念插件和记忆。首先我们会创建一个ChatCompletionService连接到我们部署的 Azure OpenAI 聊天模型。然后我们定义一个“聊天”插件。这个插件内部封装了之前描述的整个 RAG 流程接收用户输入 - 生成问题向量 - Cosmos DB 向量搜索 - 组装提示词 - 调用 GPT 生成回答。更关键的是上下文窗口管理。GPT 模型有一个 token 数限制例如gpt-3.5-turbo 是 4096 tokens。这个限制包括你发送的提示词和模型返回的回答。如果无限制地将历史对话全部塞进去很快就会超限。Semantic Kernel 的ChatHistory类帮我们管理这个列表。但我们需要一个策略来决定保留哪些历史滑动窗口只保留最近 N 轮对话。简单有效但可能丢失重要的早期信息。摘要压缩当对话轮数增多时调用 GPT 对之前的对话历史生成一个简短的摘要然后用这个摘要代替原始的长篇历史放入上下文。这需要额外的 LLM 调用和提示词设计。基于重要性的筛选更复杂的策略尝试评估历史中每句话的重要性保留重要的剔除冗余的。在这个示例项目中通常实现一个简单的滑动窗口。每次新的交互我们都将“系统指令”、“检索到的上下文”、“最近几轮历史”和“新问题”组合成最终提示词。Semantic Kernel 让这种组合和调用变得非常声明式和简洁。// 伪代码示例 var builder Kernel.CreateBuilder(); builder.Services.AddAzureOpenAIChatCompletion(deploymentName, endpoint, apiKey); var kernel builder.Build(); // 假设我们已经有一个检索插件 kernel.ImportPluginFromObject(new RetrieverPlugin(_cosmosDbService), RetrieverPlugin); // 创建聊天历史 ChatHistory history new(); history.AddSystemMessage(你是一个乐于助人的助手请根据提供的上下文回答问题。); history.AddUserMessage(我们产品的退货政策是什么); // ... 在插件内部会进行检索并将上下文添加到历史或提示词中 ... // 获取聊天服务并生成回复 var chatCompletionService kernel.GetRequiredServiceIChatCompletionService(); var result await chatCompletionService.GetChatMessageContentAsync(history);通过 Semantic Kernel我们将检索、对话管理、工具调用等能力模块化使得应用架构清晰易于维护和扩展。5. 性能优化与成本控制实战5.1 构建语义缓存以降低开销直接调用 OpenAI 生成嵌入和补全是应用的主要成本来源尤其是嵌入接口按 token 数计费。同时向量搜索虽然快但相比简单的键值查询仍有开销。一个非常有效的优化手段是引入语义缓存。其原理是很多用户问题在语义上是相似或相同的。比如“怎么退货”和“退货流程是怎样的”。与其每次都重新生成嵌入、搜索向量、调用 GPT不如把第一次计算出的结果缓存起来。当新问题进来时先计算其向量然后在缓存里搜索是否有语义相似的历史问题同样使用向量相似度设定一个较高的相似度阈值如 0.95。如果找到直接返回缓存中的答案完全跳过对 OpenAI 和知识库的调用。这个缓存层可以放在哪里直接用 Cosmos DB 实现我们可以单独创建一个容器SemanticCache其文档结构包含QuestionVector问题向量、OriginalQuestion原始问题文本、Answer生成的答案、Timestamp。每次用户提问前生成问题向量。在SemanticCache容器中对QuestionVector字段执行向量搜索寻找相似度 0.95 的条目。如果找到直接返回缓存的Answer并更新Timestamp。如果未找到走完整的 RAG 流程并将最终的结果问题向量、问题文本、答案写入SemanticCache容器同时可以设置一个 TTL生存时间来自动清理旧缓存。这样做的好处是大幅降低延迟缓存命中时响应速度极快。显著节省成本减少了 OpenAI API 的调用次数。提升用户体验对于常见问题回答一致性更高。5.2 令牌管理与上下文优化策略Token 是 OpenAI 计费的单位也是模型上下文长度的限制单位。管理好 Token 使用是控制成本和保证功能正常的关键。1. 输入 Token 优化精简系统指令系统指令System Prompt每次都会发送确保它简洁、必要。避免冗长的角色扮演描述。优化检索结果数量不要盲目返回 top 10 的文档片段。通过实验找到在保证答案质量的前提下所需的最少片段数量通常是 2-3 个。每个片段都是 Token。压缩检索文本对于检索到的长文本可以尝试进行摘要压缩后再放入上下文。这需要额外调用一次 LLM但在上下文非常紧张时可能是值得的。一个更简单的方法是在分块时就控制好块的大小避免过大的块。历史对话摘要如前所述对于长对话将旧历史总结成摘要比直接拼接所有历史文本更节省 Token。2. 输出 Token 控制设置max_tokens参数在调用聊天补全 API 时明确设置回答的最大 Token 数防止模型生成过于冗长的回答也浪费钱。使用流式响应虽然不减少总 Token但流式响应Streaming可以让用户更快地看到回答的开头部分提升感知速度。3. 监控与告警在 Azure OpenAI 服务中你可以方便地在“监控”部分查看各模型的 Token 消耗情况。建议为你的资源组或订阅设置预算告警当日消耗或月消耗接近阈值时自动通知避免意外的高额账单。5.3 向量搜索的性能调优当你的知识库文档达到百万甚至千万级别时向量搜索的性能和成本就成为关键考量。索引类型选择Cosmos DB 预览提供的quantizedFlat索引是一种平衡之选。未来正式版可能会支持更丰富的索引类型如 HNSWHierarchical Navigable Small World这种图结构索引在超高维度和超大规模数据集上能提供更快且近似度可接受的搜索速度但构建成本和内存占用更高。需要根据数据规模和性能要求进行选择。分区键设计Cosmos DB 的性能核心在于分区键。对于向量搜索容器分区键的设计需要深思熟虑。一个常见的模式是使用文档来源的类别或类型作为分区键例如metadata.category。这样当大多数查询都集中在某个类别内时查询可以限定在单个分区内效率最高。避免使用像id或完全随机的值作为分区键这会导致查询“扇出”到所有分区增加 RU 消耗和延迟。查询的 RU 消耗向量搜索查询会比普通点读消耗更多的请求单位。你需要密切监控查询的 RU 费用并在设计时考虑减少每次查询返回的向量数量TOP N中的 N。尝试在WHERE子句中添加基于元数据如category的筛选结合分区键缩小搜索范围。根据查询模式适当调整容器的吞吐量RU/s配置。6. 常见问题排查与进阶技巧6.1 部署与运行问题速查在搭建和运行过程中你可能会遇到一些典型问题。这里列出一个排查清单问题现象可能原因解决方案azd up失败提示资源提供商未注册订阅中未启用相关资源类型如 Microsoft.DocumentDB。登录 Azure 门户进入“订阅”-“资源提供程序”搜索并注册Microsoft.DocumentDB,Microsoft.Web,Microsoft.CognitiveServices等。应用启动失败连接 Cosmos DB 超时连接字符串错误防火墙规则阻止容器/数据库未创建。1. 检查 Web App 应用设置中的连接字符串是否正确。2. 检查 Cosmos DB 账户的“防火墙和虚拟网络”设置确保允许了 App Service 的出站 IP 或配置了 VNet 集成。3. 确认代码中指定的数据库和容器名是否存在或应用是否有自动创建逻辑。向量搜索查询返回空或错误向量索引未正确创建向量字段路径不对数据未成功插入。1. 在 Azure 门户 Cosmos DB 数据资源管理器中检查容器的“设置”-“索引策略”确认vectorIndexes配置正确。2. 检查查询语句中VectorDistance函数的字段路径是否与索引路径一致。3. 插入数据后等待片刻索引构建是异步的或查询容器文档总数确认数据已写入。调用 OpenAI API 返回 401 或 403API 密钥错误终结点错误资源区域与终结点不匹配配额用尽。1. 仔细核对终结点和密钥确保没有多余空格。2. 确认终结点格式为https://your-resource-name.openai.azure.com/。3. 在 Azure OpenAI 资源中确认已成功部署了所需的模型如chat-gpt35,text-embedding且部署名与代码配置一致。4. 检查“配额”页面确认未超过速率或总量限制。应用响应慢尤其是首次提问冷启动向量索引未预热检索文本块过大或过多。1. App Service 配置最小实例数为 1 可避免冷启动会增加成本。2. 对于重要数据可在应用启动后执行一次模拟查询来“预热”索引和数据库连接。3. 优化分块策略和检索数量TOP N。6.2 效果调优与评估心得项目跑起来只是第一步要让它的回答真正“好用”还需要持续的调优。1. 分块策略调优这是影响检索质量最关键的环节。没有放之四海而皆准的方案。你需要用自己的数据做实验。评估方法准备一组标准问题Q和对应的标准答案片段A来自你的文档。运行你的 RAG 流程看检索到的文本块是否包含了 A。计算检索召回率。调整参数尝试不同的块大小如 256, 512, 1024 tokens和重叠度如 0, 10%。对于结构规整的文档如 API 文档按标题分块可能更好对于长段落文本如小说固定大小重叠可能更合适。2. 提示词工程系统指令和问题包装方式极大影响最终答案质量。明确指令在系统指令中清晰定义角色和限制例如“你是一个严谨的技术支持专家只根据提供的上下文信息回答问题。如果上下文没有明确信息请直接说‘根据现有资料我无法回答这个问题’不要编造信息。”提供格式示例如果需要模型以特定格式如列表、表格、JSON回答在指令中给出一个清晰的例子。迭代测试针对一些边界问题如上下文不包含答案、问题模糊反复测试并调整提示词直到模型行为符合预期。3. 相似度阈值调整在检索和语义缓存中都有一个相似度阈值。阈值太高如 0.98可能导致很多相关问题检索不到漏召阈值太低如 0.7可能引入大量不相关的噪声精度下降。需要通过验证集绘制“精度-召回率”曲线找到一个业务上可接受的平衡点。6.3 安全与生产化考量当你想把这个原型推向真正的生产环境时有几个关键点必须考虑身份认证与授权示例应用可能没有复杂的身份验证。生产环境需要集成 Azure AD 或其他身份提供商确保只有授权用户能访问聊天界面和底层数据。输入输出过滤与审查在将用户输入发送给 LLM 前以及将模型输出返回给用户前应进行内容安全过滤防止提示词注入攻击或生成不当内容。Azure OpenAI 服务本身提供内容过滤功能可以在调用时开启。数据加密与合规确保 Cosmos DB 和存储账户使用客户托管密钥CMK进行静态加密。审查数据流确保符合 GDPR、HIPAA 等合规要求如果适用。敏感数据不应直接用于生成嵌入。可观测性与监控除了 Azure 自带的监控应在应用中关键节点检索、LLM 调用、缓存命中添加详细的日志和指标如延迟、token 用量、缓存命中率。使用 Application Insights 进行全链路跟踪便于故障排查和性能分析。容错与重试对 Azure OpenAI API 和 Cosmos DB 的调用必须添加重试逻辑使用指数退避策略和断路器模式处理暂时的网络故障或服务限流。这个项目提供了一个强大的、企业级的 RAG 应用蓝图。从快速原型到稳定生产中间需要你在性能、成本、安全性和效果上不断打磨。希望我的这些经验分享能帮你避开一些坑更快地构建出属于自己的智能知识助手。

相关文章:

基于Azure Cosmos DB与OpenAI构建企业级RAG智能问答应用实战

1. 项目概述:构建一个基于向量数据库的智能对话应用最近在折腾一个挺有意思的项目,想和大家分享一下如何用 Azure Cosmos DB 和 Azure OpenAI Service 来搭建一个真正能用的“副驾驶”应用。这个项目的核心思路,就是把你的数据变成 AI 能理解…...

基于 Taotoken 构建支持多模型切换的智能内容创作平台

基于 Taotoken 构建支持多模型切换的智能内容创作平台 1. 多模型内容创作场景需求分析 在智能内容创作领域,不同创作类型对生成模型的需求存在显著差异。小说创作可能需要更强的叙事连贯性和角色塑造能力,商业文案需要精准的品牌调性把控,而…...

告别手动拷贝!用cwRsync在Windows和Linux间自动同步文件(附详细配置步骤)

跨平台文件同步利器:cwRsync在Windows与Linux间的自动化实践 对于需要在Windows与Linux系统间频繁传输文件的运维工程师和开发者来说,手动复制粘贴或使用FTP工具不仅效率低下,还容易出错。想象一下凌晨三点被叫醒处理生产环境文件同步失败的场…...

Cherry MX键帽3D模型库:解锁机械键盘个性化定制新维度

Cherry MX键帽3D模型库:解锁机械键盘个性化定制新维度 【免费下载链接】cherry-mx-keycaps 3D models of Chery MX keycaps 项目地址: https://gitcode.com/gh_mirrors/ch/cherry-mx-keycaps 还在为寻找独特键帽而烦恼吗?cherry-mx-keycaps项目为…...

BthPS3蓝牙驱动:Windows上完美连接PS3控制器的终极解决方案

BthPS3蓝牙驱动:Windows上完美连接PS3控制器的终极解决方案 【免费下载链接】BthPS3 Windows kernel-mode Bluetooth Profile & Filter Drivers for PS3 peripherals 项目地址: https://gitcode.com/gh_mirrors/bt/BthPS3 还在为PS3控制器在Windows电脑上…...

Emby.CustomCssJS:深度定制你的媒体服务器界面架构

Emby.CustomCssJS:深度定制你的媒体服务器界面架构 【免费下载链接】Emby.CustomCssJS Easy to manage your Custom JavaScript and Css to modify Emby 项目地址: https://gitcode.com/gh_mirrors/em/Emby.CustomCssJS Emby.CustomCssJS是一个专为Emby媒体服…...

Windows安卓应用安装终极指南:APK-Installer完整使用教程

Windows安卓应用安装终极指南:APK-Installer完整使用教程 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上轻松安装安卓应用吗&#xff1f…...

Cloud Commander测试策略:确保文件管理器稳定性的完整方案

Cloud Commander测试策略:确保文件管理器稳定性的完整方案 【免费下载链接】cloudcmd ✨☁️📁✨ Cloud Commander file manager for the web with console and editor. 项目地址: https://gitcode.com/gh_mirrors/cl/cloudcmd Cloud Commander是…...

Spring Boot项目里,除了velocity-engine-core,你还需要Velocity-Tools吗?一个工具包的选择指南

Spring Boot项目中Velocity工具包的深度选型指南:何时需要Velocity-Tools? 在Java生态中,模板引擎的选择往往让开发者陷入"功能过剩"与"能力不足"的两难境地。Velocity作为老牌模板引擎,其轻量级设计哲学至今…...

Windows 10 下 Qt 5.15 组件选择避坑指南:从MSVC到MinGW,32G空间怎么装最合理?

Windows 10下Qt 5.15组件选择避坑指南:从MSVC到MinGW的32G空间优化方案 Qt作为跨平台开发框架,其组件选择直接影响开发效率和磁盘空间占用。面对Qt在线安装器中庞大的组件列表,开发者常陷入两难:既希望功能完备,又担心…...

Linux下部署MySQL5.7.35

1.MySQL下载 (1)登录到以下网站 https://downloads.mysql.com/archives/community/ (2)选择需要的版本 ,以及操作系统 ,这里是Red Hat Enterprise Linux / Oracle Linux 5.7.35 版本。 (3&…...

OpenMV的PWM控制舵机,从调参到避坑的全流程记录(基于Timer和pyb库)

OpenMV的PWM控制舵机:从调参到避坑的全流程实战指南 引言:为什么选择OpenMV控制舵机? 在嵌入式视觉项目中,我们常常需要同时处理图像识别和机械控制两个任务。传统方案通常采用主控视觉模块的架构,但这种设计存在通信延…...

为什么选择vue-markdown?与其他Markdown渲染器的全面对比分析

为什么选择vue-markdown?与其他Markdown渲染器的全面对比分析 【免费下载链接】vue-markdown vue-markdown: 是一个用于Vue.js的Markdown渲染器组件,允许在Vue应用中轻松展示Markdown格式的内容。 项目地址: https://gitcode.com/gh_mirrors/vu/vue-ma…...

芯片流片前夜,后端工程师的‘救火’指南:手把手教你搞定那些顽固的DRV和时序违例

芯片流片前夜:数字后端工程师的DRV与时序违例实战指南 凌晨三点的办公室,咖啡杯早已见底,屏幕上PrimeTime的违例报告像一张密密麻麻的通缉令——这是每个数字后端工程师在流片前夜都熟悉的场景。当项目进入最后冲刺阶段,那些顽固的…...

Cursor AI开发助手功能体验优化技术探索指南

Cursor AI开发助手功能体验优化技术探索指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial request limit. / …...

GoPro视频GPS数据终极提取指南:三分钟搞定轨迹可视化

GoPro视频GPS数据终极提取指南:三分钟搞定轨迹可视化 【免费下载链接】gopro2gpx Parse the gpmd stream for GOPRO moov track (MP4) and extract the GPS info into a GPX (and kml) file. 项目地址: https://gitcode.com/gh_mirrors/go/gopro2gpx 还在为G…...

PBR-White-Paper抗锯齿技术:TAA时域抗锯齿在PBR渲染中的优化应用

PBR-White-Paper抗锯齿技术:TAA时域抗锯齿在PBR渲染中的优化应用 【免费下载链接】PBR-White-Paper ⚡️基于物理的渲染(PBR)白皮书 | White Paper of Physically Based Rendering(PBR) 项目地址: https://gitcode.com/gh_mirrors/pb/PBR-…...

AI驱动多链永续合约流动性引擎:架构、实现与实战

1. 项目概述:一个面向多链永续合约的AI流动性智能引擎 如果你在DeFi领域,尤其是永续合约交易中摸爬滚打过一段时间,一定会对“信息差”和“流动性割裂”这两个词深有感触。同一个资产,在Arbitrum、Solana、Avalanche以及像Hyperli…...

如何5分钟上手BlogHelper:从下载安装到首次发布的完整教程

如何5分钟上手BlogHelper:从下载安装到首次发布的完整教程 【免费下载链接】BlogHelper 帮助国内用户写作的托盘助手,一键发布本地文章到主流博客平台(知乎、简书、博客园、CSDN、SegmentFault、掘金、开源中国),剪贴板…...

国产替代之FQD6N40TM与VBE14R04参数对比报告

N沟道功率MOSFET参数对比分析报告一、产品概述FQD6N40TM:安森美(onsemi)N沟道硅MOSFET,采用QFET技术,耐压400V,具有低导通电阻和快速开关性能。封装:DPAK (TO-252)。适用于开关电源、DC-DC转换器…...

B站字幕提取方法全攻略:从下载视频到一键导出字幕的完整实操

截至 2026 年,提取 B 站字幕的工具大致分为三类:在线网站工具、本地软件、以及微信小程序。其中微信小程序因为即用即走的便利性,用的人越来越多。我先给你拆解一个靠谱的微信小程序方案,然后再补充其他几条思路,你可以根据自己的使用频率来选。用提词匠直接处理 B 站字幕提取,…...

从Excel筛选到Pandas删除:用.drop()方法搞定你的数据清洗日常(新手友好版)

从Excel筛选到Pandas删除:用.drop()方法搞定你的数据清洗日常(新手友好版) 如果你是从Excel转向Python的数据分析新手,面对Pandas的数据清洗操作可能会感到有些陌生。但别担心,本文将带你从熟悉的Excel操作出发&#x…...

深蓝词库转换:彻底告别输入法切换烦恼的终极解决方案

深蓝词库转换:彻底告别输入法切换烦恼的终极解决方案 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 你是否曾经因为更换输入法而不得不放弃多年积累的个…...

想快速导出视频字幕?2026年剪映导出字幕文字的方法+提词匠全能方案

如果你是内容创作者、学生或办公族,经常需要从视频里提取文案或生成字幕文件,会发现卡在这几个地方:有时候视频自带的字幕格式不好导,有时候视频根本没字幕需要自己识别,有时候识别出来的文本还要手工修改时间戳。这篇…...

初次使用Taotoken从注册到完成第一个API调用的全过程记录

初次使用Taotoken从注册到完成第一个API调用的全过程记录 作为一名开发者,初次接触一个新的API服务平台时,最关心的往往是上手过程是否顺畅。最近,我尝试了Taotoken平台,完整记录了从零开始到成功调用大模型API的全过程。这篇记录…...

如何高效掌控电脑风扇:Fan Control完整配置指南

如何高效掌控电脑风扇:Fan Control完整配置指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanCo…...

面试官最爱问的图遍历:BFS在LeetCode「岛屿数量」和「打开转盘锁」中的实战拆解

面试官最爱问的图遍历:BFS在LeetCode「岛屿数量」和「打开转盘锁」中的实战拆解 最近在技术面试中,图的广度优先搜索(BFS)算法成为了高频考点。不同于教科书式的理论讲解,本文将聚焦LeetCode上两道经典题目——200.岛屿…...

5分钟快速掌握SharpKeys:Windows键盘重映射终极免费指南

5分钟快速掌握SharpKeys:Windows键盘重映射终极免费指南 【免费下载链接】sharpkeys SharpKeys is a utility that manages a Registry key that allows Windows to remap one key to any other key. 项目地址: https://gitcode.com/gh_mirrors/sh/sharpkeys …...

终极指南:5分钟掌握《全面战争》模组制作神器RPFM

终极指南:5分钟掌握《全面战争》模组制作神器RPFM 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: https://gitcode…...

C# 文档的侦测

using System.IO;FileSystemWatcher[] fswArr;List<string> finalMonitorFilePath new List<string>(); //获取侦测的文档项目...