检索增强生成(RAG)实战指南:从原理到企业级应用搭建

news2026/5/1 10:48:32
1. 项目概述为什么我们需要检索增强型大语言模型如果你最近在尝试用大语言模型LLM处理一些稍微复杂点的任务比如让它帮你总结一份几十页的PDF报告或者回答一些关于你公司内部知识库的问题大概率会遇到这种情况模型要么开始“一本正经地胡说八道”生成一些看似合理但完全错误的信息我们称之为“幻觉”要么就干脆告诉你“我的知识截止到XXXX年无法回答这个问题”。这种无力感相信很多开发者都深有体会。这正是“Wang-Shuo/A-Guide-to-Retrieval-Augmented-LLM”这个项目要解决的核心痛点。它不是一个具体的工具库而是一份详尽的“指南”或“路线图”。简单来说它系统性地阐述了如何将大语言模型LLM与外部知识检索系统结合起来构建一个更强大、更可信、知识可更新的智能应用。这种架构模式就是我们常说的“检索增强生成”Retrieval-Augmented Generation简称RAG。想象一下LLM是一个天赋异禀但记忆有限、知识库过时的“超级大脑”。RAG的思路就是给这个大脑配上一个高效的“外部记忆库”通常是向量数据库和一个“图书管理员”检索器。当用户提问时不是让大脑凭空回忆而是先让图书管理员去记忆库里快速找到最相关的几本书文档片段然后把问题和这些书一起交给大脑让它基于这些最新、最准确的资料来组织答案。这样一来答案的准确性、时效性和针对性都得到了质的飞跃。这份指南的价值在于它没有停留在概念层面而是深入到工程实践的每一个环节。从为什么需要RAG到如何选择嵌入模型、搭建向量数据库再到如何设计检索策略、优化提示工程最后到如何评估整个系统的效果它提供了一套完整的、可落地的思维框架和实践路径。无论你是想构建一个智能客服、一个企业知识问答系统还是一个能阅读并分析长文档的研究助手这份指南都能帮你避开初期探索的诸多深坑直接站在一个相对成熟的起点上。2. 核心架构拆解RAG系统的四大支柱一个健壮的RAG系统远不止是“向量搜索LLM”的简单拼接。根据指南的梳理我们可以将其核心架构分解为四个相互关联、层层递进的支柱。理解这四部分就掌握了构建RAG应用的钥匙。2.1 知识库构建与嵌入把非结构化数据变成“可搜索的记忆”这是所有RAG应用的基石。你的原始数据可能是PDF、Word、网页、数据库记录甚至是音频转录文本。第一步就是将这些“非结构化”数据转化为机器能够高效理解和匹配的格式。核心流程是“分块-嵌入-存储”文档加载与预处理使用像LangChain的DocumentLoader或LlamaIndex的SimpleDirectoryReader这样的工具从各种来源加载文档。预处理包括清理无关字符、统一编码等。文本分块这是至关重要且容易被低估的一步。你不能把整本书扔给检索器那样效率极低。需要将长文本切割成语义连贯的“块”。分块策略直接影响检索质量固定大小分块最简单比如每500个字符一块。但可能切断句子或段落破坏语义。递归分块按段落、句子等自然边界递归切割更符合语言结构。语义分块利用模型判断语义连贯性进行分割效果最好但计算成本高。实操心得没有银弹。对于技术文档按章节/子标题分块效果很好对于对话记录按对话轮次分块更合理。通常需要结合文档类型和查询特点进行实验。一个常见的技巧是让块之间有一定重叠例如重叠50-100个字符以避免关键信息恰好被切在块边缘而丢失。文本嵌入将每个文本块通过一个“嵌入模型”转化为一个高维向量比如768或1536维。这个向量就像是该文本块的“数学指纹”语义相近的文本其向量在空间中的距离通常用余弦相似度衡量也更近。模型选择指南会对比text-embedding-ada-002(OpenAI)、BGE(智源)、Sentence Transformers等开源模型。选择时需权衡效果、速度、成本和是否支持本地部署。维度更高的维度通常能承载更多信息但也会增加存储和计算成本。向量存储将文本块对应向量元数据三元组存入专门的向量数据库。元数据如来源文件名、页码、创建时间对于后续的引用和过滤非常有用。数据库选型Chroma轻量易用适合原型开发Pinecone和Weaviate是成熟的托管服务省心但付费Milvus和Qdrant是高性能开源选择适合大规模生产环境。指南通常会建议根据数据量、性能需求和运维能力来选择。2.2 检索策略设计如何找到最相关的信息有了向量数据库检索就是计算用户查询的向量与库中所有向量之间的相似度返回最相似的Top-K个文本块。但事情没这么简单直接向量搜索“语义搜索”有时会漏掉关键词完全匹配但表述不同的信息。因此现代RAG系统通常采用混合检索策略密集检索即上述的向量语义搜索擅长理解意图和同义词。稀疏检索如BM25算法基于关键词匹配进行检索擅长处理精确术语、命名实体等。混合检索将两者的搜索结果按分数融合如加权求和、倒数排名融合兼顾语义和关键词通常能获得最全面的结果。重排序在初步检索出较多结果如Top-50后使用一个更精细但更耗时的“交叉编码器”模型对结果进行重新排序选出最相关的Top-3或Top-5给LLM这能显著提升最终答案的质量。# 一个简化的混合检索流程示意伪代码风格 query “如何配置LangChain的对话记忆” # 1. 稀疏检索 (BM25) sparse_results bm25_retriever.get_relevant_documents(query, k20) # 2. 密集检索 (向量搜索) dense_results vector_store.similarity_search(query, k20) # 3. 结果融合 (例如使用加权分数) combined_results hybrid_fusion(sparse_results, dense_results, weights[0.3, 0.7]) # 4. 重排序 (可选) reranked_results reranker.rerank(query, combined_results[:50]) final_contexts reranked_results[:5] # 选取最相关的5个片段2.3 提示工程与生成让LLM基于上下文“好好说话”检索到了相关上下文如何让LLM利用它们生成最佳答案这依赖于精心设计的提示模板。一个基础的RAG提示模板通常包含系统指令定义LLM的角色和回答要求如“你是一个专业的助手请严格根据提供的上下文回答问题。”。上下文将检索到的多个文本块拼接起来并清晰标注来源。用户问题原始查询。回答格式要求例如要求列出引用来源、不确定时明确说明等。你是一个准确、可靠的AI助手。请严格根据以下提供的上下文信息来回答问题。如果上下文中的信息不足以回答问题请直接说“根据提供的信息我无法回答这个问题”不要编造信息。 上下文 --- [来源1] 文本块1内容... [来源2] 文本块2内容... --- 问题{user_question} 请基于以上上下文给出准确、简洁的回答。并在回答末尾以“参考来源[来源编号]”的格式注明答案所依据的上下文来源。进阶技巧少样本提示在提示中提供一两个“问题-上下文-答案”的例子引导LLM遵循 desired 的格式和推理逻辑。思维链对于复杂问题在提示中要求LLM“逐步思考”先复述问题、提取关键信息再结合上下文推导答案。引用与溯源如上例所示要求LLM注明答案依据的原文块这对于企业级应用的可信度至关重要。2.4 评估与迭代如何知道你的RAG系统好不好构建RAG系统是一个迭代过程。你需要一套评估体系来衡量其表现并指导优化方向。指南通常会介绍以下几个层面的评估检索质量评估命中率对于一组有标准答案的问题检索到的Top-K个文档中至少包含正确答案片段的比例是多少平均排序倒数正确答案片段在检索结果列表中的平均排名的倒数。这个值越高说明正确答案排得越靠前。生成质量评估忠实度模型生成的答案在多大程度上严格依赖于提供的上下文是否引入了上下文之外的“幻觉”这可以通过让另一个LLM判断“答案中的陈述是否都能从上下文中找到支持”来评估。答案相关性生成的答案是否直接、完整地解决了用户的问题人工评估最终极的评估。设计测试集让真人从准确性、有用性、流畅性等维度打分。端到端评估使用像RAGAS、TruLens这样的框架自动化评估检索和生成的整体效果。监控生产环境中的用户反馈、点赞/点踩率。只有通过持续的评估你才能发现是检索环节出了问题需要优化分块或检索策略还是生成环节出了问题需要优化提示从而进行有针对性的迭代。3. 关键技术选型与实战要点指南的价值不仅在于讲清原理更在于提供了具体的技术选型建议和实战中容易踩坑的细节。这里我结合自己的经验对一些关键选择做进一步解读。3.1 嵌入模型开源还是闭源通用还是微调闭源API如OpenAI text-embedding-3-small/large优点是效果稳定、省心通常在同类型评测中名列前茅。缺点是持续产生API费用有数据隐私和网络延迟的考量且无法针对特定领域优化。开源模型如BGE、Sentence-BERT优点是免费、可私有化部署、数据不出域。现在顶尖的开源嵌入模型如BGE-M3效果已经非常接近甚至超越闭源模型。你还可以在自己的领域数据上对它们进行微调让模型更懂你的行业黑话。注意事项选择开源模型时务必关注其支持的上下文长度。有些模型训练时只用了512个token对长文档分块嵌入可能不是最优。现在text-embedding-3-large和BGE-M3等都支持长达8192甚至更长的上下文。我的建议对于绝大多数企业级应用从像BGE-M3这样的优秀开源模型开始是更稳妥的选择。它提供了中英双语的高质量嵌入且支持多向量检索等高级特性。先搭建起流程如果后期评估发现效果瓶颈再考虑微调或测试其他模型。3.2 向量数据库轻量级还是重型武器这个选择很大程度上取决于数据规模和并发需求。数据库核心特点适用场景Chroma轻量、易用、Python原生内存/磁盘存储原型开发、小型项目、学习入门Qdrant高性能、Rust编写、丰富的过滤和有效负载功能、支持标量量化中大型生产环境需要复杂过滤和高效检索Weaviate功能全面、内置模块化如推理、生成、云服务成熟希望一站式解决方案减少组件拼接愿意使用托管服务Milvus老牌高性能向量数据库集群能力强大生态丰富超大规模向量检索场景亿级以上需要极强的可扩展性Pinecone全托管服务完全无需运维API简单追求快速上线、无运维团队、预算充足的项目实操心得项目早期用Chroma快速验证想法是最高效的。一旦数据量超过十万级并发请求增多就需要考虑迁移到Qdrant或Weaviate。它们的过滤功能如按日期、标签过滤检索结果在实际应用中极为重要。Milvus的学习和运维成本相对较高除非数据量确实巨大否则不必首选。3.3 LLM的抉择成本、性能与可控性的平衡这是RAG链条中最昂贵的一环。选择的核心矛盾在于强大但昂贵的闭源模型 vs. 可控但需要调优的开源模型。闭源模型GPT-4, Claude, DeepSeek等生成质量高、逻辑和指令跟随能力强几乎开箱即用。但成本是持续性的且对于敏感数据即使承诺不用于训练也存在隐私顾虑。开源模型Llama 3, Qwen, Yi等本地部署数据绝对安全一次性的硬件投入。但需要自己处理部署、推理优化且同等参数规模下生成质量可能略逊于顶级闭源模型。不过70B参数级别的开源模型如Llama 3 70B在正确提示下已经能胜任很多复杂任务。一个重要趋势是使用“小模型”由于RAG已经提供了精准的上下文LLM的任务从“记忆和创造”变成了“理解和组织”。因此一个7B或13B参数的精调模型如果提示工程得当完全可以在保证答案忠实度的前提下大幅降低成本。例如使用Llama 3 8B或Qwen 1.5 7B作为生成器是当前性价比很高的方案。4. 高级模式与优化技巧当基础RAG流程跑通后你会遇到更复杂的需求和瓶颈。指南通常会指向这些高级主题它们决定了你的系统能否从“能用”变得“好用”。4.1 解决“大海捞针”问题检索精度提升这是RAG最常见的挑战当知识库很大时即使相关文档存在也可能被淹没在海量信息中检索不出来。优化策略元数据过滤在检索前或检索后利用元数据进行过滤。例如用户问“2023年的财报”你可以先过滤出“年份2023且文档类型财报”的文档再进行向量搜索极大缩小搜索范围。多索引检索为不同类型的文档建立不同的向量索引。例如将“用户手册”、“API文档”、“错误代码”分别建索引根据问题类型选择对应的索引进行查询。查询转换与扩展HyDE让LLM根据用户问题先生成一个假设性的答案然后用这个答案的向量去检索。因为答案的表述更接近知识库中的文本风格有时能提高召回率。查询重写让LLM将口语化的问题重写成更正式、更利于检索的关键词组合。子问题分解对于复杂问题让LLM将其拆解成多个子问题分别检索后再综合答案。4.2 超越简单拼接上下文管理与压缩检索到的多个文本块直接拼接可能超出LLM的上下文窗口限制或者包含大量冗余信息。滑动窗口对于长文档除了固定分块可以在检索时采用滑动窗口确保上下文连贯。Map-Reduce对于需要从多个分散文档中汇总信息的问题可以先让LLM对每个相关文档分别生成摘要Map再基于这些摘要生成最终答案Reduce。上下文压缩在将上下文喂给LLM前先使用一个较小的模型或规则剔除掉与问题明显无关的句子只保留核心信息。LangChain的ContextualCompressionRetriever就实现了这个思想。4.3 让系统具备“记忆”与“思考”Agentic RAG这是RAG的进化形态。系统不再是被动地“检索-生成”而是可以主动采取多步行动。自我反思与修正LLM生成初步答案后让其自我审查“我的答案是否完全基于上下文有没有遗漏或矛盾” 如果发现问题可以触发新一轮的检索或修正。多轮对话与记忆在聊天场景中需要维护对话历史。可以将历史对话也向量化并存入一个临时知识库在后续检索时同时搜索固定知识库和对话历史使系统具备“记忆”能力。工具调用当检索到的知识不足以回答问题时例如需要计算、查询实时天气、股票RAG系统可以调用外部工具或API将工具返回的结果作为新的上下文再生成最终答案。这模糊了RAG和AI Agent的边界构建出能力更全面的系统。5. 从零搭建一个企业知识库问答系统实战演练让我们抛开理论直接看一个简化的实战案例如何为一个技术团队搭建一个基于内部文档的问答机器人。5.1 环境准备与数据加载假设我们的文档是存放在./company_docs/目录下的一系列Markdown和PDF文件。# 创建环境并安装核心库 pip install langchain langchain-community langchain-chroma pypdf markdownify sentence-transformers# 1. 加载文档 from langchain_community.document_loaders import DirectoryLoader, PyPDFLoader, UnstructuredMarkdownLoader from langchain.text_splitter import RecursiveCharacterTextSplitter # 配置加载器 loaders { .md: UnstructuredMarkdownLoader, .pdf: PyPDFLoader, } loader DirectoryLoader(./company_docs/, glob**/*.*, loader_clsloaders, show_progressTrue) raw_documents loader.load() print(f共加载 {len(raw_documents)} 个文档) # 2. 文本分块 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, # 每个块约1000字符 chunk_overlap200, # 块间重叠200字符防止信息割裂 separators[\n\n, \n, 。, , , ] # 中文友好的分隔符 ) documents text_splitter.split_documents(raw_documents) print(f分割为 {len(documents)} 个文本块)5.2 向量化与存储这里我们选择开源的BGE-M3嵌入模型和轻量级的Chroma数据库。from langchain_huggingface import HuggingFaceEmbeddings from langchain_chroma import Chroma # 3. 初始化嵌入模型 # 使用 BAAI/bge-m3 模型这是一个效果极佳的中英双语开源模型 embed_model HuggingFaceEmbeddings( model_nameBAAI/bge-m3, model_kwargs{device: cpu}, # 根据环境改为 cuda encode_kwargs{normalize_embeddings: True} # 归一化向量方便余弦相似度计算 ) # 4. 创建向量数据库并持久化 vectorstore Chroma.from_documents( documentsdocuments, embeddingembed_model, persist_directory./chroma_db # 指定持久化目录 ) vectorstore.persist() # 保存到磁盘 print(向量数据库已创建并保存至 ./chroma_db)5.3 构建检索链与生成链现在我们将检索器和LLM组装起来。这里为了演示我们使用一个开源的轻量级LLM通过Ollama本地运行生产环境可以换成任何兼容OpenAI API的模型。from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate from langchain_community.llms import Ollama # 假设使用本地Ollama服务 # 5. 从磁盘加载已有的向量库 persisted_vectorstore Chroma( persist_directory./chroma_db, embedding_functionembed_model ) # 6. 创建检索器可以设置返回的文本块数量 retriever persisted_vectorstore.as_retriever(search_kwargs{k: 4}) # 7. 设计提示模板 template 你是一个技术文档助手。请严格根据以下提供的上下文信息来回答问题。如果上下文中的信息不足以回答问题请直接说“根据提供的文档我无法回答这个问题”不要编造信息。 上下文 {context} 问题{question} 请基于以上上下文给出准确、简洁、专业的回答。如果上下文中有相关步骤或代码请直接引用。 PROMPT PromptTemplate( templatetemplate, input_variables[context, question] ) # 8. 初始化LLM (这里以本地Ollama运行的Llama 3 8B为例) llm Ollama(modelllama3:8b, temperature0) # temperature0 使输出更确定 # 9. 创建检索问答链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # 最简单的方式将所有上下文塞进提示 retrieverretriever, chain_type_kwargs{prompt: PROMPT}, return_source_documentsTrue # 返回源文档便于溯源 ) # 10. 进行问答 query “我们项目的后端API鉴权机制是什么” result qa_chain.invoke({query: query}) print(问题, query) print(答案, result[result]) print(\n--- 参考来源 ---) for i, doc in enumerate(result[source_documents]): print(f[{i1}] {doc.metadata.get(source, N/A)} (页码/段落: {doc.metadata.get(page, N/A)})) # print(doc.page_content[:200]) # 可以预览一下内容5.4 效果评估与简单迭代搭建完成后你需要用一批典型问题QA对来测试系统。记录下答案的准确性和有用性。如果发现答案不相关可能是检索出了问题。尝试调整chunk_size比如调到500或1500或者改用RecursiveCharacterTextSplitter不同的分隔符。答案有幻觉可能是提示词不够强硬或者LLM本身的问题。强化提示词中的指令如“必须严格基于上下文”、“禁止编造”。也可以考虑换一个指令跟随能力更强的模型。检索不到尝试混合检索结合关键词。或者对于特定术语在数据预处理阶段建立一个同义词词典在查询时进行扩展。这个流程虽然简化但涵盖了RAG最核心的步骤。通过这个实战框架你可以快速验证想法并在此基础上逐步引入前面提到的高级优化技巧。6. 避坑指南与常见问题排查在我自己搭建和帮助企业部署RAG系统的过程中积累了一些“血泪教训”。这里分享几个最常见的问题和解决方案。6.1 检索效果不佳信息明明在库里就是找不到这是最高频的问题。问题表现问一个确定存在于文档中的问题系统返回“无法回答”或错误答案。查看检索到的源文档发现相关文档不在Top-K结果中。排查与解决检查分块大小这是首要怀疑对象。块太大会包含太多噪声稀释了核心信息的向量表示块太小可能丢失完整的语义单元。建议针对你的文档类型技术文档、会议记录、客服对话用不同尺寸200, 500, 1000, 1500字符做对比实验。观察哪种尺寸下对典型问题的检索召回率最高。检查嵌入模型通用嵌入模型可能不擅长你的专业领域术语。建议使用像MTEB这样的基准排行榜选择在“检索”任务上表现好的模型。对于中文或垂直领域优先考虑BGE、M3E等中文优化模型。如果资源允许用你的领域数据对开源模型进行微调效果提升会非常明显。引入混合检索纯向量搜索对某些关键词精确匹配的问题不友好。务必集成一个像BM25这样的稀疏检索器。LangChain的EnsembleRetriever可以轻松实现加权混合。优化查询用户的原始查询可能很模糊。在检索前增加一个“查询理解”层用一个小模型甚至规则对查询进行重写、扩展或分解。例如将“咋装”重写为“如何安装与配置”。6.2 生成答案出现“幻觉”捏造事实或引用错误来源问题表现答案听起来合理但仔细核对发现部分信息是编造的或者引用的来源与内容对不上。排查与解决强化提示词约束在系统指令中反复、明确地强调“严格基于上下文”、“禁止使用外部知识”、“不确定就说不知道”。可以使用“少样本提示”给出一两个严格遵守规则的例子。检查上下文质量如果检索到的上下文本身质量差不相关、碎片化LLM更容易“放飞自我”。确保检索到的前几条结果都是高度相关的。启用引用溯源像之前示例那样强制LLM在答案中注明引用的源文档编号。这不仅方便用户核实也能在评估时快速定位是检索错了还是LLM编造了。降低LLM的“创造力”将生成时的temperature参数设为0或接近0使输出更确定、更可预测。对于事实性问答这通常是必要的。使用更“听话”的模型有些模型在指令跟随和减少幻觉方面做得更好。可以尝试GPT-4、Claude或精调过的开源模型如Qwen的特定版本。6.3 系统响应速度慢从提问到答案等待时间过长问题表现用户查询后需要等待数秒甚至更久才能得到回复体验差。排查与解决向量检索优化索引类型确保向量数据库使用了高效的索引如HNSW。Chroma默认使用Qdrant等也需要正确配置。量化使用标量量化等技术在几乎不损失精度的情况下将向量从float32转换为int8大幅减少内存占用和计算时间。过滤先行先利用元数据时间、类别过滤掉大部分不相关文档再在小子集上做向量搜索。LLM推理优化模型尺寸在RAG中7B-13B的模型往往足够。用Llama 3 8B代替70B速度会有数量级提升。推理后端使用vLLM、TGI等高性能推理框架支持连续批处理和PagedAttention能极大提高吞吐量。缓存对常见、重复的问题答案进行缓存。异步与流式将检索相对快和生成相对慢设计成异步流程。生成部分可以采用流式输出让用户先看到部分结果提升感知速度。6.4 知识更新与一致性维护问题表现文档更新后系统仍然回答旧信息。解决方案增量更新设计一个管道监控源文档变化如Git Hook、文件系统事件。对新增或修改的文档进行分块、嵌入并upsert更新或插入到向量数据库。对于删除的文档需要将其对应的所有块从数据库中删除。Chroma和Qdrant都支持upsert操作。版本化与快照对于需要严格版本控制的场景可以为不同版本的知识库建立不同的向量集合。回答时根据问题关联的版本号选择对应的集合进行检索。定期全量重建对于小规模知识库最简单的办法是定期如每晚全量重建向量库。虽然粗暴但能保证绝对一致性。构建一个成熟的RAG系统是一个持续迭代和优化的过程。从最简单的流水线开始快速验证核心价值然后根据评估结果和用户反馈有针对性地加固其中最薄弱的环节。这份指南提供的正是这样一张从入门到精通的导航图而真正的工程艺术则体现在你对每一个细节的权衡、测试与打磨之中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2571745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…