MindSearch:基于思维链的迭代式RAG系统,让大模型拥有深度推理能力

news2026/4/29 5:19:09
1. 项目概述当大模型遇上“记忆宫殿”最近在折腾一个挺有意思的项目叫“MindSearch”。这个名字听起来有点玄乎但它的核心思路其实非常直接给大语言模型LLM装上一个“外置大脑”或者说一个高效的“记忆检索系统”。我们平时用ChatGPT这类模型最大的痛点是什么是它无法记住我们之前聊过的内容吗不完全是。更本质的痛点是它无法“主动”去查阅和调用我们自己的、私有的、海量的知识库。比如你公司内部有几十万份技术文档、会议纪要、产品手册你想让模型基于这些资料来回答你的问题而不是让它凭空编造。传统的做法是“检索增强生成”也就是RAG。但RAG通常是把用户问题拿去向量数据库里搜一圈找到最相关的几段文本然后一股脑塞给模型去生成答案。这个过程是“一次性”的模型对检索到的内容没有“记忆”每次问答都是孤立的。MindSearch想做的就是把这个“一次性”的检索变成一个“持续性”的、可被模型“内化”的思维过程。它借鉴了人类思考时的一种高级策略——“思维链”。简单来说不是让模型直接回答而是引导它先“思考”“要回答这个问题我需要哪些信息我应该去哪里找这些信息我找到的信息之间有什么关联” 然后模型会模拟这个“搜索-思考-再搜索-整合”的循环最终给出一个建立在扎实“证据链”基础上的答案。这就像一位经验丰富的研究员面对一个复杂问题时不会立刻给出结论而是会去查阅档案、比对资料、梳理逻辑最后形成一份严谨的报告。MindSearch就是在用代码模拟这个过程让大模型具备这种“研究型”的思维能力。所以这个项目非常适合那些手头有大量非结构化文本数据如文档、日志、客服记录、论文并且希望大模型能深度理解、推理和整合这些信息来解决问题的团队和个人。它不是简单的关键词匹配而是追求答案的可追溯性和逻辑性。2. 核心架构与设计哲学MindSearch的架构设计清晰地反映了其“模拟人类研究过程”的核心思想。它不是一个单一的模型而是一个精心编排的“智能体”工作流。我们可以把它拆解成几个关键角色它们各司其职协同完成一次高质量的问答。2.1 角色分工搜索者、思考者与整合者整个系统可以看作由三个核心“智能体”构成搜索智能体它的任务是根据当前对问题的理解生成最有可能找到答案的搜索查询。这不仅仅是把用户问题原样扔给搜索引擎。比如用户问“如何优化深度学习模型的训练速度”搜索智能体可能会拆解出“混合精度训练原理”、“分布式训练框架对比”、“GPU内存优化技巧”等多个侧面的查询词并发起多路搜索。它负责“开疆拓土”尽可能多地召回相关材料。推理智能体这是系统的“大脑”。它负责审视搜索智能体带回来的原始材料可能是一堆网页摘要、文档片段并进行深度思考“这些材料中哪些信息是相关的哪些是矛盾的我还缺少哪些关键信息来回答原问题基于现有信息我能做出什么初步推断” 它会生成“思考笔记”这份笔记可能包括对信息的总结、对可信度的评估、以及提出的新问题。这个过程模拟了研究员阅读文献时在脑海中的信息加工。整合智能体在经历了多轮“搜索-推理”循环后系统积累了丰富的上下文和思考痕迹。整合智能体的任务就是充当“报告撰写人”。它需要综合所有的原始材料、中间思考过程生成一个最终答案。这个答案不是片段的堆砌而应该是结构清晰、论证有力、并且能明确引用“证据来源”的完整回应。例如在答案中可能会注明“根据[文档A]第X节所述...”这极大地提升了答案的可信度和可验证性。2.2 工作流迭代式的研究循环这些智能体并非线性工作而是处在一个动态的、迭代的循环中初始化用户提出问题。系统初始化一个空的“工作记忆区”。第一轮搜索与推理搜索智能体根据初始问题生成查询获取第一批资料。推理智能体阅读这批资料生成第一版思考笔记指出已明确的信息和仍存在的知识缺口。迭代优化系统会判断当前的信息是否足以形成高质量答案。如果不够推理智能体笔记中提出的“新问题”或“知识缺口”会成为下一轮搜索的输入。搜索智能体据此发起更精准的查询。这个过程可能重复多次直到推理智能体认为信息已充分或达到预设的迭代轮次上限。最终整合整合智能体登场利用整个循环中积累的全部上下文原始资料所有轮次的思考笔记撰写最终答案。这个设计哲学的优势在于它将“信息检索”从数据层的匹配提升到了认知层的规划与推理。系统不仅找到了资料还“理解”了资料之间的关系并“知道”自己是如何一步步找到答案的。这比传统RAG的“检索-拼接”模式在应对复杂、多步骤问题时有着天然的优势。注意这种多轮迭代的设计虽然强大但也带来了更高的计算成本和响应延迟。每一轮都需要调用大模型进行思考因此在实际部署时需要在答案质量和响应速度之间做出权衡例如通过设置最大迭代轮次来控制。3. 关键技术点深度剖析要实现上述架构MindSearch依赖几个关键的技术组件。理解这些组件有助于我们更好地使用它甚至在其基础上进行定制开发。3.1 思维链与指令工程这是MindSearch的灵魂。如何让大模型扮演好“推理智能体”的角色这完全依赖于精心设计的提示词。一个基础的推理提示词可能包含以下要素角色设定“你是一个严谨的研究助理擅长分析文本并梳理逻辑。”任务描述“你的目标是分析以下搜索结果的片段思考它们如何帮助我们回答原始问题‘[原始问题]’。”上下文提供提供原始问题、当前轮次搜索到的文本片段。输出格式要求明确要求模型以结构化格式输出思考结果例如总结 - 片段1提到了... - 片段2指出... 矛盾与确认 - 片段A说X而片段B说Y需要进一步核实。 遗留问题 - 我们仍然不清楚... 下一步搜索建议 - 建议搜索关于“...”的更具体信息。思维约束明确告诉模型“逐步思考”不要急于下结论。通过这种强引导我们迫使模型展现出其推理能力将隐含的思维过程“外化”为文本。这本质上是一种高级的指令工程其质量直接决定了整个系统的思考深度。3.2 检索系统的构建与优化搜索智能体的背后需要一个强大的检索系统作为支撑。MindSearch通常可以与多种检索后端集成向量检索这是当前的主流。将文档库中的所有文本块通过嵌入模型转换为向量存入向量数据库。当搜索智能体生成查询时同样将查询转换为向量在数据库中进行相似度搜索返回最相似的文本块。它的优势在于能进行语义搜索即使查询词和文档用词不同但意思相近也能被找到。关键参数嵌入模型的选择、文本分块的大小和重叠度、相似度阈值。例如分块太小会失去上下文太大则可能包含无关信息。通常256-512个词的分块大小是一个不错的起点重叠50-100个词以保证上下文连贯。关键词检索传统的BM25等算法。它更擅长精确匹配关键词。在一些需要查找特定术语、代码、型号的场景下关键词检索可能更有效。MindSearch可以设计为混合检索同时使用向量和关键词检索然后对结果进行重排序兼顾语义和精确度。检索优化策略查询重写在将推理智能体生成的“下一步搜索建议”发给检索系统前可以先用一个小模型对其进行优化使其更符合检索系统的“口味”。多路召回与融合针对一个查询同时使用不同策略如不同嵌入模型、不同分块方式进行检索然后融合结果提高召回率。元数据过滤如果文档库带有元数据如日期、作者、文档类型检索时可以加入过滤条件使搜索更精准。3.3 上下文管理与迭代控制随着迭代轮次增加系统积累的“上下文”会越来越庞大包括原始问题、每一轮搜索到的片段、每一轮的思考笔记。如何有效地管理这些上下文防止超出模型的最大上下文窗口是一个核心挑战。工作记忆与长期记忆一种策略是区分“工作记忆”和“长期记忆”。当前轮次直接相关的搜索片段和思考笔记放在工作记忆中供模型细读。之前轮次的摘要或高度浓缩的结论则作为长期记忆在需要时被唤醒。这模拟了人类的记忆方式。摘要与压缩在每一轮迭代结束后系统可以自动生成一个“本轮摘要”用极短的篇幅概括本轮的核心发现和结论。在后续轮次中只传递这些摘要而非全部原始文本从而节省上下文空间。迭代终止条件系统需要明确的停止规则。常见的条件包括轮次上限达到预设的最大轮次如3-5轮。置信度达标推理智能体在思考笔记中输出一个“置信度分数”当分数超过阈值时停止。问题已解决整合智能体评估当前信息已能生成满意答案。信息冗余连续两轮搜索到的新信息与已有信息高度重复。这些控制逻辑需要被编码到系统的工作流中确保循环是收敛的、高效的而不是无限发散。4. 从零开始的实战部署指南理论讲了不少现在我们来动手把一个基础的MindSearch系统跑起来。这里我们假设一个场景你有一个包含数百篇技术博客的文件夹你想搭建一个能深度回答这些博客相关问题的智能助手。4.1 环境准备与依赖安装首先确保你的环境有Python。然后我们安装核心依赖。MindSearch本身可能是一个研究原型或框架我们可以用类似的思路基于LangChain、LlamaIndex这类智能体框架来构建。# 创建虚拟环境推荐 python -m venv mindsearch_env source mindsearch_env/bin/activate # Linux/Mac # mindsearch_env\Scripts\activate # Windows # 安装基础框架和模型接口 pip install langchain langchain-community langchain-openai # 安装向量数据库这里以Chroma为例它轻量易用 pip install chromadb # 安装文本嵌入模型这里使用开源的sentence-transformers pip install sentence-transformers # 安装用于网页/文档加载的组件 pip install pypdf python-dotenv # 用于加载PDF和环境变量提示如果你使用OpenAI的模型还需要安装openai库并设置API密钥。为了成本可控和隐私性本例优先使用本地嵌入模型。4.2 知识库构建文档加载与向量化这是最耗时但至关重要的一步。我们需要把非结构化的文档变成结构化的、可供检索的知识。import os from langchain_community.document_loaders import DirectoryLoader, TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import Chroma # 1. 加载文档 documents_path ./my_tech_blogs # 你的博客文件夹路径 loader DirectoryLoader(documents_path, glob**/*.txt, loader_clsTextLoader) # 假设是txt文件 documents loader.load() print(f成功加载 {len(documents)} 篇文档) # 2. 分割文本 text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每个块约500字符 chunk_overlap100, # 块之间重叠100字符保持上下文 separators[\n\n, \n, 。, , , , , , ] # 中文优先的分隔符 ) texts text_splitter.split_documents(documents) print(f分割为 {len(texts)} 个文本块) # 3. 创建嵌入模型和向量库 # 使用开源模型无需API Key embedding_model HuggingFaceEmbeddings(model_nameBAAI/bge-small-zh-v1.5) # 推荐的中文小模型 # 指定向量库的持久化路径 persist_directory ./chroma_db # 创建并持久化向量库 vectordb Chroma.from_documents( documentstexts, embeddingembedding_model, persist_directorypersist_directory ) vectordb.persist() # 保存到磁盘 print(知识库向量化完成并已保存。)关键细节分块策略chunk_size和chunk_overlap需要根据你的文档类型调整。技术文档可能适合大块而对话记录可能需要小块。重叠是为了避免在分块边界丢失重要信息。嵌入模型选择BAAI/bge-small-zh-v1.5是一个优秀的中文开源嵌入模型在中文语义相似度任务上表现很好。如果你的文档是英文可以考虑all-MiniLM-L6-v2。持久化persist_directory使得向量库只需创建一次后续可以直接加载无需重复计算嵌入节省大量时间。4.3 智能体工作流编排接下来我们用LangChain的表达式语言来编排搜索、推理、整合的流程。这里我们简化流程模拟两轮迭代。from langchain_openai import ChatOpenAI from langchain.schema import StrOutputParser from langchain.prompts import ChatPromptTemplate from langchain.schema.runnable import RunnablePassthrough from dotenv import load_dotenv import os load_dotenv() # 加载.env文件中的OPENAI_API_KEY # 初始化大语言模型推理和整合的核心 llm ChatOpenAI(modelgpt-4o-mini, temperature0.1) # 使用一个较小但性价比较高的模型温度调低使输出更稳定 # 定义检索器搜索智能体 retriever vectordb.as_retriever(search_kwargs{k: 4}) # 每次检索返回4个最相关的片段 # 第一轮初始检索与思考 initial_retrieve_prompt ChatPromptTemplate.from_template( 你是一个分析能力极强的研究助手。请基于以下背景资料思考如何回答用户的问题。 用户问题{question} 相关背景资料 {context} 请逐步思考并输出你的分析 1. **信息总结**这些资料中有哪些关键信息与问题直接相关 2. **信息缺口**要完整回答用户问题我们还缺少哪些关键信息 3. **下一步行动**为了弥补信息缺口我们应该提出什么更具体、更明确的搜索问题 请将“下一步行动”明确标出。 ) initial_chain ( {context: retriever, question: RunnablePassthrough()} | initial_retrieve_prompt | llm | StrOutputParser() ) # 第二轮基于第一轮思考的深入检索与再思考 def follow_up_retrieve(input_dict): # input_dict 包含原始问题 question 和第一轮的输出 initial_thought first_thought input_dict[initial_thought] # 这里需要一个简单的解析器从第一轮输出中提取“下一步行动”的建议搜索词 # 为了简化我们假设第一轮输出的最后一行就是搜索建议 lines first_thought.strip().split(\n) search_query_suggestion lines[-1].replace(下一步行动, ).strip() if lines else input_dict[question] # 使用建议的搜索词进行二次检索 follow_up_docs retriever.invoke(search_query_suggestion) follow_up_context \n\n.join([doc.page_content for doc in follow_up_docs]) return { original_question: input_dict[question], first_round_context: input_dict[context], # 这里需要从上游传递稍复杂本例简化处理 first_round_thought: first_thought, follow_up_context: follow_up_context, refined_query: search_query_suggestion } follow_up_think_prompt ChatPromptTemplate.from_template( 你正在深入研究一个问题。以下是全部信息 原始问题{original_question} 【第一轮资料与思考】 资料 {first_round_context} 你的初步分析 {first_round_thought} 【基于你建议的深入搜索】 你建议搜索“{refined_query}” 我们找到了这些新资料 {follow_up_context} 请综合所有信息原始资料、你的初步分析、新资料完成以下任务 1. **信息整合**新旧信息之间有何关联是否解决了之前的信息缺口 2. **最终答案纲要**现在请列出回答原始问题的最终答案的核心要点和逻辑结构。 ) # 整合智能体生成最终答案 final_answer_prompt ChatPromptTemplate.from_template( 你是一位专业的技术文档撰写人。请根据以下全部研究过程撰写一份针对用户问题的最终、完整、结构清晰的答案。 用户问题{original_question} 研究过程全记录 {research_history} 请生成最终答案。要求 - 语言正式、清晰、准确。 - 如果引用到了资料中的信息请在答案中自然体现。 - 答案应包含必要的背景解释、核心步骤或观点、以及总结。 ) # 组合成完整的工作流简化版 def mind_search_workflow(question): print(f用户问题: {question}\n) # 第一轮检索与思考 print( 第一轮初步检索与思考 ) first_round_docs retriever.invoke(question) first_round_context \n\n.join([doc.page_content for doc in first_round_docs]) first_thought initial_chain.invoke({context: first_round_context, question: question}) print(f初步分析:\n{first_thought}\n) # 提取搜索建议简易方法 lines first_thought.strip().split(\n) next_search lines[-1] if lines else question if in next_search: next_search next_search.split()[-1].strip() print(f推导出的下一步搜索建议: {next_search}\n) # 第二轮深入检索与思考 print( 第二轮深入检索与整合 ) second_round_docs retriever.invoke(next_search) second_round_context \n\n.join([doc.page_content for doc in second_round_docs]) # 模拟第二轮思考链的输入 second_thought_input { original_question: question, first_round_context: first_round_context, first_round_thought: first_thought, follow_up_context: second_round_context, refined_query: next_search } second_thought follow_up_think_prompt | llm | StrOutputParser() second_thought_result second_thought.invoke(second_thought_input) print(f深度整合分析:\n{second_thought_result}\n) # 最终整合 print( 生成最终答案 ) research_history f 原始问题{question} 第一轮检索资料 {first_round_context} 第一轮思考 {first_thought} 第二轮检索基于“{next_search}”资料 {second_round_context} 第二轮思考 {second_thought_result} final_answer final_answer_prompt | llm | StrOutputParser() answer final_answer.invoke({original_question: question, research_history: research_history}) return answer # 运行示例 if __name__ __main__: user_question 在微调大语言模型时如何有效防止过拟合 final_output mind_search_workflow(user_question) print(\n *50) print(【最终答案】) print(*50) print(final_output)这个示例虽然简化但清晰地展示了MindSearch的核心循环检索 - 思考并规划下一步 - 再检索 - 整合。在实际项目中这个循环可以更复杂包含更多轮次和更精细的上下文管理。5. 性能调优与效果评估实战部署好系统只是第一步让它真正好用、可靠还需要持续的调优和评估。5.1 核心参数调优指南系统的表现对以下参数非常敏感参数类别具体参数影响与调优建议典型值/范围检索相关文本分块大小影响检索精度和上下文完整性。技术文档可稍大对话记录宜小。256-1024字符文本分块重叠防止跨块信息割裂。越大上下文保留越好但冗余也越多。50-150字符每次检索返回数量给推理智能体提供的“原材料”数量。太少可能遗漏太多增加噪音和成本。3-8相似度分数阈值低于此阈值的检索结果不返回提高相关性。需根据嵌入模型和数据集调整。0.7-0.85模型相关LLM温度控制创造性。推理和整合阶段宜低保证稳定和事实性。0.1-0.3LLM最大输出token限制思考笔记和答案长度控制成本。思考笔记可稍短最终答案可放宽。512-2048流程相关最大迭代轮次控制循环深度防止无限循环和成本过高。2-5轮迭代停止条件除了轮次可加入基于思考笔记中“置信度”或“信息增量”的自动判断。自定义逻辑调优是一个实验过程建议准备一个包含不同难度问题的测试集固定其他参数每次只调整一个参数观察最终答案质量的变化。答案质量可以从相关性、完整性、事实准确性、逻辑性等多个维度人工评分。5.2 效果评估不只是看答案对错评估一个MindSearch系统不能只看最终答案是否“正确”更要看其过程的质量。我通常从四个维度评估检索相关性每一轮搜索返回的文档片段是否真的与当前要解决的问题高度相关可以抽样计算平均相似度分数或人工评判。思考链的合理性推理智能体生成的“思考笔记”是否逻辑清晰是否准确指出了信息缺口提出的下一步搜索建议是否有效这需要人工仔细阅读中间输出。答案的溯源能力最终答案中的关键论断是否能追溯到检索到的原始文档片段这是衡量其是否“胡编乱造”的重要指标。可以在系统中强制要求整合智能体在答案中引用片段ID。最终答案质量综合评估答案的准确性、完整性、条理性和可读性。一个实用的评估方法是**“过程回溯”**对于一个给定的问题和系统生成的答案让评估者同时查看系统产生的所有中间步骤检索结果、思考笔记。如果评估者能顺着这个思路同样推导出答案甚至觉得这个思考过程对自己也有启发那这个系统的价值就非常高了。5.3 成本与延迟的权衡MindSearch的迭代特性意味着多次调用LLM和检索其成本和响应时间远高于简单的一次性问答。成本控制模型选型在非核心的思考环节可以使用更小、更便宜的模型如GPT-3.5-turbo。只在最终整合环节使用能力更强、更贵的模型如GPT-4。上下文压缩严格执行上文提到的摘要和记忆管理策略减少每次调用时输入的token数量。缓存对常见的、重复的用户问题可以缓存最终的答案或中间的高质量思考结果。延迟优化并行检索如果一轮思考中提出了多个独立的搜索建议可以并行执行这些检索而不是串行。异步处理对于非实时性要求很高的场景可以将任务放入队列异步处理完成后通知用户。设置超时为整个工作流设置一个最大响应时间超时后即使未达到最大迭代轮次也强制退出返回当前最佳结果。我的经验是对于内部知识库问答、研究分析等对质量要求高、对实时性要求不苛刻秒级到分钟级的场景MindSearch带来的答案质量提升是值得付出额外成本的。但对于实时客服、聊天机器人等场景则需要极度精简流程可能只进行一轮高质量的检索增强生成。6. 避坑指南与进阶思考在实际开发和使用的过程中我踩过不少坑也总结出一些让系统更稳健、更聪明的技巧。6.1 常见问题与排查清单问题现象可能原因排查与解决思路答案看似合理但事实错误1. 检索到错误或过时资料。2. LLM在整合时“幻觉”编造了信息。1.源头治理定期更新和清洗知识库确保数据质量。2.加强溯源在提示词中严格要求模型“基于提供的资料回答”并输出引用。在最终答案后附上引用的原文片段供用户核对。3.交叉验证让整合智能体对关键事实进行自我质疑和复核。陷入搜索循环无法停止1. 停止条件设置不合理。2. 推理智能体提出的搜索建议总是在原地打转。1.设置硬性轮次限制如3轮。2.改进思考提示词要求模型在提出新搜索建议时必须与之前的搜索词有实质性区别。3.引入历史查询记忆记录已搜索过的查询如果新建议与历史查询高度相似则抑制或修改它。响应速度极慢1. 检索库过大或未优化。2. LLM调用串行且模型过大。3. 迭代轮次过多。1.优化向量数据库索引如使用HNSW索引。对知识库进行主题分类先粗筛再精查。2.流程并行化将可以并行的LLM调用如分析多个不相关的检索结果改为并行。3.实施缓存对相同或相似问题直接返回缓存结果。思考笔记质量低下1. 提示词设计不佳。2. 检索返回的上下文噪音太大。1.迭代优化提示词加入更具体的指令和输出格式示例。让模型扮演更具体的角色如“资深审计员”、“批判性思维专家”。2.提升检索精度调整分块策略优化检索查询的重写使用混合检索和重排序。6.2 让系统更“聪明”的进阶技巧引入工具调用真正的“搜索”不局限于向量数据库。可以让搜索智能体调用真实的网络搜索API、数据库查询、甚至企业内部系统API。LangChain的Agent框架非常适合做这件事。这样系统的信息源就从静态知识库扩展到了动态世界。实现自我反思与修正在最终整合前增加一个“审核”环节。让另一个LLM实例或同一模型的不同角色对整合智能体生成的答案草案进行审核检查其是否与所有检索到的资料一致逻辑是否自洽。如果发现问题则反馈给系统进行修正。个性化与记忆为不同用户维护简单的“用户画像”或对话历史记忆。在推理时可以考虑用户的历史偏好或已知背景使搜索和建议更具个性化。例如对新手用户答案可以更基础对专家用户则可以更深入。多模态扩展如果知识库中包含图片、图表可以结合多模态模型让系统不仅能理解文本还能分析图像中的信息实现真正的多模态知识问答。MindSearch代表了一种方向让大模型从“静态的知识应答机”向“动态的信息处理与推理引擎”演进。它的价值不在于替代传统的RAG而在于解决RAG不擅长的、需要多步推理和主动信息搜集的复杂问题。搭建和调优这样一个系统的过程本身也是对LLM能力边界和协作方式的一次深度探索。你会发现很多时候限制系统能力的不是模型本身而是我们设计和引导它进行思考的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2564621.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…