无需登录网页小游戏网站搜索引擎优化基本
2026/2/25 15:08:52 网站建设 项目流程
无需登录网页小游戏网站,搜索引擎优化基本,设计本哪个牌子笔记本好,专业外贸网站建设公司排名一、需求从哪来#xff1f;去年下半年#xff0c;公司HR部门找到我们#xff0c;说员工每天都在问重复的问题#xff1a;入职需要准备什么材料#xff1f;出差住宿能报多少钱#xff1f;忘记密码怎么办#xff1f;HR同事每天要回答…一、需求从哪来去年下半年公司HR部门找到我们说员工每天都在问重复的问题入职需要准备什么材料出差住宿能报多少钱忘记密码怎么办HR同事每天要回答几十遍同样的问题实在受不了了。他们希望能有个系统员工自己问系统自己答。听起来很简单对吧不就是做个FAQ吗但当我们深入聊下去发现事情没那么简单。财务部也有类似需求但他们的文档员工不能随便看。IT部也想把他们的操作手册接进来但也不想让其他部门看到内部系统配置。核心需求其实是员工能用自然语言提问系统能理解并给出准确答案不同部门的文档要严格隔离自然语言HR部门财务部门IT部门员工提问知识库系统权限检查HR文档财务文档IT文档二、第一个思考检索方式怎么选当时我们调研了两种主流方案方案A关键词检索Elasticsearch就是传统的全文检索用户输入出差住宿系统找包含这些词的文档。优点很明显可控性强结果可预测能精确匹配术语出问题容易调试但问题也很明显员工实际问的是去上海出差酒店能报多少钱你的文档写的是一线城市差旅住宿标准为500元/天关键词检索可能就找不到了因为它看不懂上海一线城市酒店住宿。方案B向量检索Embedding把文档和问题都转成向量然后算相似度。理论上能理解语义。听起来很美好不用维护同义词库能理解自然语言对提问方式不敏感但我们测试的时候发现了个大问题。三、关键转折点HR-Link的困境我们有个内部系统叫HR-Link是公司自研的人事系统。测试中发现两个典型场景场景1新员工直接问系统名称员工问HR-Link的登录地址是什么Elasticsearch✅ 能找到精确匹配HR-Link这个词向量检索❌ 找不到因为embedding模型没见过这个专有名词场景2员工用自然语言问功能员工问忘记密码怎么办文档写的是无法登录时请在HR-Link中点击忘记密码重置凭证Elasticsearch❌ 找不到因为员工没提HR-Link这个词向量检索✅ 能找到理解忘记密码和无法登录是同一件事这时候我们意识到两种方法各有盲区。关键词检索的盲区理解不了同义替换处理不了口语化表达需要人工维护词典向量检索的盲区不认识公司内部术语HR-Link、F-Flow、IT-SOP-005...对专有名词、项目代号无能为力那怎么办呢四、我们的方案混合检索既然单独用都有问题那就两个一起用。核心思路Elasticsearch找10条保证内部术语能命中向量检索找10条保证语义相关的能找到合并去重按文档元数据排序把最终结果交给LLM生成答案用户问题ES检索向量检索10条结果10条结果合并去重排序筛选LLM生成答案举个实际例子场景1内部系统名称员工问HR-Link的登录地址是什么ES搜HR-Link → 找到文档精确匹配专有名词✓向量搜索 → 找不到模型不认识这个词✗最终能返回正确答案因为ES找到了。场景2功能性提问员工问忘记密码怎么办文档写的是无法登录时请在HR-Link中点击忘记密码重置凭证ES搜忘记密码 → 可能找不到员工没提HR-Link排名靠后✗向量搜索 → 理解忘记密码和无法登录的语义关联 ✓最终也能返回正确答案因为向量找到了。场景3口语化表达员工问我登不上代码平台了文档写的是无法访问GitLab时请检查VPN连接ES搜登不上代码平台 → 找不到字面不匹配✗向量搜索 → 理解登不上≈无法访问代码平台≈GitLab✓最终也能返回正确答案。这就是互补。五、第二个难题多轮对话方案跑起来后我们又发现了新问题。员工第一次问一线城市出差住宿标准是多少系统答500元/天紧接着员工问二线城市呢系统懵了。为什么因为二线城市呢这个问题没有主语没有动词没有完整语境问题1: 一线城市住宿标准?系统: 500元/天问题2: 二线城市呢?问题ES搜二线城市可能找到无关内容向量太短语义不清晰如果直接去检索二线城市可能会找到二线城市招聘政策二线城市办公室地址各种不相关的内容解决方案Query Rewriting查询重写在检索之前先让LLM看一眼对话历史把问题补全。历史 Q1: 一线城市出差住宿标准是多少 A1: 500元/天 当前问题二线城市呢 重写后二线城市出差住宿标准是多少重写后再去检索就能准确找到文档了。二线城市呢?LLM重写二线城市出差住宿标准?混合检索找到正确文档六、权限隔离怎么做这是整个系统的安全基线。我们的做法很简单在文档入库时打标签检索时过滤。文档入库# 文档元数据 { content: 差旅住宿标准..., metadata: { department: finance, # 所属部门 doc_type: policy, # 文档类型 is_latest: true, # 是否最新版本 update_time: 2024-12-01 } }检索时过滤# 用户登录后获取部门信息 user_department finance # ES检索时加filter es_filter { department: user_department } # 向量检索时也加filter vector_filter { department: user_department }这样就能保证财务部员工只能搜到财务文档HR部员工只能搜到HR文档完全在检索层面隔离不是生成时才过滤财务部HR部IT部员工登录身份认证检索财务文档检索HR文档检索IT文档混合检索LLM生成答案七、技术实现整个系统基于LangChain构建主要组件1. 文档处理from langchain.text_splitter import RecursiveCharacterTextSplitter # 文档分块 text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap50 ) chunks text_splitter.split_documents(documents)2. 双路检索from langchain.retrievers import EnsembleRetriever from langchain.vectorstores import FAISS from langchain.retrievers import BM25Retriever # Elasticsearch检索器 bm25_retriever BM25Retriever.from_documents(chunks) bm25_retriever.k 10 # 向量检索器 vectorstore FAISS.from_documents(chunks, embeddings) vector_retriever vectorstore.as_retriever(search_kwargs{k: 10}) # 混合检索 ensemble_retriever EnsembleRetriever( retrievers[bm25_retriever, vector_retriever], weights[0.5, 0.5] )3. Query重写from langchain.prompts import ChatPromptTemplate from langchain.chat_models import ChatAnthropic rewrite_prompt ChatPromptTemplate.from_messages([ (system, 根据对话历史将用户的简短问题补全为完整的问题。), (human, 对话历史{history}\n当前问题{question}) ]) llm ChatAnthropic(modelclaude-sonnet-4-20250514) rewrite_chain rewrite_prompt | llm4. 完整流程from langchain.chains import ConversationalRetrievalChain # 构建问答链 qa_chain ConversationalRetrievalChain.from_llm( llmllm, retrieverensemble_retriever, return_source_documentsTrue, verboseTrue ) # 执行查询 result qa_chain({ question: user_question, chat_history: chat_history })是否用户提问权限检查是否多轮?LLM重写问题使用原问题混合检索文档排序LLM生成答案返回结果八、实际效果系统上线三个月后我们看了下数据问答准确率单次问答85%以上多轮对话78%左右召回率提升纯ES62%纯向量71%混合检索89%典型成功案例报销需要什么发票 → 准确找到《差旅报销制度》忘记密码怎么办 → 准确找到《IT自助服务指南》向量理解语义HR-Link登录地址 → 精确匹配内部系统文档ES精确匹配我登不上代码平台 → 准确找到GitLab相关文档向量理解口语典型失败案例能不能提前报销 → 文档没有这个例外情况去年的制度是怎样的 → 旧版本文档被降权了九、踩过的坑坑1分块大小最开始我们设置chunk_size1000结果发现很多问题只需要一句话就能回答但系统返回了一大段无关内容。后来改成500效果好多了。坑2向量模型选择一开始用的英文模型中文效果很差。后来换成BGE中文模型准确率直接提升20%。坑3权限过滤的位置最开始是检索完再过滤结果发现可能检索20条过滤后只剩3条。改成检索前就加filter问题解决。坑4文档更新不同步Elasticsearch更新了向量库没更新导致返回的内容不一致。后来加了版本号机制强制同步更新。十、总结回过头看整个方案的核心其实就三点混合检索解决了单一方案的盲区ES保证精确匹配向量保证语义理解Query重写解决了多轮对话问题不能简单地用原始问题检索需要补全上下文元数据过滤解决了权限隔离检索前就过滤不是生成时才控制这不是什么高深的技术就是针对真实业务场景一步步解决实际问题。最重要的是不要迷信某一种方案要根据实际情况组合使用。关键词检索和向量检索不是替代关系而是互补关系。希望这篇文章能给正在做企业知识库的同学一些参考。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询