构建LLM维基百科智能体:从任务规划到知识检索的工程实践

news2026/5/15 3:12:27
1. 项目概述当LLM学会“查字典”一个自主探索的维基百科智能体最近在折腾大语言模型应用开发的朋友可能都绕不开一个核心问题如何让模型获取并利用那些它“不知道”的知识比如让它回答一个关于昨天刚发布的某款手机的具体参数或者查询某个小众历史事件的细节。模型本身的知识库是静态的而世界是动态的。SamurAIGPT/llm-wiki-agent这个项目就提供了一个非常精巧且实用的解题思路构建一个能够自主、精准地在维基百科Wikipedia中检索、理解并整合信息的智能体Agent。简单来说这个项目不是一个简单的“搜索引擎接口包装器”。它本质上是一个任务驱动的信息获取与推理系统。你给智能体一个查询任务比如“请比较一下Python和JavaScript在异步编程模型上的异同”它不会直接去背训练数据里的陈旧答案而是会像一位熟练的研究员一样自动规划搜索策略先查Python的异步再查JavaScript的最后找对比文章执行具体的维基百科页面检索从返回的HTML或文本中提取关键信息然后综合这些信息生成一个结构清晰、引用有据的回答。整个过程模型扮演的是“指挥官”和“分析师”的角色而维基百科则成为了它随时可以查阅的、海量且结构化的“外部知识字典”。这个项目的价值对于开发者、研究者乃至普通技术爱好者都很大。如果你正在构建需要事实核查、知识增强的聊天机器人、智能客服或研究助手它能直接提供一套可复现的架构。对于学习者通过剖析它的代码你能深刻理解LLM Agent的工作流包括任务分解Task Planning、工具调用Tool Usage和自我反思Self-Reflection等关键概念是如何落地的。它用相对简洁的代码演示了如何将强大的LLM如GPT-4、Claude或开源模型与世界上最庞大的知识库之一连接起来创造出“112”的智能效果。2. 核心架构与工作流拆解这个智能体并非魔法黑箱其高效运作依赖于一个清晰的分层架构和严谨的工作流程。理解这个架构是后续进行定制化开发或问题排查的基础。2.1 智能体的“大脑”、“手脚”与“记忆”我们可以把llm-wiki-agent的核心组件类比为一个研究团队智能体核心Agent Core - 大脑通常由一个LLM如通过OpenAI API调用的GPT-4或本地部署的Llama 3担任。它的核心职责是理解用户意图、规划任务步骤、决策何时调用工具以及合成最终答案。它不直接“知道”维基百科的内容但知道如何利用“手脚”去获取。工具集Tools - 手脚这是智能体与维基百科交互的桥梁。项目中最关键的工具就是WikipediaQueryRun或类似功能的工具。这个工具封装了向维基百科API发送请求、获取页面摘要或完整内容、并做初步清洗的逻辑。一个设计良好的工具会处理请求频率限制、结果格式化如提取关键段落、保留章节标题以及错误反馈。记忆与上下文Memory/Context - 工作笔记智能体需要记住之前的对话、已经检索过的信息以及自己做出的推理。这通常通过对话历史缓冲和向量存储来实现。例如将每次检索到的关键信息片段转换成向量存入向量数据库如Chroma、FAISS。当进行多轮对话或复杂查询时智能体可以先在向量库中搜索相关历史信息避免对相同内容重复查询维基百科提升效率并保持上下文连贯。2.2 从问题到答案的完整工作流一次典型的查询会经历以下闭环解析与规划用户输入“特斯拉Cybertruck的电池容量和续航里程是多少”。智能体核心LLM首先解析问题识别出关键实体“特斯拉Cybertruck”和属性“电池容量”、“续航里程”。接着它进行任务规划可能会生成一个内部指令序列[搜索“特斯拉Cybertruck”页面 定位“规格”或“电池”章节 提取相关数据 如未找到则尝试搜索“特斯拉电池技术”等关联页面]。执行与检索根据规划智能体调用WikipediaQueryRun工具以“特斯拉Cybertruck”为关键词进行搜索。工具返回页面内容可能是整页或摘要。这里有一个关键细节工具通常不会返回原始HTML而是经过解析的纯文本并可能附带章节信息。信息提取与评估LLM核心接收到工具返回的文本。它需要像人类一样快速浏览定位到含有“电池”和“续航”信息的段落。这个过程本身就是一个小的信息提取任务。LLM会判断返回的信息是否充足、是否相关。如果发现信息不全例如页面只提到了续航范围但没提电池容量它会进行“自我反思”决定是否需要调整搜索词再次查询如搜索“Cybertruck battery specifications”。合成与输出在收集到足够的信息片段后LLM核心将这些碎片化的信息进行整合、去重并以友好、结构化的方式如表格、列表或简洁段落生成最终答案并可能注明信息来源的维基百科页面标题以示严谨。注意这个流程中步骤1和3非常依赖LLM本身的推理和指令遵循能力。因此选择能力足够强的基座模型或对开源模型进行针对性微调是项目成功的关键前提。一个能力较弱的模型可能在任务规划阶段就迷失方向。2.3 技术栈选型背后的考量项目通常会基于一些成熟的Agent框架构建例如LangChain或LlamaIndex。选择它们而非从零开始有非常务实的理由LangChain提供了极其丰富的Agent、Tool、Memory抽象以及与大模型API、向量数据库集成的标准化接口。它的优势在于快速原型验证和生态丰富。如果你想让智能体除了查维基百科还能查天气、发邮件、操作数据库LangChain能让你像搭积木一样快速组合。llm-wiki-agent如果基于LangChain其核心可能就是定义一个CustomAgent配备WikipediaTool并使用ConversationBufferMemory。LlamaIndex更侧重于数据的索引、检索和上下文增强。如果你的场景更偏向于对维基百科的特定子集如计算机科学相关页面进行深度、高效的检索并需要复杂的检索后处理重排序、过滤LlamaIndex的QueryEngine和Retriever抽象可能更得心应手。它可以轻松实现“先检索出10个相关页面片段再用LLM精炼出最相关的3个”这样的流水线。在实际项目中两者的界限有时会模糊可以结合使用。例如用LlamaIndex管理维基百科内容的向量索引用LangChain来编排智能体的整体工作流。选型时关键看你的需求是更偏向于多工具协调的复杂动作LangChain还是对单一知识源进行深度、高效的问答LlamaIndex。3. 关键实现细节与实操要点理解了架构我们深入到代码层面看看几个最核心的环节是如何实现的以及其中有哪些“坑”需要提前避开。3.1 维基百科工具的高效封装与优化直接调用维基百科API如wikipedia库很简单但构建一个鲁棒的智能体工具需要考虑更多# 示例一个增强型的维基百科查询工具类概念代码 import wikipedia from langchain.tools import BaseTool from typing import Type, Optional from pydantic import BaseModel, Field class WikipediaQueryInput(BaseModel): query: str Field(description用于搜索维基百科的查询词) max_results: int Field(default3, description最大返回结果数) auto_suggest: bool Field(defaultTrue, description是否启用搜索建议) class EnhancedWikipediaTool(BaseTool): name wikipedia_search description 用于搜索维基百科获取关于人物、地点、事件、概念等的准确信息。输入应为明确的搜索词。 args_schema: Type[BaseModel] WikipediaQueryInput def _run(self, query: str, max_results: int 3, auto_suggest: bool True) - str: try: # 1. 设置语言和速率限制重要 wikipedia.set_lang(en) # 默认使用英文维基中文可设为zh # 2. 执行搜索 search_results wikipedia.search(query, resultsmax_results, suggestionauto_suggest) if not search_results: return f未找到与{query}直接相关的维基百科页面。 # 3. 获取并处理页面内容 summary_output [] for page_title in search_results: try: # 获取页面摘要比完整页面加载更快信息更浓缩 page_summary wikipedia.summary(page_title, sentences5) # 限制摘要句数 summary_output.append(f**{page_title}**: {page_summary}) except wikipedia.exceptions.DisambiguationError as e: # 处理消歧义页面例如搜索“Python”可能指向编程语言或蛇 summary_output.append(f**{page_title}** 是一个消歧义页。可能选项{, .join(e.options[:5])}...) except wikipedia.exceptions.PageError: summary_output.append(f页面 {page_title} 不存在或无法访问。) except Exception as e: summary_output.append(f获取页面 {page_title} 时出错{str(e)}) return \n\n.join(summary_output) if summary_output else 搜索无有效结果。 except Exception as e: return f执行维基百科搜索时发生错误{str(e)} async def _arun(self, query: str) - str: 异步版本如果框架支持 # 实现略通常调用异步HTTP客户端 pass实操要点与避坑指南结果数量控制max_results不要一次性返回太多页面内容。这会导致两个问题一是API响应慢二是给LLM的上下文窗口造成巨大压力增加成本并可能降低处理质量。通常2-3个最相关结果足矣。内容摘要优先优先使用wikipedia.summary()而非wikipedia.page().content。摘要信息密度高且能避免返回大量无关文本如参考资料列表、导航模板。通过sentences参数控制长度。异常处理至关重要维基百科API常见的异常有DisambiguationError搜索词对应多个主题。工具应捕获此异常并将消歧义选项反馈给智能体由LLM决定下一步例如让用户澄清或智能体自行选择最可能的一个。PageError页面不存在。工具应返回明确提示以便智能体调整搜索词。HTTPTimeoutError或RateLimitError网络或速率限制问题。需要实现重试机制和友好的错误提示。语言与区域设置明确设定wikipedia.set_lang()。如果你的应用面向中文用户需处理中文维基百科的内容。注意不同语言版本的内容质量和完整性可能有差异。3.2 智能体的任务规划与自我反思机制这是智能体显得“智能”的核心。一个简单的Agent可能只会机械地执行一次搜索。而一个成熟的Agent需要具备根据初步结果动态调整策略的能力。实现模式示例基于ReAct范式ReActReasoning Acting是让LLM将思考过程Reasoning和行动Acting交错进行的一种经典模式。在llm-wiki-agent中它可能这样运作用户: “苹果公司最新款笔记本电脑的起售价和续航时间是多少” Agent思考链: Thought: 用户想知道苹果公司最新款笔记本的价格和续航。我需要先确定最新款是什么型号。 Action: 使用 wikipedia_search 工具查询“Apple latest laptop model”。 Observation: 工具返回**MacBook Air (M3, 2024)**... 摘要提到搭载M3芯片于2024年发布。 Thought: 我已经确定了最新型号是MacBook Air (M3, 2024)。现在需要它的起售价和续航信息。这些细节可能在规格页面而不是总览摘要里。 Action: 使用 wikipedia_search 工具查询“MacBook Air (M3, 2024) specifications price battery life”。 Observation: 工具返回了规格页面的摘要其中包含“Starting at $1,099”和“Up to 18 hours of battery life”。 Thought: 我已经收集到了所需信息起售价1099美元续航最长18小时。可以回答用户了。 Final Answer: 苹果公司最新的笔记本电脑是2024年发布的MacBook Air (M3)。其起售价为1099美元。根据官方规格它的电池续航时间最长可达18小时。在代码中这通常通过一个提示词模板来驱动该模板要求LLM按照“Thought/Action/Observation”的格式进行输出。框架如LangChain的AgentExecutor会解析这个输出执行Action对应的工具然后将Observation反馈给LLM进入下一轮循环直到LLM输出最终答案。关键配置参数最大迭代次数max_iterations必须设置一个上限如10次防止智能体陷入死循环例如在两个无关页面间来回搜索。一旦达到上限强制终止并返回当前收集到的最佳信息或错误信息。早期停止条件除了LLM自己说出“Final Answer”还可以设置其他停止条件比如当连续两次Action的工具调用结果高度相似时认为智能体在“空转”主动停止。3.3 上下文管理与向量检索集成对于多轮对话或复杂查询简单的对话历史缓冲可能不够。例如用户“爱因斯坦的主要成就是什么” - Agent查维基百科并回答。 用户“那他是在哪里完成这些工作的”第二个问题依赖于对前文“爱因斯坦”和“主要成就”的理解。如果仅仅把上一轮的回答文本塞进上下文可能会很冗长。此时向量检索就能派上用场。集成步骤存储每当智能体从维基百科获取到一段有价值的信息如一个段落除了用于生成当前回答还可以将这段文本连同元数据如来源页面、时间戳通过嵌入模型如text-embedding-3-small转换为向量存入向量数据库如Chroma。检索当进行新一轮对话时先将用户的当前查询或结合部分对话历史转换成查询向量。增强用这个查询向量去向量数据库中搜索最相关的历史信息片段例如找到之前存储的关于“爱因斯坦 成就”的段落。将这些片段作为“上下文”或“记忆”与当前查询一起喂给LLM。这样做的好处是实现了精准的长期记忆。智能体不必重新查询维基百科关于爱因斯坦的基础信息可以直接基于之前“记住”的内容进行深入回答大大提升了效率和对话题的连贯性。实操心得向量检索的引入会增加系统复杂性。你需要权衡对于简单的、事实性的单轮问答可能不需要。但对于希望构建有“记忆力”的、能进行深度探讨的助手这是必不可少的一环。注意管理向量库的规模定期清理过时或低质量的数据片段。4. 环境搭建与快速启动指南让我们抛开理论动手搭建一个最基本的llm-wiki-agent原型。这里我们假设使用LangChain框架和OpenAI API作为LLM后端。4.1 基础环境配置与依赖安装首先确保你的Python环境在3.8以上。创建一个新的虚拟环境是良好的习惯。# 1. 创建并激活虚拟环境 (可选但推荐) python -m venv wiki_agent_env source wiki_agent_env/bin/activate # Linux/macOS # wiki_agent_env\Scripts\activate # Windows # 2. 安装核心依赖 pip install langchain langchain-community wikipedia # LangChain核心及维基百科工具 pip install openai # 使用OpenAI模型 # 如果需要向量检索功能额外安装 pip install chromadb langchain-chroma # 向量数据库Chroma pip install tiktoken # 用于Token计数接下来你需要准备API密钥。如果你使用OpenAI请在 OpenAI平台 获取你的OPENAI_API_KEY。安全起见不要将密钥硬编码在代码中推荐使用环境变量管理# 在终端中设置环境变量 (临时) export OPENAI_API_KEYyour-api-key-here # Linux/macOS # set OPENAI_API_KEYyour-api-key-here # Windows4.2 构建一个最小可行智能体下面是一个完整的、可运行的脚本它创建了一个能回答简单事实问题的维基百科智能体。# wiki_agent_basic.py import os from langchain.agents import AgentExecutor, create_react_agent from langchain.tools import Tool from langchain_community.utilities import WikipediaAPIWrapper from langchain_openai import ChatOpenAI from langchain import hub # 用于拉取预设的提示词 # 1. 初始化LLM (确保已设置OPENAI_API_KEY环境变量) llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 使用gpt-3.5-turbo温度设为0使输出更确定 # 2. 创建维基百科工具 wiki WikipediaAPIWrapper(top_k_results2, doc_content_chars_max1000) # 限制结果数和字符数 wiki_tool Tool( nameWikipedia, funcwiki.run, descriptionUseful for searching factual information on a wide range of topics from Wikipedia. Input should be a clear search query. ) # 3. 定义工具列表 tools [wiki_tool] # 4. 获取ReAct风格的提示词模板 # LangChain Hub上有一个很好的默认ReAct提示词 prompt hub.pull(hwchase17/react-chat) # 5. 创建智能体 agent create_react_agent(llm, tools, prompt) # 6. 创建智能体执行器 agent_executor AgentExecutor( agentagent, toolstools, verboseTrue, # 开启详细日志可以看到Thought/Action/Observation过程 handle_parsing_errorsTrue, # 优雅处理解析错误 max_iterations5, # 防止无限循环 early_stopping_methodgenerate, # 停止条件 ) # 7. 运行查询 if __name__ __main__: queries [ Who invented the Python programming language?, What is the capital of France?, # 尝试一个需要多步推理的 What was the name of the company that Steve Jobs founded after leaving Apple in 1985?, ] for query in queries: print(f\n{*50}) print(fQuery: {query}) print(f{*50}) try: result agent_executor.invoke({input: query, chat_history: []}) print(fAnswer: {result[output]}) except Exception as e: print(fError during execution: {e})运行与解读执行这个脚本python wiki_agent_basic.py。当verboseTrue时你会在控制台看到智能体完整的思考链。对于第三个问题你可能会看到类似以下的输出Thought: 用户想知道史蒂夫·乔布斯1985年离开苹果后创立的公司名字。我需要搜索相关信息。 Action: Wikipedia[史蒂夫·乔布斯 1985 离开苹果 创立 公司] Observation: 根据维基百科史蒂夫·乔布斯于1985年从苹果公司辞职后同年创立了一家名为NeXT的计算机公司。 Thought: 我已经找到了所需信息。史蒂夫·乔布斯在1985年离开苹果后创立的公司叫NeXT。 Final Answer: 史蒂夫·乔布斯在1985年离开苹果公司后创立了一家名为NeXT的计算机公司。这就是一个完整的ReAct过程。智能体自己决定搜索词理解返回结果并给出最终答案。4.3 为智能体增加“记忆”能力上面的例子是单轮对话。要让智能体记住对话历史我们需要引入ConversationBufferMemory。# wiki_agent_with_memory.py from langchain.memory import ConversationBufferMemory from langchain.agents import AgentExecutor, create_react_agent from langchain.tools import Tool from langchain_community.utilities import WikipediaAPIWrapper from langchain_openai import ChatOpenAI from langchain import hub llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) wiki WikipediaAPIWrapper(top_k_results2) wiki_tool Tool(nameWikipedia, funcwiki.run, descriptionSearch Wikipedia for factual information.) tools [wiki_tool] prompt hub.pull(hwchase17/react-chat) # 关键创建记忆对象 memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) # 创建智能体时需要将记忆相关的变量包含在提示词输入中 agent create_react_agent(llm, tools, prompt) agent_executor AgentExecutor( agentagent, toolstools, memorymemory, # 传入记忆对象 verboseTrue, handle_parsing_errorsTrue, max_iterations5, ) # 模拟多轮对话 print(Agent: 你好我是一个维基百科助手。你可以问我任何事实性问题。) chat_history [] while True: user_input input(\nYou: ) if user_input.lower() in [quit, exit, bye]: print(Agent: 再见) break try: # 调用执行器传入当前输入和聊天历史记忆对象内部会处理 result agent_executor.invoke({input: user_input}) print(fAgent: {result[output]}) except Exception as e: print(fAgent: 抱歉处理时出现了点问题: {e})现在你可以进行连续提问了You: 爱因斯坦是谁 Agent: 经过搜索阿尔伯特·爱因斯坦是德裔理论物理学家他发展了相对论... You: 他最重要的贡献是什么在第二轮智能体的提示词中会自动包含第一轮的问答历史使其能理解“他”指代的是爱因斯坦从而可能直接基于已有知识回答或进行更精准的搜索如“爱因斯坦 贡献 相对论”。5. 性能调优、问题排查与进阶方向一个能跑起来的原型只是第一步。要让它在生产环境中可靠、高效、经济地运行还需要解决一系列实际问题。5.1 常见问题与排查清单问题现象可能原因排查步骤与解决方案智能体陷入循环反复搜索相同或类似内容。1.最大迭代次数设置过高且停止条件不明确。2.LLM推理能力不足无法从返回信息中提炼出答案。3.工具返回信息质量差如全是消歧义或错误页面。1. 降低max_iterations(如设为5-7)。在提示词中强调“如果你认为已有足够信息请直接给出最终答案”。2. 升级更强的基座模型如从gpt-3.5-turbo切换到gpt-4-turbo。3. 增强工具的错误处理和结果过滤逻辑确保返回给LLM的是最相关、最干净的信息。回答内容与维基百科信息不符或“胡编乱造”。1.LLM的“幻觉”问题在信息不足时自行脑补。2. 工具返回的信息被LLM错误解读。3. 上下文窗口过长导致关键信息被淹没。1. 在提示词中加入强约束“严格依据工具返回的信息作答如果信息不足请明确说明‘根据现有信息无法确定’切勿编造。”2. 让工具返回信息时附带明确的来源标识如[来自页面XXX]并提示LLM引用。3. 优化信息提取策略只返回最相关的片段控制输入LLM的token数量。响应速度非常慢。1.网络延迟访问维基百科API或OpenAI API。2.LLM生成速度慢使用了大模型或上下文很长。3.智能体进行了过多轮迭代。1. 为网络请求添加超时和重试机制。考虑对常用查询结果进行缓存如使用functools.lru_cache装饰工具函数。2. 考虑使用更快的模型如gpt-3.5-turbo比gpt-4快或对回答长度进行限制。3. 分析日志看是否因规划不善导致无效迭代。优化提示词引导其更高效规划。处理复杂、多子问题查询时效果差。智能体任务分解能力不足试图用一个搜索解决所有问题。在提示词中显式教导“对于复杂问题请将其分解为多个子问题并逐一搜索解决。例如对于‘比较A和B’的问题可以先搜索A的信息再搜索B的信息最后进行对比。”向量检索返回的结果不相关。1.嵌入模型不适合当前领域或语言。2.检索策略单一仅靠语义相似度。1. 尝试不同的嵌入模型OpenAI的text-embedding-3-small通用性较好也可尝试开源模型如BGE-M3。2. 采用混合检索结合语义搜索向量和关键词搜索如BM25综合排序。LangChain的EnsembleRetriever可以做到这一点。5.2 成本控制与优化策略使用商用LLM API如OpenAI是按Token收费的。智能体的多轮交互特性可能导致Token消耗剧增。监控与统计在代码中集成Token计数tiktoken库记录每次交互的输入/输出Token数并设置每日预算警报。上下文窗口管理选择性记忆不要将整个对话历史都塞进上下文。只保留最近几轮或最重要的摘要。可以使用ConversationSummaryMemory或ConversationSummaryBufferMemory来压缩历史。精简工具输出严格限制WikipediaAPIWrapper的doc_content_chars_max参数。优先返回摘要而非全文。模型选型对于信息提取、任务规划等步骤可以尝试使用更便宜、更快的模型如gpt-3.5-turbo。对于最终答案的合成与润色再使用更强大的模型如gpt-4。这种“小模型干活大模型把关”的混合模式能有效降低成本。缓存层对相同的用户查询和工具调用结果进行缓存。例如使用Redis或SQLite缓存“爱因斯坦 生平”的维基百科检索结果在有效期内如1天直接返回避免重复调用API和网络请求。5.3 从原型到生产进阶扩展思路当你掌握了基础版本后可以考虑以下方向进行深化多源信息融合维基百科并非唯一知识源。可以集成更多工具新闻API获取最新动态。学术搜索引擎如Google Scholar、Semantic Scholar获取专业论文信息。公司财报/官方文档通过爬虫或专用API获取。 让智能体学会根据问题类型“最新消息”、“学术观点”、“官方数据”选择最合适的工具。复杂查询与报告生成针对“请总结一下量子计算过去五年的主要进展并列出三个关键挑战”这类复杂指令智能体需要执行一系列搜索如“量子计算 进展 2020”、“量子计算 挑战”从多个页面提取信息并进行总结、归纳和格式化输出。这需要更强大的任务规划提示和后期处理模块。开源模型本地部署出于成本、隐私或定制化需求你可以将LLM后端替换为本地部署的开源模型如Llama 3、Qwen、Mixtral。这需要搭建本地模型服务使用Ollama、vLLM或Text Generation Inference。调整提示词以适应开源模型的格式和特性。可能需要对模型进行微调以更好地遵循工具调用和任务规划的指令。评估与持续改进建立评估体系至关重要。可以准备一个测试集QA对定期运行智能体从准确性答案是否基于事实、完整性是否回答了所有子问题、效率平均迭代次数等维度进行自动化评估。根据评估结果迭代优化你的提示词、工具配置甚至模型选择。SamurAIGPT/llm-wiki-agent项目为我们提供了一个绝佳的起点和思维框架。它验证了LLM与外部知识库结合的巨大潜力。真正的挑战和乐趣在于如何根据你特定的应用场景去打磨这个智能体的每一个细节——让它更聪明、更快速、更可靠。从这个项目出发你可以构建出属于自己的、能够真正理解并利用人类知识海洋的智能助手。

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