尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

从零构建RAG问答系统:LangChain、Milvus与Agent实战指南

从零构建RAG问答系统:LangChain、Milvus与Agent实战指南 在实际 AI 大模型应用开发中掌握 LangChain、Milvus、RAG、Agent 和 FDE 等技术栈已经从一个加分项变成了面试中的必答题。很多开发者虽然能说出这些名词但被问到具体如何串联、如何选型、如何排查生产问题或者被要求现场设计一个检索增强生成系统时往往难以给出有深度的回答。这背后反映出的是对这些技术“知其然不知其所以然”缺乏从零搭建、调优和排错的完整工程经验。本文旨在构建一个面向 2026 年技术面试的深度知识体系。我们不会停留在概念罗列而是假设你正在为一个真实的智能问答系统面试做准备。我们将从零开始串联 LangChain 作为应用框架、Milvus 作为向量数据库、RAG 作为核心范式、Agent 作为决策大脑、FDE 作为工程保障完整地走一遍技术选型、环境搭建、核心实现、问题排查和进阶思考的全过程。通过这个过程你将不仅能回答“是什么”更能清晰地阐述“为什么这么选”、“怎么做更稳健”以及“出了问题怎么查”从而在技术面试中展现出扎实的工程能力和架构思维。1. 核心概念拆解与技术选型逻辑在开始动手之前必须厘清每个组件扮演的角色及其相互间的依赖关系。一个常见的误区是孤立地学习每个技术却不理解它们在流水线中的位置。1.1 LangChain大模型应用的“脚手架”与“粘合剂”LangChain 不是一个独立的功能模块而是一个用于构建基于大语言模型应用的开发框架。它的核心价值在于提供了标准化的抽象如 Chain、Agent、Tool、Memory和大量预构建的组件将大模型与外部数据源、工具、记忆系统高效地连接起来。通俗理解想象你要盖房子AI应用大模型LLM是强大的起重机。LangChain 就是一套标准的建筑图纸、预制件如窗户、门和施工流程它告诉你如何用起重机吊起预制件并按照图纸把它们组装成房子而不是让你每次都用起重机去搬砖。技术定义LangChain 是一个开源框架通过提供模块化的“链”Chains、“代理”Agents、“检索器”Retrievers等抽象简化了将大语言模型与外部数据和计算资源集成的过程。在项目中的作用在我们的智能问答系统中LangChain 负责组织工作流。它会调用 Milvus 进行向量检索通过Retrievers将检索结果与大模型提示词模板PromptTemplate结合形成最终的提问交给大模型通过LLMChain并可能根据模型输出决定是否调用搜索 API 等工具通过Agent。常见误解很多人认为 LangChain 是必须的。实际上对于简单场景直接调用大模型 API 并手动拼接提示词可能更直接。LangChain 的优势在于复杂、可复用、需要与多种工具交互的场景。在面试中能说清楚什么情况下该用 LangChain什么情况下不该用是区分经验的重要标志。1.2 Milvus专为向量搜索而生的“高速索引库”当你的 AI 应用需要处理文本、图像、音视频的嵌入向量Embeddings并进行相似性搜索时传统的关系型数据库如 MySQL或文档数据库如 MongoDB效率极低。Milvus 就是为解决这个问题而设计的。通俗理解如果你的数据是成千上万张图片的特征向量你想快速找到与某张图最相似的10张图。Milvus 就像一个为这种“找相似”任务特制的图书馆它用专门的索引算法如 IVF_FLAT, HNSW把书向量整理好让你能瞬间找到目标而不是在一排排书架上逐本对比。技术定义Milvus 是一个开源的向量数据库它能够对海量的向量数据进行高效的存储、索引和近似最近邻搜索。在项目中的作用在 RAG 系统中文档被切分并转化为向量后存入 Milvus。当用户提问时问题也被转化为向量Milvus 负责从海量文档向量中快速找出最相关的几个片段作为上下文提供给大模型。关键参数与选型选择 Milvus 时必须考虑索引类型、度量方式METRIC_TYPE和搜索参数nprobe, ef。例如IVF_FLAT索引适合内存有限、追求高召回率的场景而HNSW索引则适合追求极致搜索速度、内存充足的情况。度量方式L2欧氏距离和IP内积的选择取决于你使用的嵌入模型。1.3 RAG让大模型“博闻强识”的核心范式检索增强生成是大模型应用目前最主流、最实用的架构范式之一。它解决了大模型的两个核心痛点知识过时和幻觉。通俗理解大模型像一个天赋极高但记忆有限的天才。RAG 就是给这个天才配了一个超级资料库Milvus和一个聪明的秘书LangChain。当用户问一个专业问题时秘书立刻去资料库找到最相关的资料连同问题一起交给天才。天才基于这些最新、最准确的资料来回答而不是仅凭自己可能过时或模糊的记忆。技术定义RAG 是一种通过从外部知识库中检索相关信息并将其作为上下文与大语言模型的原始提示词相结合来生成更准确、更相关答案的技术架构。工作流程索引将原始知识文档切块、向量化存入向量数据库。检索将用户查询向量化从向量库中检索出 Top-K 个相关片段。增强将检索到的片段与原始问题组合构造出包含上下文的增强提示词。生成将增强提示词提交给大模型生成最终答案。面试深度点不要只讲流程。要能讨论 chunk 策略如何切分文档能保证信息完整性、重排序Rerank的必要性Milvus 返回的 Top-K 一定是最相关的吗、以及多轮对话中如何维护检索历史。1.4 Agent赋予大模型“行动力”的决策中枢Agent 是大模型从“聊天机器人”迈向“自动执行体”的关键。它让模型具备了使用工具、规划步骤、感知环境并持续行动的能力。通俗理解如果 RAG 是让模型“会查资料”那么 Agent 就是让模型“会干活”。你告诉 Agent “帮我分析一下上周的销售数据并写份报告”它能够自主决定先调用数据库工具查数据再调用数据分析工具生成图表最后调用文档编写工具整合成报告。它像一个拥有多种技能并懂得调配它们的项目经理。技术定义Agent 是一个以大语言模型为核心具备工具使用能力、任务规划能力和记忆能力的系统。它通过“思考-行动-观察”的循环来逐步完成任务。与 RAG 的关系Agent 和 RAG 不是互斥的而是可以协同的。一个高级的 Agent 在回答用户问题时可以主动调用 RAG 工具即一个检索器来获取最新知识然后再基于知识进行推理和回答。这就是Agentic RAG的概念。核心组件一个典型的 Agent 包含LLM大脑、Tools技能如搜索、计算、API调用、Memory记忆包括对话历史和工具执行结果和AgentExecutor控制循环的执行器。1.5 FDE大模型落地的工程化保障FDE 是一个相对宽泛的工程概念在不同语境下可能有不同侧重。在当前大模型工程化背景下它通常指代围绕大模型应用的全链路工程保障体系。通俗理解如果把大模型比作一台高性能发动机LangChain、Milvus 等就是变速箱和底盘。FDE 则是整车的制造工艺、质量控制、安全测试和售后维护体系。它确保这辆车不仅跑得快还要跑得稳、安全、可维护。可能的含义与面试关联框架/工具/环境指支持大模型应用开发、评估、部署的完整工具链。反馈驱动进化指通过收集用户对模型输出的反馈如点赞、点踩持续优化模型或检索系统。全链路工程师指具备从前端交互、后端逻辑、数据工程到模型运维全方位能力的角色。在面试中的体现面试官问及 FDE往往是在考察你的工程全局观。你可以从以下几个维度展开可观测性如何监控 RAG 系统的检索质量、生成延迟、Token 消耗和用户满意度评估体系如何定量评估回答的准确性、相关性和有用性如何做 A/B 测试持续迭代如何根据bad case坏案例反哺优化文档处理、chunk策略或提示词工程安全与合规如何防止敏感信息泄露、恶意提示注入和生成有害内容2. 从零搭建一个可运行的 RAG 问答系统我们将以“公司内部知识库问答”为场景搭建一个最小可运行的 RAG 系统。这将涵盖环境准备、数据预处理、向量入库、检索增强和问答生成的全流程。2.1 环境准备与依赖配置首先我们需要一个干净的 Python 环境。强烈建议使用conda或venv创建虚拟环境。# 创建并激活虚拟环境 conda create -n rag_demo python3.10 conda activate rag_demo接下来安装核心依赖。这里我们选择常用的库和版本。# 安装 LangChain 及其相关组件 pip install langchain langchain-community langchain-core # 安装 OpenAI 的嵌入模型和聊天模型接口 (也可替换为其他如 DashScope, ZhipuAI) pip install openai # 安装向量数据库客户端和文本加载器 pip install pymilvus pip install langchain-milvus # LangChain 官方集成的 Milvus 包 pip install pypdf # 用于读取PDF文档 pip install python-dotenv # 管理环境变量对于 Milvus 数据库本身我们有多种部署方式。对于本地开发和面试演示使用 Docker 启动单机版是最快捷的。# 拉取 Milvus 单机版镜像并启动 docker pull milvusdb/milvus:v2.4.0-rc.1 docker run -d --name milvus-standalone \ -p 19530:19530 \ -p 9091:9091 \ milvusdb/milvus:v2.4.0-rc.1注意生产环境强烈建议使用分布式集群部署并考虑数据持久化、高可用和监控。面试中如果被问到可以提及helm部署到 Kubernetes 或使用Milvus Operator的方案。启动后可以通过docker ps检查容器状态并通过http://localhost:9091访问 Milvus 自带的图形化管理界面Attu。最后在项目根目录创建.env文件存放敏感配置# .env OPENAI_API_KEYyour_openai_api_key_here OPENAI_BASE_URLhttps://api.openai.com/v1 # 如果使用其他兼容API可修改此处 MILVUS_HOSTlocalhost MILVUS_PORT195302.2 知识文档处理与向量化入库假设我们有一个名为company_handbook.pdf的公司手册 PDF 文件。第一步是加载、切分并向量化这些文档。# document_processor.py import os from dotenv import load_dotenv from langchain_community.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_milvus import Milvus # 加载环境变量 load_dotenv() # 1. 加载文档 loader PyPDFLoader(./docs/company_handbook.pdf) documents loader.load() print(fLoaded {len(documents)} pages from PDF.) # 2. 切分文本 # 这是RAG中非常关键的一步切分过大可能包含无关信息过小可能丢失上下文。 text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每个块约500字符 chunk_overlap50, # 块之间重叠50字符保持语义连贯 separators[\n\n, \n, 。, , , , , , ] # 中文友好分隔符 ) chunks text_splitter.split_documents(documents) print(fSplit into {len(chunks)} text chunks.) # 3. 初始化嵌入模型 embeddings OpenAIEmbeddings( modeltext-embedding-3-small, # 性价比高的嵌入模型 openai_api_keyos.getenv(OPENAI_API_KEY), base_urlos.getenv(OPENAI_BASE_URL) ) # 4. 连接 Milvus 并创建集合Collection # 集合类似于数据库中的表用于存储向量和元数据。 vector_store Milvus.from_documents( documentschunks, embeddingembeddings, connection_args{ host: os.getenv(MILVUS_HOST), port: os.getenv(MILVUS_PORT), }, collection_namecompany_knowledge, # 集合名称 drop_oldTrue, # 如果集合已存在则删除重建。生产环境慎用 ) print(Documents have been embedded and stored in Milvus.)关键解释与常见坑点chunk_size 与 chunk_overlapchunk_size需要根据嵌入模型的最大输入长度和文档特点调整。中文文档按字符数算。overlap能防止句子被生硬切断是保证检索结果上下文连贯性的重要手段。嵌入模型选择text-embedding-3-small是 OpenAI 较新且性价比高的模型。如果使用国产模型需更换为对应的Embeddings类如DashScopeEmbeddings。drop_oldTrue这行代码在开发时很方便但会清空原有数据。在生产环境中应该先检查集合是否存在然后采用增量插入的方式。元数据存储Milvus.from_documents会自动将文档的page_content和metadata如来源、页码一起存储。这在后续展示引用来源时非常有用。2.3 构建检索链并进行问答数据入库后我们就可以构建一个简单的问答链了。# rag_chain.py import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate from langchain_milvus import Milvus from langchain_openai import OpenAIEmbeddings load_dotenv() # 1. 重新连接 Milvus 向量库模拟应用启动时 embeddings OpenAIEmbeddings( modeltext-embedding-3-small, openai_api_keyos.getenv(OPENAI_API_KEY), base_urlos.getenv(OPENAI_BASE_URL) ) vector_store Milvus( embedding_functionembeddings, connection_args{host: os.getenv(MILVUS_HOST), port: os.getenv(MILVUS_PORT)}, collection_namecompany_knowledge, ) # 2. 将向量库转换为检索器 # search_kwargs 可以控制返回结果的数量和搜索参数 retriever vector_store.as_retriever(search_kwargs{k: 3}) # 返回最相关的3个片段 # 3. 定义提示词模板 # 这是控制大模型行为的关键。清晰的指令和上下文格式能极大提升回答质量。 prompt_template 你是一个专业的公司知识库助手请严格根据以下提供的上下文信息来回答问题。 如果上下文信息中没有相关答案请直接说“根据现有知识库我无法回答这个问题”不要编造信息。 上下文 {context} 问题{question} 请用中文给出专业、清晰的回答 PROMPT PromptTemplate( templateprompt_template, input_variables[context, question] ) # 4. 初始化大语言模型 llm ChatOpenAI( modelgpt-3.5-turbo, # 可根据需要换为 gpt-4 或其他模型 temperature0.1, # 低温度使输出更确定、更专注于上下文 openai_api_keyos.getenv(OPENAI_API_KEY), base_urlos.getenv(OPENAI_BASE_URL) ) # 5. 创建检索问答链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # 最简单的方式将所有检索到的上下文“塞”进提示词 retrieverretriever, chain_type_kwargs{prompt: PROMPT}, return_source_documentsTrue # 返回源文档便于追溯和调试 ) # 6. 进行问答 if __name__ __main__: query 公司的年假政策是怎样的 result qa_chain.invoke({query: query}) print(问题, query) print(\n答案, result[result]) print(\n--- 参考来源 ---) for i, doc in enumerate(result[source_documents]): print(f[{i1}] {doc.metadata.get(source, N/A)} - P{doc.metadata.get(page, N/A)}) print(f 摘要{doc.page_content[:200]}...) # 打印前200字符运行与验证确保 Milvus 服务正在运行。首先运行python document_processor.py处理文档并入库。然后运行python rag_chain.py进行提问。观察输出应该包含基于知识库生成的答案以及答案所引用的文档片段和页码。关键解释与常见坑点chain_type“stuff”这是最简单的上下文处理方式适合检索片段较少、总长度不超过模型上下文窗口的情况。如果片段很多很长需要考虑“map_reduce”、“refine”等更复杂的方式它们能处理更长的上下文但调用 LLM 次数更多、成本更高。temperature参数在 RAG 中通常设置较低的温度如 0.1让模型更忠实于提供的上下文减少自由发挥导致的幻觉。检索器参数{“k”: 3}k值需要权衡。太小可能信息不足太大会增加提示词长度和成本并可能引入噪声。这是一个需要根据实际效果调整的超参数。return_source_documentsTrue这个选项对于调试和建立用户信任至关重要。你可以向用户展示答案的依据来自哪里。3. 进阶构建一个具备工具调用能力的 Agent现在我们让系统变得更智能。假设用户的问题可能超出知识库范围比如问“今天北京的天气怎么样”。我们需要让 Agent 学会在知识库无法回答时自动调用外部工具如网络搜索。# agent_with_rag.py import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_react_agent from langchain import hub from langchain.tools import Tool from langchain_milvus import Milvus from langchain_openai import OpenAIEmbeddings from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate # 假设我们有一个模拟的搜索工具实际中可替换为 SerpAPI、DuckDuckGo 等 from langchain.tools import tool tool def search_web(query: str) - str: 当需要获取实时信息或知识库中没有的信息时使用此工具搜索网络。 # 这里是模拟实现。真实场景应调用搜索引擎API。 print(f[模拟网络搜索] 关键词: {query}) # 模拟返回一些搜索结果 return f关于{query}的模拟搜索结果今天北京晴气温15-25℃。 load_dotenv() # 1. 初始化基础组件LLM, 向量库RAG链 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0, openai_api_keyos.getenv(OPENAI_API_KEY)) embeddings OpenAIEmbeddings(modeltext-embedding-3-small, openai_api_keyos.getenv(OPENAI_API_KEY)) vector_store Milvus(embedding_functionembeddings, connection_args{host: os.getenv(MILVUS_HOST), port: os.getenv(MILVUS_PORT)}, collection_namecompany_knowledge) retriever vector_store.as_retriever(search_kwargs{k: 3}) prompt_template ... # 复用之前的提示词模板 PROMPT PromptTemplate(templateprompt_template, input_variables[context, question]) rag_chain RetrievalQA.from_chain_type(llmllm, chain_typestuff, retrieverretriever, chain_type_kwargs{prompt: PROMPT}) # 2. 将 RAG 链包装成一个工具 tool def query_company_knowledgebase(question: str) - str: 当问题涉及公司内部政策、产品、流程等知识时使用此工具查询公司知识库。 result rag_chain.invoke({query: question}) return result[result] # 3. 定义工具列表 tools [query_company_knowledgebase, search_web] # 4. 从 LangChain Hub 拉取一个适合的 Agent 提示词ReAct 范式 # 也可以自己编写更复杂的提示词 agent_prompt hub.pull(hwchase17/react-chat) # 5. 创建 Agent 和 Executor agent create_react_agent(llm, tools, agent_prompt) agent_executor AgentExecutor(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue) # 6. 运行 Agent if __name__ __main__: queries [ 公司的年假有多少天, # 应使用知识库工具 今天北京天气如何, # 应使用网络搜索工具 请总结一下公司的考勤制度并告诉我明天会下雨吗 # 应组合使用两个工具 ] for q in queries: print(f\n{*50}) print(f用户问题: {q}) print(f{*50}) try: result agent_executor.invoke({input: q, chat_history: []}) print(f最终答案: {result[output]}) except Exception as e: print(f执行出错: {e})运行与观察运行此脚本你会看到verboseTrue模式下 Agent 的完整思考过程Thought, Action, Observation。它会自动判断问题类型并选择调用query_company_knowledgebase还是search_web工具甚至能串联多个工具。关键解释与面试要点ReAct 范式hwchase17/react-chat提示词引导模型以“思考-行动-观察”的循环工作。这是构建可靠 Agent 的经典模式。工具设计每个工具必须有清晰的名称、描述和参数定义。大模型依赖这些描述来决定何时调用哪个工具。工具描述是“人机协作”的接口契约。handle_parsing_errorsTrue当模型输出不符合工具调用格式时这个参数能防止整个链崩溃而是进行重试或错误处理。这在生产环境中很重要。与纯 RAG 的区别这个系统具备了动态决策能力。它不再是被动检索而是能主动选择信息源。这是Agentic RAG的雏形。4. 生产环境挑战与排查指南一个能在本地跑通的 Demo 距离生产可用还有很长的路。以下是面试中高频出现的生产环境问题及排查思路。4.1 检索质量低下答非所问或信息不全这是 RAG 系统最常见的问题。问题现象可能原因检查与排查步骤解决方案答案与问题无关1. 嵌入模型不匹配如用英文模型处理中文。2. chunk 策略不合理切碎了语义单元。3. 检索的 Top-K 值太小或太大。4. 向量索引类型或参数如nprobe不合适。1. 检查嵌入模型名称和生成向量的维度。2. 打印出检索到的源文档看内容是否相关。3. 检查 Milvus 搜索返回的相似度分数。1. 更换或微调嵌入模型。2. 调整chunk_size和chunk_overlap尝试按段落、标题切分。3. 调整k值并考虑引入重排序模型对 Top-N 结果进行精排。4. 在 Milvus 中尝试不同的索引类型如 HNSW并调整ef、nprobe参数。答案信息不全1. 答案所需信息分散在多个 chunk 中。2. 检索时未命中关键 chunk。1. 分析问题手动在向量库中搜索应包含答案的 chunk看是否被检索到。2. 检查 chunk 的 overlap 是否足够。1. 优化 chunk 策略确保逻辑单元的完整性。2. 增加k值或使用“map_reduce”链类型来合并多个 chunk 的信息。3. 实施多向量检索对同一文档同时存储摘要向量和详细向量。答案包含幻觉1. 模型未严格遵守“只基于上下文回答”的指令。2. 上下文本身包含矛盾或错误信息。1. 检查提示词模板是否足够强硬和清晰。2. 检查检索到的源文档质量。1. 强化提示词加入“严禁编造”等指令并降低temperature。2. 在上下文中明确标注来源让模型知道哪些是引用。3. 建立知识库文档的质量审核流程。4.2 系统性能与稳定性问题问题现象可能原因检查与排查步骤解决方案查询延迟高1. Milvus 未建立索引或索引类型效率低。2. 网络延迟高尤其是调用云端嵌入/LLM服务。3. 单个提示词过长模型响应慢。1. 在 Milvus 中检查集合的索引情况。2. 使用time模块对检索、LLM调用分别计时。3. 监控 Token 使用量。1. 为向量集合创建合适的索引如 HNSW。2. 考虑缓存频繁查询的嵌入向量或最终答案。3. 对文本进行压缩或摘要减少上下文长度。4. 考虑使用更快的模型或本地部署模型。Milvus 内存或磁盘占用过高1. 向量数据量增长快。2. 索引占用了大量内存。3. 日志或数据未清理。1. 使用Attu或milvus-cli查看集合数据和索引大小。2. 检查服务器资源监控。1. 规划数据生命周期归档或删除旧数据。2. 对于只读历史数据可考虑使用磁盘索引如DISKANN。3. 调整 Milvus 配置如cache.cache_size。Agent 陷入循环或调用错误工具1. 工具描述不清晰。2. 模型对复杂任务规划能力不足。3. 缺少最大迭代次数限制。1. 查看verbose日志观察 Agent 的思考过程。2. 检查是否出现重复的 Thought-Action 循环。1. 优化工具的描述使其职责单一、边界清晰。2. 使用更强大的模型如 GPT-4作为 Agent 的“大脑”。3. 在AgentExecutor中设置max_iterations和max_execution_time。4.3 数据一致性与管理问题当知识库更新时如何保证 Milvus 中的数据与源文档一致问题文档A.pdf更新后Milvus 中存储的仍是旧版本的向量。解决方案版本化为每个文档或 chunk 存储一个版本号或哈希值如 MD5。更新时先计算新文档哈希与库中记录对比仅更新有变化的文档对应的向量。增量更新设计一个upsert流程。识别出文档中新增、修改、删除的部分只对受影响的部分重新生成向量并更新 Milvus。这比全量重建更高效。定时全量重建对于更新不频繁的小型知识库可以在低峰期定时触发全量重建流程。但需要处理好重建期间的服务可用性如双写、切换集合。面试回答要点强调“没有银弹”需要根据数据更新频率、数据量、实时性要求来做权衡。可以提及使用消息队列如 Kafka来监听文档变更事件触发异步向量化更新任务。5. 面向未来的架构思考与扩展方向在掌握了基础构建和问题排查后面试官可能会考察你对技术演进的看法和架构设计能力。5.1 从 RAG 到 Agentic RAG基础的 RAG 是被动的检索-应答。Agentic RAG 则是主动的、具有规划能力的。动态检索Agent 可以根据对话历史决定是否需要重新检索、检索什么关键词。多步查询对于复杂问题Agent 可以将其分解为多个子问题分别检索后再综合。自我验证Agent 可以对自己生成的答案调用检索工具进行事实核查。面试体现你可以描述如何用LangGraphLangChain 的新库用于构建有状态的、多环节的工作流来编排一个包含“问题分解”、“并行检索”、“答案综合”、“自我验证”的复杂 Agent。5.2 混合检索与查询理解单纯的向量检索语义搜索有时不够精确尤其是对于包含具体名称、日期、代码的查询。混合检索结合向量搜索和传统的关键词搜索如 BM25。Milvus 支持在同一个查询中执行这两种搜索并合并结果。查询重写/扩展在检索前先用一个小模型对用户原始查询进行改写、纠错或扩展生成更利于检索的查询语句。面试体现讨论 Milvus 的hybrid search功能以及如何设置向量搜索和关键词搜索的权重ANN和BM25的权重参数。5.3 评估与持续迭代FDE 理念的实践如何证明你的 RAG 系统在变好这需要建立评估体系。自动化评估构建一个测试集QA对定期运行评估指标如检索相关度检索到的文档与问题的匹配度。答案忠实度答案是否严格来源于提供的上下文。答案正确性与标准答案的匹配度可用 ROUGE, BLEU 或 GPT-4 作为裁判。人工评估与反馈闭环在产品中设计“点赞/点踩”功能收集用户反馈。将 bad case 纳入分析驱动对文档处理、chunk 策略、提示词或检索参数的优化。面试体现提出一个简单的评估框架设计例如每周自动运行测试集并生成报告团队每周评审 bad case 并确定优化项。5.4 技术选型对比当被问到“为什么选 LangChain 而不是 LlamaIndex”或“为什么选 Milvus 而不是 Pinecone”时你需要从多个维度分析。维度LangChainLlamaIndex设计哲学通用 AI 应用框架强调链、代理、工具的组合。专为 RAG 和数据索引查询优化对数据连接器、索引结构有更深支持。灵活性更高可以自由组合各种组件构建复杂工作流。相对更专注在 RAG 流水线上提供了更多“开箱即用”的高级功能。学习曲线概念较多初期可能感觉复杂。对于纯 RAG 场景上手可能更快。适合场景需要复杂 Agent 逻辑、多工具编排、自定义链路的场景。核心需求是快速构建高效、可定制的 RAG 系统。维度Milvus (开源)Pinecone (托管服务)部署模式可私有化部署对数据主权、成本控制有要求。全托管云服务无需运维。运维成本需要自行维护集群、监控、备份。零运维按使用量付费。可控性高可以深度调优索引参数、部署架构。低受限于服务商提供的功能和 SLA。成本前期硬件和人力成本高长期可能更低。按查询和存储量计费初期成本低随规模增长而增加。回答选型问题时要结合项目背景是初创公司快速验证想法还是大型企业有严格的数据安全和定制化需求。掌握 LangChain、Milvus、RAG、Agent 和 FDE 这一套技术栈真正的价值不在于记住 API 调用而在于理解它们如何构成一个健壮的、可进化的智能系统。从环境搭建到生产排错从被动检索到主动 Agent从功能实现到评估迭代每一个环节都充满了工程权衡和设计决策。在面试中能清晰地阐述这些权衡背后的思考能针对一个模糊的需求勾勒出从数据准备到服务上线的完整技术方案并能预见到可能的风险和应对策略这才是高级工程师与初级开发者的分水岭。建议你在理解本文内容的基础上亲手搭建一遍这个系统并尝试引入一个真实的外部工具如天气 API或者用LangGraph重构一个多步骤的工作流这会让你的理解更加深刻。
返回列表