基于Azure Cosmos DB与OpenAI构建私有知识库智能问答系统
1. 项目概述当向量数据库遇上大语言模型最近在折腾一些AI应用的原型发现一个挺有意思的痛点怎么让像ChatGPT这样的大语言模型LLM记住并理解我自己的、非公开的数据比如公司内部的文档、技术手册或者我个人的笔记、收藏的文章。直接把这些文本喂给模型进行微调Fine-tuning成本太高而且不够灵活——每次数据有更新都得重新训练一遍这谁受得了。这时候“检索增强生成”Retrieval-Augmented Generation 简称RAG这个模式就成了一个非常优雅的解决方案。它的核心思想很简单我不需要让模型“记住”所有知识我只需要教会它“查阅资料”。当用户提出一个问题时我先从一个专门的“知识库”里找到最相关的几段资料然后把“问题”和“找到的资料”一起打包送给大语言模型让它基于这些资料来生成答案。这样答案的准确性和时效性就有了保障。微软在GitHub上开源的Azure-Samples/cosmosdb-chatgpt这个项目就是一个将RAG模式落地的绝佳范例。它巧妙地将两个强大的云服务结合在了一起Azure Cosmos DB作为向量数据库负责高效存储和检索你的“知识”文本的向量化表示Azure OpenAI Service则提供了ChatGPT等大语言模型的能力负责理解和生成。这个项目提供了一个完整的、可部署的Web应用让你能快速搭建一个属于自己的、基于私有知识的智能问答系统。简单来说这个项目解决的核心问题是如何低成本、高效率地构建一个能“理解”你专属文档的聊天机器人。它非常适合开发者、技术团队或者任何想探索AI应用落地的个人用来构建内部知识库助手、智能客服原型、个性化学习工具等等。2. 核心架构与设计思路拆解2.1 为什么是“Cosmos DB OpenAI”这个组合在RAG架构里最关键的两个组件就是“检索器”和“生成器”。这个项目的选型非常具有代表性背后有清晰的逻辑。2.1.1 向量数据库的选择Azure Cosmos DB with MongoDB vCore存储和检索向量有很多选择比如专用的向量数据库Pinecone, Weaviate或者一些扩展了向量搜索功能的关系型/NoSQL数据库。这个项目选择了Azure Cosmos DB的MongoDB vCore服务层这是一个关键设计点。原因一无缝集成与统一栈。对于已经在微软Azure云生态内的团队来说使用Cosmos DB可以极大地简化架构。身份认证、网络配置、监控、备份都可以在同一个平台内完成管理和运维成本低。它避免了从零搭建和维护一个独立的向量数据库服务。原因二MongoDB的灵活性。MongoDB vCore提供了原生的MongoDB查询API和文档数据模型。这意味着你可以用非常自然的方式在同一个文档里存储原始文本、元数据如来源、创建时间以及对应的向量嵌入embedding。例如一个文档结构可能同时包含text、source、embedding这几个字段。这种灵活性对于存储非结构化的知识数据非常友好。原因三原生向量搜索支持。Azure Cosmos DB for MongoDB vCore 集成了Azure AI Search的向量索引能力。这意味着你不需要自己构建和维护复杂的近似最近邻ANN索引如HNSW, IVF数据库服务已经为你提供了高性能的向量相似性搜索功能可以直接通过MongoDB的$search聚合管道进行查询开发体验流畅。2.1.2 大语言模型服务Azure OpenAI Service为什么不直接用OpenAI的API这里主要考虑的是企业级需求数据安全与合规。Azure OpenAI Service运行在Azure的受信任云环境中提供了与企业级安全、合规和隐私标准的对齐。你的数据包括输入的提示和生成的输出不会用于改进OpenAI的公共模型这对于处理敏感或专有数据的应用至关重要。网络与性能。如果你的应用其他部分也部署在Azure上那么使用同区域的Azure OpenAI服务可以获得更低、更稳定的网络延迟。管理与成本控制。与企业现有的Azure订阅、成本管理、监控告警体系集成更紧密。这个组合构成了一个典型的、云原生的AI应用后端架构利用托管数据库服务处理数据利用托管AI服务处理智能开发者可以更专注于业务逻辑和前端体验。2.2 应用工作流全景图整个应用的工作流可以清晰地分为两个阶段“知识库注入”阶段和**“问答查询”阶段**。知识库注入Ingestion输入你的原始文档支持.txt, .pdf, .docx, .md, .html等多种格式。文本分割大语言模型有上下文长度限制不能直接把一整本书扔进去。因此需要先将文档切分成大小适中的“块”Chunks。这里涉及两个关键参数chunk_size每个块的最大字符数和chunk_overlap相邻块之间的重叠字符数。适度的重叠可以防止一个完整的句子或概念被生硬地切断保证检索结果的上下文连贯性。向量化使用Azure OpenAI的嵌入模型如text-embedding-ada-002将每一个文本块转换成一个高维向量例如1536维。这个向量在数学空间中的“位置”代表了该文本的语义。存储将{文本块 向量 元数据来源、页码等}作为一个文档存入Azure Cosmos DB for MongoDB vCore。数据库会在向量字段上自动建立索引以加速检索。问答查询Query用户提问用户在Web界面输入问题例如“我们公司的报销政策中海外出差的标准是什么”问题向量化使用同样的嵌入模型将用户的问题也转换成一个向量。向量检索在Cosmos DB中执行向量相似性搜索。计算问题向量与知识库中所有文本块向量的余弦相似度找出最相似的K个文本块例如Top 5。这步就是“检索”找到了与问题最相关的参考资料。构造提示词Prompt Engineering这是RAG的灵魂。系统会构建一个这样的提示词模板请基于以下提供的上下文信息来回答问题。如果上下文信息不足以回答问题请直接说“根据已知信息无法回答该问题”不要编造信息。 上下文信息 {这里是检索到的Top K个相关文本块拼接而成} 问题{用户的问题} 答案调用LLM生成答案将构造好的提示词发送给Azure OpenAI的聊天补全模型如gpt-35-turbo或gpt-4。返回答案模型基于提供的“上下文”生成答案前端将答案呈现给用户。同时通常还会附上答案所引用的“资料来源”增强可信度。3. 环境准备与部署实操详解3.1 前置资源创建Azure Portal操作在运行项目代码之前你需要在Azure门户上创建好必要的服务资源。这是最关键的一步务必按顺序进行。3.1.1 创建Azure OpenAI资源在Azure门户搜索“Azure OpenAI”。点击“创建”选择你的订阅和资源组可新建。选择区域建议选East US或West Europe模型部署较全输入资源名称。点击“审阅并创建”然后“创建”。等待几分钟部署完成。进入创建好的资源在“资源管理”-“密钥和终结点”中记录下终结点和其中一个密钥Key1。稍后需要用到。部署模型在“模型部署”部分点击“管理部署”。你需要至少部署两个模型一个聊天模型用于生成答案。点击“创建新部署”选择模型如gpt-35-turbo版本选最新部署名称可以设为gpt-35-turbo这个名称在代码中会引用。一个嵌入模型用于将文本转为向量。同样“创建新部署”选择模型text-embedding-ada-002部署名称如text-embedding-ada-002。3.1.2 创建Azure Cosmos DB for MongoDB vCore资源在Azure门户搜索“Azure Cosmos DB”。点击“创建”选择“Azure Cosmos DB for MongoDB vCore”。同样选择订阅、资源组。输入集群名称即资源名称、区域建议与OpenAI资源同区以降低延迟、计算规格开发测试选M30或M40即可。点击“审阅 创建”然后“创建”。这个部署可能需要10-15分钟。部署完成后进入资源在“连接字符串”部分点击“连接字符串”。这里你需要记录几个关键信息HOST形如your-cluster.mongocluster.cosmos.azure.comUSERNAME通常是你的集群名称。PRIMARY PASSWORD点击“显示密码”获取并记录。DATABASE你可以创建一个新的数据库名比如chatdb。CONNECTION STRING一个完整的连接字符串格式为mongodbsrv://username:passwordhost/database?tlstrue。你可以直接复制这个但注意密码部分可能需要URL编码。3.2 本地开发环境配置与运行项目代码库提供了清晰的指引。我们以本地运行为例拆解每一步。3.2.1 克隆代码与安装依赖git clone https://github.com/Azure-Samples/cosmosdb-chatgpt.git cd cosmosdb-chatgpt项目根目录下通常会有requirements.txt或pyproject.toml。使用pip安装依赖pip install -r requirements.txt注意强烈建议使用Python虚拟环境如venv或conda来隔离项目依赖避免包冲突。3.2.2 配置环境变量这是连接Azure服务的桥梁。项目通常使用.env文件来管理配置。你需要在项目根目录创建一个.env文件并填入以下内容值替换为你之前记录的# Azure OpenAI AZURE_OPENAI_ENDPOINThttps://your-resource.openai.azure.com/ AZURE_OPENAI_API_KEYyour-api-key-here AZURE_OPENAI_CHAT_DEPLOYMENT_NAMEgpt-35-turbo # 你部署的聊天模型名称 AZURE_OPENAI_EMBEDDING_DEPLOYMENT_NAMEtext-embedding-ada-002 # 你部署的嵌入模型名称 # Azure Cosmos DB for MongoDB vCore AZURE_COSMOSDB_MONGODB_VCORE_CONNECTION_STRINGmongodbsrv://username:passwordhost/chatdb?tlstrueappNameappName AZURE_COSMOSDB_MONGODB_VCORE_DATABASEchatdb AZURE_COSMOSDB_MONGODB_VCORE_CONTAINERchatcontainer # 集合表名可自定义 # 应用配置 AZURE_OPENAI_API_VERSION2024-02-15-preview # 使用最新的API版本实操心得连接字符串中的密码如果包含特殊字符如/,,:需要进行URL编码。例如要编码为%40。最稳妥的方式是直接从Azure门户的“连接字符串”处复制完整的字符串。3.2.3 运行数据注入脚本项目一般会提供一个脚本如scripts/prep_docs.py或data_ingestion.py来演示如何将本地文档导入知识库。将你的文档如PDF、TXT文件放入指定的文件夹比如data/。运行脚本。这个脚本会完成读取文件 - 文本分割 - 调用嵌入模型生成向量 - 写入Cosmos DB。python scripts/prep_docs.py --path ./data你可以在Azure门户的Cosmos DB数据资源管理器中查看到新创建的数据库、容器以及里面存储的文档每个文档都包含text,embedding,source等字段。3.2.4 启动Web应用程序项目通常基于Streamlit或FastAPI等框架构建了一个简单的Web前端。运行主应用文件streamlit run app.py或者python app.py然后在浏览器中打开提示的本地地址通常是http://localhost:8501你就可以看到一个聊天界面开始向你刚构建的知识库提问了。4. 核心代码模块深度解析4.1 文档加载与智能分块策略文档处理是RAG流水线的第一步其质量直接决定检索效果。项目中的相关代码展示了如何处理多种格式和分块逻辑。# 示例性代码逻辑非原项目逐行代码 from langchain.document_loaders import PyPDFLoader, TextLoader, UnstructuredFileLoader from langchain.text_splitter import RecursiveCharacterTextSplitter import os def load_and_split_documents(file_path): # 1. 根据文件扩展名选择加载器 loader_map { .pdf: PyPDFLoader, .txt: TextLoader, .md: TextLoader, # ... 可扩展其他格式 } ext os.path.splitext(file_path)[1].lower() loader_class loader_map.get(ext, UnstructuredFileLoader) # 兜底加载器 loader loader_class(file_path) documents loader.load() # 返回Document对象列表每个Document有page_content和metadata # 2. 配置文本分割器 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, # 每个块的最大字符数 chunk_overlap200, # 块之间的重叠字符数 length_functionlen, separators[\n\n, \n, 。, , , , ] # 递归尝试的分隔符列表 ) # 3. 执行分割 chunks text_splitter.split_documents(documents) return chunks关键参数解析与调优经验chunk_size这是最重要的参数。设置太小会丢失上下文信息检索到的片段可能过于零碎设置太大可能会引入无关噪声且可能超过LLM单次处理的上下文窗口。对于通用文档800-1500字符是一个不错的起点。对于代码或结构化很强的文本可以适当调小。chunk_overlap通常设置为chunk_size的 10%-20%。这能有效防止一个完整的句子或关键概念被割裂在两个块中。例如一个段落刚好在块末尾被切断重叠部分可以确保下一个块的开头包含这个段落的尾部保证了检索时上下文的连贯性。separatorsRecursiveCharacterTextSplitter会按列表顺序尝试分割。对于中文你可能需要调整分隔符例如将.改为。并加入、等。踩坑记录直接使用默认分隔符处理中文文档效果可能不佳。我曾处理一份中文技术手册发现分块结果很奇怪很多句子被拦腰截断。后来发现是因为默认分隔符列表优先按\n\n、\n、 分割而中文段落间可能没有明确的换行句子以句号结束。将。、提前到分隔符列表靠前的位置后分块质量显著提升。4.2 向量化与存储的实现细节这一部分负责将文本块转化为向量并存入数据库。# 示例性代码逻辑 from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import AzureCosmosDBVectorSearch from pymongo import MongoClient import os def create_and_store_embeddings(chunks): # 1. 初始化嵌入模型客户端连接Azure OpenAI embeddings OpenAIEmbeddings( openai_api_baseos.environ[AZURE_OPENAI_ENDPOINT], openai_api_keyos.environ[AZURE_OPENAI_API_KEY], openai_api_versionos.environ[AZURE_OPENAI_API_VERSION], deploymentos.environ[AZURE_OPENAI_EMBEDDING_DEPLOYMENT_NAME], chunk_size16 # 一次API调用处理的文本块数可调整 ) # 2. 连接Cosmos DB MongoDB vCore client MongoClient(os.environ[AZURE_COSMOSDB_MONGODB_VCORE_CONNECTION_STRING]) db client[os.environ[AZURE_COSMOSDB_MONGODB_VCORE_DATABASE]] collection db[os.environ[AZURE_COSMOSDB_MONGODB_VCORE_CONTAINER]] # 3. 创建向量存储索引并插入数据 # 这一步会a)为集合创建向量索引 b)计算每个chunk的嵌入向量 c)将向量和文本一并插入集合 vector_store AzureCosmosDBVectorSearch.from_documents( documentschunks, embeddingembeddings, collectioncollection, index_namevectorSearchIndex, # 向量索引的名称 ) return vector_store核心技术点嵌入模型调用OpenAIEmbeddings类封装了对Azure OpenAI嵌入模型API的调用。chunk_size参数用于控制批量处理的大小以提高效率。注意Azure OpenAI对API调用有速率限制TPM/RPM在生产环境中需要根据限制调整此参数或加入重试、限流逻辑。向量索引创建from_documents方法内部会检查指定的集合是否存在向量索引。如果不存在它会自动创建一个。在Azure Cosmos DB for MongoDB vCore中这个索引类型是vectorSearch它底层使用了Azure AI Search的向量索引能力。你可以在数据资源管理器中通过db.runCommand({listIndexes: yourCollection})查看索引定义。数据存储格式存入集合的每个文档除了原始的page_content文本和metadata来源等还会自动添加一个embedding字段存储1536维的浮点数数组和一个_id字段。4.3 检索与生成的协同工作流这是应用运行时问答阶段的核心逻辑。# 示例性代码逻辑 from langchain.chains import RetrievalQA from langchain.chat_models import AzureChatOpenAI from langchain.prompts import PromptTemplate def setup_qa_chain(vector_store): # 1. 初始化LLM用于生成答案 llm AzureChatOpenAI( openai_api_baseos.environ[AZURE_OPENAI_ENDPOINT], openai_api_keyos.environ[AZURE_OPENAI_API_KEY], openai_api_versionos.environ[AZURE_OPENAI_API_VERSION], deployment_nameos.environ[AZURE_OPENAI_CHAT_DEPLOYMENT_NAME], temperature0.1, # 控制创造性0更确定1更多变 max_tokens500 # 生成答案的最大长度 ) # 2. 定义检索器 retriever vector_store.as_retriever( search_typesimilarity, # 相似度搜索 search_kwargs{k: 4} # 返回最相关的4个文档块 ) # 3. 自定义提示词模板这是提升效果的关键 prompt_template 请严格根据以下上下文信息来回答问题。如果你不知道答案就明确说“根据提供的上下文我无法回答这个问题”。不要编造信息。 上下文 {context} 问题{question} 基于上下文的答案 PROMPT PromptTemplate( templateprompt_template, input_variables[context, question] ) # 4. 创建检索增强生成链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # 最简单的方式将所有检索到的上下文“塞”进提示词 retrieverretriever, chain_type_kwargs{prompt: PROMPT}, return_source_documentsTrue # 返回源文档用于引用显示 ) return qa_chain # 使用链进行问答 def ask_question(qa_chain, question): result qa_chain({query: question}) answer result[result] source_docs result[source_documents] # 包含来源信息的文档列表 return answer, source_docs核心机制与调优点检索器配置search_kwargs{“k”: 4}决定了每次检索返回多少个相关文档块。K值需要权衡太小可能信息不全太大会增加提示词长度和API成本并可能引入噪声。通常从3-5开始尝试。提示词工程这是决定答案质量和可靠性的重中之重。示例模板中明确指令“严格根据以下上下文信息来回答问题”和“不要编造信息”是防止模型“幻觉”胡编乱造的关键指令。提供退路“如果你不知道答案就明确说...” 给了模型一个安全的出口避免了在缺乏信息时强行生成错误答案。在实际应用中你可能需要根据任务类型微调模板例如对于总结性任务可以加入“请用简洁的语言总结...”。链类型chain_type“stuff”是最直接的方式将所有检索到的上下文拼接后放入提示词。它的优点是简单信息完整。但当检索到的文档总长度超过模型上下文窗口时会失败。对于大量文档可以考虑“map_reduce”分别总结再汇总或“refine”迭代精炼等更复杂的链类型但它们成本更高、延迟更大。LLM参数temperature0.1设置为较低值使答案更倾向于确定性、基于事实减少天马行空的发挥这对于知识问答场景是合适的。5. 性能优化与高级功能拓展5.1 检索精度提升策略基础的向量相似度搜索有时会受限于“词汇不匹配”或“语义细微差别”。以下是几种提升策略混合搜索Hybrid Search是什么结合向量搜索语义相似和全文关键词搜索词汇匹配。例如一个缩写“LLM”在向量空间可能与“大语言模型”接近但通过关键词也能精准匹配。如何做Azure Cosmos DB for MongoDB vCore 的$search聚合管道支持同时进行vectorSearch和keywordSearch并对两者的评分进行加权融合如score: { boost: { value: 1.5 } }。在代码中需要配置检索器使用更复杂的搜索定义。效果能显著提高对专有名词、产品名、代码术语等精确信息的召回率。元数据过滤是什么在向量搜索前或后根据文档的元数据如来源文件、章节、日期进行筛选。如何做例如你可以只检索“2023年之后发布的财务报告”或“来自《产品手册》的章节”。在as_retriever时可以通过search_kwargs传入filter参数。retriever vector_store.as_retriever( search_kwargs{ “k”: 5, “filter”: {“source”: “产品手册.pdf”} # 仅从特定来源检索 } )效果使问答更精准、更可控尤其适用于知识结构清晰、文档类型多样的场景。重排序Re-ranking是什么向量搜索返回的Top K个结果可能不是最相关的前K个。使用一个更精细但更耗时的“重排序模型”对初筛结果进行二次排序选取最相关的少数几个送入LLM。如何做可以集成像Cohere的 rerank API或者使用像BGE-Reranker这样的开源模型。在LangChain中这可以通过ContextualCompressionRetriever等组件实现。效果能进一步提升送入LLM的上下文质量尤其当K值设置较大时用较小的成本换取答案质量的提升。5.2 应用层优化与生产化考量当从原型走向生产环境时需要考虑以下方面异步处理与性能文档注入异步化处理大量文档时向量化调用嵌入模型API是主要瓶颈。可以使用异步IO如asyncio,aiohttp来并发调用API大幅提升注入速度。流式响应对于Web应用可以使用LLM的流式响应streaming功能让答案逐词或逐句返回前端提升用户体验感知速度。Azure OpenAI API和LangChain都支持此功能。对话历史与多轮问答基础的RAG是单轮的。要实现多轮对话需要维护一个“对话历史”上下文。实现思路将当前问题与之前几轮的问答历史一起经过适当总结或拼接后再送入向量检索和LLM生成环节。LangChain提供了ConversationalRetrievalChain等链来简化这一过程它会自动管理对话记忆。可观测性与评估日志记录详细记录用户的每个问题、检索到的源文档、发送给LLM的完整提示词、LLM返回的答案。这对于调试和后期分析至关重要。评估指标建立评估体系例如检索相关性人工或通过模型评估检索到的文档与问题的相关程度。答案忠实度生成的答案是否严格基于提供的上下文有无幻觉。答案有用性答案是否真正解答了用户的问题。A/B测试可以对比不同分块策略、不同提示词模板、不同K值对最终答案质量的影响用数据驱动优化。6. 常见问题与故障排查实录在实际部署和运行过程中你几乎一定会遇到下面这些问题。这里记录了我踩过的坑和解决方案。6.1 连接与配置类问题问题1连接Cosmos DB时出现ServerSelectionTimeoutError或认证失败。排查步骤检查连接字符串这是最常见的问题。确保从Azure门户复制的连接字符串完整无误。特别注意密码中的特殊字符是否已正确URL编码。一个快速验证的方法是使用MongoDB Compass或pymongo命令行工具尝试连接。检查网络确保你的运行环境本地、虚拟机、容器能够访问互联网并且没有防火墙规则阻止对Cosmos DB端点通常是*.cosmos.azure.com的访问。如果公司有代理需要在代码或环境变量中配置。检查IP防火墙在Azure Cosmos DB资源的“网络”设置中如果你启用了“仅允许从特定IP访问”需要将你运行客户端的公网IP地址加入允许列表。对于生产环境更推荐使用服务终结点或私有终结点来保证安全。检查资源状态确认Cosmos DB资源在Azure门户中显示为“在线”状态没有因欠费等原因被禁用。问题2调用Azure OpenAI API时返回401或429错误。401认证失败。检查AZURE_OPENAI_API_KEY是否正确是否已经失效或复制了多余的空格。检查AZURE_OPENAI_ENDPOINT格式应为https://[your-resource-name].openai.azure.com/。429请求速率超过限制。Azure OpenAI对每分钟请求数RPM和每分钟令牌数TPM都有限制。在大量注入文档或高并发查询时容易触发。解决方案在代码中实现指数退避重试逻辑。LangChain的OpenAIEmbeddings和AzureChatOpenAI类通常内置了简单的重试。对于生产环境需要更精细的速率控制可以考虑使用队列或批处理来平滑请求。6.2 功能与效果类问题问题3机器人回答“根据提供的上下文我无法回答这个问题”但明明知识库里有相关内容。可能原因及排查检索失败首先检查检索环节。打印出retriever.get_relevant_documents(your_question)返回的源文档看是否真的包含了相关信息。如果没有问题出在检索。分块问题信息可能被不恰当地分割在两个块中导致单个块语义不完整。尝试调整chunk_size和chunk_overlap。嵌入模型问题对于非常专业或生僻的术语通用嵌入模型可能无法很好地捕捉其语义。可以尝试使用领域数据微调嵌入模型但这成本较高。K值太小增加search_kwargs{“k”: 4}中的K值例如增加到8或10看看是否能检索到相关文档。提示词问题即使检索到了如果提示词指令不清晰LLM也可能“偷懒”或误解。尝试强化提示词例如“你必须仔细阅读上下文并从中提取信息来回答问题。如果上下文中有任何相关信息请务必使用它来组织你的答案。”LLM本身限制有时模型可能会忽略部分上下文。可以尝试在提示词中要求模型“逐条引用上下文中的信息”或者使用更强大的模型如从gpt-35-turbo切换到gpt-4。问题4机器人回答的内容与提供的上下文不符出现“幻觉”。这是RAG需要解决的核心问题之一。强化提示词约束这是最有效的方法。在提示词开头使用非常强硬、明确的指令如“你必须且只能使用以下上下文中的信息来回答问题。严禁使用你自身的知识或编造任何信息。如果你在上下文中找不到答案就说‘我不知道’。”提供引用要求模型在答案中注明引用的来源例如用【1】【2】标注这不仅能增加可信度也能反向“迫使”模型更严格地依据上下文。可以在后处理中解析答案并与源文档关联。后处理验证设计一个简单的验证步骤例如用另一个轻量级模型或规则检查生成的答案中的关键事实是否能在检索到的上下文中找到对应表述。问题5处理速度慢尤其是首次问答或注入大量文档时。分析瓶颈向量化慢文档注入时调用嵌入模型API是主要耗时点。使用异步并发并注意API的TPM/RPM限制。检索慢检查Cosmos DB的向量索引是否已正确创建。确保查询时使用了向量索引可通过数据库的查询执行计划分析。对于超大规模向量库可能需要调整索引的算法参数如HNSW的efConstruction和efSearch参数这需要在创建集合时指定。LLM生成慢GPT-4比GPT-3.5-Turbo慢得多。如果对实时性要求高在效果可接受的前提下优先使用更快的模型。也可以调整max_tokens限制生成长度。6.3 生产部署进阶问题问题6如何实现数据的增量更新方案为每个文档块存储一个哈希值如MD5或基于内容的唯一标识。在注入新文档前先计算其分块后的哈希值与数据库中已有记录的哈希值对比。只插入新增或修改的块。对于已删除的源文件需要有一个机制来清理其对应的所有块。这需要额外的元数据管理逻辑。问题7如何控制成本Azure OpenAI成本嵌入模型text-embedding-ada-002价格低廉主要成本在注入阶段。注入后查询时的向量化将问题转为向量成本极低。聊天模型这是主要成本来源。优化方向a) 优化提示词减少不必要的指令b) 优化检索确保送入LLM的上下文精炼相关减少token消耗c) 根据场景选择合适模型能用gpt-35-turbo就不用gpt-4d) 实施用量监控和预算告警。Azure Cosmos DB成本主要取决于计算规格vCore数量、存储量和请求单位RU消耗。优化向量查询避免全表扫描根据负载调整计算规格设置自动缩放策略。这个项目作为一个功能完备的起点已经清晰地展示了构建基于私有知识的智能问答系统的全貌。从环境搭建、数据注入到问答交互每一步都涉及关键的技术选型和参数调优。在实际应用中最大的挑战往往不是让系统跑起来而是如何通过精细化的提示词工程、检索策略优化和系统架构调整让它产出稳定、准确、有用的答案。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2572886.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!