AI助手规则引擎:从提示词工程到可控行为编程

news2026/5/3 20:13:17
1. 项目概述一个为AI助手定制的规则引擎最近在折腾AI应用开发特别是围绕大语言模型LLM构建智能助手时我发现一个普遍存在的痛点如何让AI的“行为”更可控、更符合特定业务逻辑直接给模型一个庞大的提示词Prompt往往效果不稳定逻辑复杂时更是难以维护。直到我深度体验了GitHub上的开源项目WE3io/ai-assistant-rules才找到了一个优雅的解决方案。这不仅仅是一个工具库它本质上是一个为AI助手量身打造的规则引擎能将复杂的业务逻辑、行为约束和安全策略从冗长的自然语言提示词中剥离出来进行结构化、可编程的管理。想象一下你正在开发一个客服机器人。你希望它1在用户询问价格时必须引用最新的价目表2绝对不能透露内部员工的联系方式3如果用户表达不满必须优先安抚并转接人工。这些规则如果全部写在提示词里会变得臃肿不堪且一旦规则变动就需要重新调整和测试整个提示词成本极高。ai-assistant-rules的核心价值就是将这些“规则”定义为独立的、可组合的、可测试的代码单元让AI助手的行为像传统软件一样变得可预测、可审计、可迭代。这个项目非常适合正在或计划将LLM集成到产品中的开发者、产品经理和技术负责人。无论你是想构建一个内部知识问答助手还是一个面向用户的智能对话产品通过引入规则引擎你都能显著提升AI行为的确定性、安全性和开发效率。接下来我将结合自己的实践从设计思路到落地细节为你完整拆解如何利用这个项目来“驯服”你的AI助手。2. 核心设计理念与架构拆解2.1 为什么需要规则引擎从“提示词工程”到“规则编程”传统的LLM应用开发严重依赖“提示词工程”。开发者需要精心设计一段或多段文本来引导模型产生期望的输出。这种方式在简单场景下有效但面临三大挑战逻辑复杂度与可维护性成反比当业务规则超过十条提示词就会变成难以阅读和维护的“天书”。新增一条规则可能无意中破坏旧规则的效果。缺乏确定性与可测试性模型输出具有随机性仅靠提示词无法保证某些关键规则如“不回答A领域问题”被100%遵守。你也很难为一段复杂的提示词编写单元测试。安全与合规风险将敏感的业务逻辑或过滤规则以明文形式写在提示词中存在泄露风险且难以进行细粒度的权限控制和审计。ai-assistant-rules的解决思路是关注点分离。它将AI助手的能力划分为两部分LLM核心大脑负责理解自然语言、生成创意内容、进行复杂推理。这部分依然通过高质量的提示词来驱动。规则引擎小脑与反射神经负责执行确定的、结构化的逻辑。例如检查用户输入是否包含敏感词、判断当前对话是否属于某个业务分类、在回复前强制插入一段免责声明、根据查询关键词从数据库获取精准数据等。这种架构下提示词可以保持简洁和稳定专注于激发模型的“智能”而所有易变的、强制的、需要确保执行的逻辑都交给规则引擎来处理。规则可以用代码如JavaScript、Python或声明式配置如YAML来编写从而享受版本控制、单元测试、代码审查等所有现代软件工程实践的好处。2.2 项目架构与核心组件该项目通常以库Library或中间件Middleware的形式提供。其核心架构可以抽象为以下几个部分规则Rule最基本的执行单元。一个规则通常包含条件Condition判断该规则是否需要被触发。例如用户输入包含“价格”关键词或对话轮次大于5。动作Action规则触发后执行的操作。这可以是修改输入Pre-process在用户问题提交给LLM前对其进行增强或过滤。例如自动补全上下文或屏蔽敏感信息。修改输出Post-process在LLM生成回复后对其进行加工。例如强制在末尾添加标准落款或检查回复中是否包含了不允许出现的信息。执行函数Function触发一个外部API调用或数据库查询。例如用户问天气时规则触发一个调用天气API的函数并将结果作为上下文提供给LLM。流程控制Flow Control决定后续流程。例如直接返回一个预设的回复短路或跳转到另一个规则集。规则集Rule Set一组相关规则的集合。可以按业务模块组织例如“售前规则集”、“安全过滤规则集”、“数据查询规则集”。规则集允许定义规则的执行顺序和冲突解决策略如“短路”策略一个规则执行后是否终止后续规则。上下文Context贯穿整个规则执行周期的数据总线。它包含了当前对话的完整信息如用户输入、历史消息、会话ID、用户身份、从规则中获取的中间数据等。规则可以读取和修改上下文从而实现规则间的数据传递。引擎Engine规则的执行器。它负责加载规则集接收用户输入和上下文按顺序评估每个规则的条件并执行相应的动作最后输出处理后的结果。引擎通常提供钩子Hooks允许开发者在执行前后注入自定义逻辑。一个典型的工作流如下用户输入-进入规则引擎-依次执行各个规则集的预处理规则-生成最终的、增强后的提示词-发送给LLM-获得LLM原始回复-再次进入规则引擎-依次执行后处理规则-生成最终用户回复。3. 从零开始规则定义与开发实践3.1 规则的定义方式代码 vs 配置ai-assistant-rules通常支持多种规则定义方式以适应不同复杂度的需求。1. 声明式配置YAML/JSON适合简单、静态的规则。优点是直观、非程序员也能理解甚至修改。rules: - name: “price_inquiry_response” description: “当用户询问价格时返回标准话术并标记需跟进” condition: type: “contains_keywords” keywords: [“多少钱”, “价格”, “报价”, “cost”, “price”] actions: - type: “append_context” # 动作追加上下文 data: “用户正在咨询价格请根据最新价目表2024年春季版进行回复并提醒可申请优惠。” - type: “set_metadata” # 动作设置元数据 key: “needs_follow_up” value: true这种方式的局限性在于条件判断和动作逻辑相对固定难以实现复杂的计算或动态数据获取。2. 编程式定义JavaScript/Python提供了最大的灵活性。你可以编写任意的函数作为条件或动作。// 一个用JS定义的复杂规则 const sensitiveTopicRule { name: “block_sensitive_topic”, // 条件一个返回布尔值的函数 condition: (context) { const userInput context.get(‘user_message’).toLowerCase(); const sensitiveTopics [‘内部薪资’, ‘高管电话’, ‘未发布产品代号’]; return sensitiveTopics.some(topic userInput.includes(topic)); }, // 动作一个执行操作的函数 action: (context) { context.set(‘block_reason’, ‘查询内容涉及公司敏感信息’); // 直接设置最终回复短路后续所有LLM调用和其他规则 context.set(‘final_response’, ‘抱歉我无法回答这个问题。如果您有其他疑问我很乐意为您提供帮助。’); context.set(‘should_stop’, true); // 通知引擎停止后续处理 } };在实际项目中我强烈建议主要使用编程式定义。虽然学习曲线稍高但它带来的灵活性、可测试性和与现有代码库的集成能力是无可替代的。你可以将规则函数放在独立的模块中用Jest或Pytest进行单元测试确保每条规则在各种边界情况下都能正确工作。3.2 规则的生命周期与执行顺序管理理解规则何时、以何种顺序执行至关重要。一个设计良好的规则集应该像一条精心设计的流水线。生命周期阶段一个用户请求通常会触发两个主要的规则执行阶段预处理阶段在请求发送给LLM之前。规则可以在这里修改用户问题、添加上下文、进行意图分类、或直接返回预设答案短路。后处理阶段在收到LLM回复之后。规则可以在这里进行安全检查如检查是否泄露隐私、格式化回复如添加Markdown格式、或进行情感分析并决定下一步动作。执行顺序与优先级规则引擎允许你为规则集和规则本身定义优先级。一个常见的策略是高优先级安全规则最先执行。例如检查用户输入是否违法、是否包含极端恶意攻击。一旦触发立即阻断不消耗LLM算力。业务路由规则其次执行。根据用户意图将对话路由到不同的处理分支或加载不同的知识库上下文。例如识别到是“技术支持”问题就自动附上最新的故障解决指南。数据增强规则在预处理阶段后期执行。例如识别出产品名称自动从产品数据库中查询规格参数并插入到上下文中。后处理格式化与检查规则在LLM回复后执行。确保回复风格统一并做最终的安全兜底检查。实操心得短路Short-Circuit策略的使用规则引擎的“短路”能力是一把双刃剑。对于像“输入内容违规”这类规则设置短路触发后立即返回不执行后续规则和LLM调用能节省资源并快速响应。但对于大多数业务规则应谨慎使用短路。例如一个规则负责“添加产品信息”另一个负责“检查回复礼貌性”我们希望两者都生效。最佳实践是仅为那些明确需要终止流程的规则如安全拦截、预设问答启用短路其他规则默认按顺序全部执行。4. 实战构建一个企业级客服助手规则集让我们通过一个具体的场景将上述理论付诸实践。假设我们要为一个SaaS公司构建客服AI助手“小助”我们将为其设计三个核心规则集。4.1 规则集一安全与合规过滤这是所有规则的“守门员”必须最先执行且优先级最高。// security_rules.js export const securityRules [ { id: “sec_01”, name: “profanity_filter”, priority: 100, // 优先级最高 condition: (ctx) hasProfanity(ctx.userInput), // 假设有脏话检测函数 action: (ctx) { ctx.setFinalResponse(“请注意文明用语。如果您需要帮助请重新描述您的问题。”); ctx.shouldStop true; // 短路后续所有处理不再进行 } }, { id: “sec_02”, name: “sensitive_data_prevention”, priority: 90, condition: (ctx) { // 检查用户是否在诱导模型生成内部信息 const prompts [“扮演内部员工”, “告诉我数据库密码”, “系统后台地址是什么”]; return prompts.some(p ctx.userInput.toLowerCase().includes(p)); }, action: (ctx) { ctx.appendToSystemPrompt(“你是一名对外的客服助手绝对不可以透露任何系统内部信息、代码、密码或未公开的运营数据。”); // 不短路让LLM在加强的提示词下继续生成但我们会记录这次尝试 ctx.logWarning(“Potential sensitive data probing attempt”, ctx.sessionId); } } ];4.2 规则集二业务意图识别与路由这个规则集负责理解用户想干什么并为其准备相应的“工具”和“资料”。// routing_rules.js export const routingRules [ { id: “route_01”, name: “identify_ticket_status_query”, condition: (ctx) ctx.userInput.includes(“工单”) (ctx.userInput.includes(“状态”) || ctx.userInput.includes(“进度”)), action: async (ctx) { // 1. 设置意图标签供后续规则或数据分析使用 ctx.setMetadata(“intent”, “query_ticket_status”); // 2. 调用内部API获取该用户的工单信息这是一个异步动作 const tickets await fetchUserTickets(ctx.userId); // 3. 将获取到的结构化数据以清晰的方式注入上下文 ctx.appendToContext(用户当前的工单情况如下${JSON.stringify(tickets)}。请根据这些信息回答用户关于工单状态的询问。); // 注意这里没有短路LLM将利用我们注入的上下文生成回复 } }, { id: “route_02”, name: “handle_pricing_request”, condition: (ctx) new RegExp(‘价格|多少钱|报价|fee|pricing’, ‘i’).test(ctx.userInput), action: (ctx) { ctx.setMetadata(“intent”, “pricing_inquiry”); // 注入最新的、动态获取的价格文档片段而不是在提示词里写死价格 const latestPricingDoc getLatestPricingSnippet(); ctx.appendToContext(以下是公司产品的最新公开报价信息更新时间${latestPricingDoc.updateTime}\n${latestPricingDoc.content}); ctx.appendToContext(“在回复价格时务必提及‘具体价格可能因配置和商务条款有所不同建议联系销售获取最终报价’。”); } } ];4.3 规则集三回复后处理与质量保障在LLM生成回复后我们需要对其做最后的“质量检查”和“包装”。// postprocess_rules.js export const postprocessRules [ { id: “post_01”, name: “ensure_no_apology_loops”, condition: (ctx) { const llmResponse ctx.llmRawResponse; // 检测LLM是否陷入“道歉循环”例如连续多次回复“抱歉我还没有学会…” return (llmResponse.match(/抱歉|对不起|我还没有|无法回答/g) || []).length 2; }, action: (ctx) { // 如果检测到则用更积极、引导性的话术覆盖原回复 ctx.setFinalResponse(“您的问题可能超出了我当前的知识范围。我已经将您的问题【‘“ ctx.userInput “‘】】记录下来并转交给专业客服团队他们将在1个工作日内通过邮件联系您。同时您可以尝试在我们的帮助中心链接搜索相关问题。”); ctx.shouldStop true; // 替换后终止 } }, { id: “post_02”, name: “append_standard_footer”, condition: (ctx) true, // 无条件执行为所有回复添加页脚 action: (ctx) { const currentResponse ctx.getCurrentResponse(); const footer “\n\n---\n*我是小助您的智能客服。以上回答仅供参考如需进一步帮助请随时联系我们。*”; ctx.setCurrentResponse(currentResponse footer); } } ];4.4 引擎集成与执行流程最后我们需要将这些规则集集成到AI助手的调用链路中。以下是一个简化的Node.js集成示例import { RuleEngine } from ‘ai-assistant-rules’; import { securityRules } from ‘./rules/security_rules’; import { routingRules } from ‘./rules/routing_rules’; import { postprocessRules } from ‘./rules/postprocess_rules’; import { callLLM } from ‘./llm_service’; // 你调用LLM API的函数 // 1. 初始化规则引擎并注册规则集 const engine new RuleEngine(); engine.registerRuleSet(‘security’, securityRules, { priority: 1000 }); // 安全规则最先执行 engine.registerRuleSet(‘routing’, routingRules, { priority: 900 }); engine.registerRuleSet(‘postprocess’, postprocessRules, { priority: 800 }); // 2. 处理用户请求的异步函数 async function handleUserQuery(userInput, userId, sessionId) { // 初始化上下文 const context { userInput, userId, sessionId, metadata: {}, systemPrompt: “你是SaaS公司‘小助’的客服AI专业、友好、乐于助人。”, llmRawResponse: null, finalResponse: null, shouldStop: false }; // 阶段一预处理执行 await engine.execute(‘pre’, context); if (context.shouldStop) { return context.finalResponse; // 被安全规则等短路 } // 阶段二调用LLM使用被规则增强后的上下文 const llmResponse await callLLM(context.systemPrompt, context.userInput, context.getFullContext()); context.llmRawResponse llmResponse; // 阶段三后处理执行 await engine.execute(‘post’, context); if (context.shouldStop) { return context.finalResponse; // 被后处理规则覆盖 } // 返回最终处理后的回复 return context.finalResponse || context.llmRawResponse; }通过这样的集成AI助手的核心处理流程就从一个“黑盒”的LLM调用变成了一个由清晰规则驱动的、可观测、可控制的透明管道。5. 高级技巧、调试与性能优化5.1 规则的动态加载与热更新在生产环境中业务规则需要频繁调整。每次修改都重启服务是不可接受的。ai-assistant-rules项目通常支持从数据库或配置中心动态加载规则。实现思路将规则定义特别是配置式规则存储在数据库如MongoDB、PostgreSQL或配置管理服务如Apollo、Nacos中。在规则引擎中为每个规则集设置一个版本号或最后更新时间戳。启动一个后台定时任务或通过配置中心的监听机制定期检查规则是否有更新。当检测到更新时动态解析新的规则配置并原子化地替换内存中对应的规则集。// 伪代码动态更新示例 class DynamicRuleEngine extends RuleEngine { constructor(ruleConfigService) { super(); this.ruleConfigService ruleConfigService; this.loadRules(); this.startPolling(); } async loadRules() { const ruleConfigs await this.ruleConfigService.fetchAll(); // 解析配置生成规则函数... this.registerRuleSet(‘dynamic_rules’, parsedRules); } startPolling() { setInterval(async () { if (await this.ruleConfigService.hasChanged()) { console.log(‘Rule configuration changed, reloading...’); await this.loadRules(); // 热更新 } }, 30000); // 每30秒检查一次 } }这样产品经理或运营人员可以通过管理后台修改规则配置并在几十秒内生效无需开发介入或重启服务。5.2 规则的调试、测试与监控调试为规则引擎开启详细日志模式。记录每个规则的评估条件输入、输出、动作执行结果、上下文的变化过程。这能帮你快速定位是哪个规则导致了非预期行为。测试为每个规则编写单元测试。由于规则是纯函数输入上下文输出动作测试非常容易。// 使用Jest测试一个规则 import { pricingRule } from ‘./routing_rules’; describe(‘Pricing Inquiry Rule’, () { test(‘should trigger on “价格” keyword’, () { const context { userInput: ‘这个产品价格是多少’, metadata: {} }; const shouldTrigger pricingRule.condition(context); expect(shouldTrigger).toBe(true); }); test(‘should inject pricing context when triggered’, () { const context { userInput: ‘价格’, appendToContext: jest.fn(), setMetadata: jest.fn() }; pricingRule.action(context); expect(context.setMetadata).toHaveBeenCalledWith(‘intent’, ‘pricing_inquiry’); expect(context.appendToContext).toHaveBeenCalled(); // 检查是否调用了添加上下文的方法 }); });监控为关键规则添加度量指标。例如记录每个规则的触发频率、执行耗时。这能帮你发现哪些规则最常用可能需要优化哪些规则从未触发可能是条件太严或已失效以及规则引擎的整体性能瓶颈。5.3 性能考量与优化策略引入规则引擎意味着在LLM调用前后增加了计算开销。在高并发场景下需要精心优化。条件评估优化规则的condition函数会被频繁调用。确保它们轻量且高效。避免在条件判断中进行复杂的数据库查询或网络调用。如果必须依赖外部数据考虑在请求初期批量预取或使用缓存。规则集剪枝不是每个请求都需要跑完所有规则。可以根据用户身份、对话阶段等特征动态选择需要执行的规则集。例如对于已认证的内部员工可以跳过部分安全过滤规则。异步动作执行对于action中耗时的操作如调用外部API确保引擎支持异步执行避免阻塞主流程。并设置合理的超时时间防止个别慢动作拖垮整体响应。缓存策略对于根据固定输入如“查询产品A的价格”产生固定上下文注入的规则可以考虑将“规则输入-输出”的结果缓存起来缓存几分钟避免重复计算。一个常见的性能陷阱是在预处理规则中执行了过多的同步、重型操作导致用户感知的响应延迟大大增加。我的经验是预处理阶段的耗时应控制在100毫秒以内如果超过就需要审查规则逻辑或引入缓存。6. 常见问题与避坑指南在实际部署和运维基于规则引擎的AI助手时我遇到了不少典型问题。这里总结一份速查表希望能帮你绕开这些坑。问题现象可能原因排查与解决思路规则似乎没有生效1. 规则条件condition逻辑错误始终返回false。2. 规则执行顺序有误被高优先级规则的“短路”提前终止了。3. 规则注册失败未成功加载到引擎中。1.开启调试日志查看该规则的输入上下文和条件评估结果。2. 检查规则优先级和短路设置临时取消短路测试。3. 检查引擎初始化代码确认规则集被正确register。LLM的回复变得奇怪或重复1. 多个规则修改了同一处上下文如systemPrompt导致冲突或叠加。2. 后处理规则错误地多次修改了最终回复。1. 审查所有会修改systemPrompt或核心上下文的规则确保它们是互补而非覆盖关系。可以使用“追加”而非“设置”操作。2. 在后处理规则中检查context.getCurrentResponse()的初始值确保逻辑正确。系统响应明显变慢1. 某个规则的condition或action函数存在性能瓶颈如未优化的循环、同步IO。2. 规则数量过多串行执行耗时累加。1.添加性能监控记录每个规则的执行时间定位慢规则。2. 优化慢规则逻辑如引入缓存、将同步改为异步。3. 评估规则集是否可以并行化执行如果规则间无依赖。动态更新的规则不生效1. 热更新逻辑有bug新规则未成功加载到内存。2. 新规则语法错误导致加载失败但未抛出异常。3. 服务存在多个实例只更新了其中一个。1. 在更新逻辑中添加健全的日志和错误处理。2. 对从外部存储加载的规则配置进行语法校验。3. 如果多实例部署需通过广播机制或共享配置中心确保所有实例同步更新。规则间出现循环依赖或死锁规则A的动作修改了上下文触发了规则B的条件规则B的动作又反过来触发规则A形成循环。1. 设计规则时避免复杂的、相互触发的关系。2. 在引擎层面设置规则执行深度限制超过阈值则抛出异常并终止。在特定输入下AI回复被完全劫持某条后处理规则的condition过于宽泛错误地触发了并用setFinalResponse短路了流程给出了完全无关的回复。1.收紧规则条件增加更精确的约束。2. 对于直接设置最终回复的规则采取“白名单”策略确保只在极明确的情况下触发。3. 增加一条兜底的审核规则检查最终回复是否与用户问题高度相关否则告警或使用默认回复。最重要的避坑经验从简单开始迭代演进。不要试图在第一天就设计一个包含上百条规则的复杂系统。先从最高优先级的3-5条核心规则开始例如安全过滤、核心业务意图识别。让系统跑起来收集真实的用户交互日志分析AI在哪里“犯错”或“力不从心”然后针对性地增加或修改规则。这样构建出来的规则集才是健壮和高效的。规则引擎是增强AI可控性的强大工具但它本身也需要被精心设计和维护。

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