基于Python的Libby图书监控Agent技能:RPA与智能体应用实践

news2026/5/14 23:29:40
1. 项目概述与核心价值最近在折腾自动化工具链发现一个挺有意思的开源项目叫alexpolonsky/agent-skill-libby-book-monitor。乍一看名字有点长但拆解一下就很清晰了这是一个为智能体Agent设计的技能Skill核心功能是监控图书馆电子书平台Libby上的书籍状态。简单来说它能帮你自动盯着一本你想借但暂时没货的电子书一旦有可借阅的副本就立刻通知你省去了你每天手动刷新、查看的麻烦。这个项目背后解决的是一个非常具体的“数字生活痛点”。对于重度阅读者尤其是依赖公共图书馆数字资源的朋友Libby以及其背后的OverDrive平台是获取免费正版电子书和有声书的神器。但热门书籍的等待列表往往很长你排上队后就进入了漫长的等待期。什么时候轮到你不知道。你只能隔三差五登录App去检查这个过程既低效又容易遗忘。这个Agent Skill就是把“人肉监控”这个枯燥任务自动化了让智能体替你7x24小时站岗。从技术角度看它属于RPA机器人流程自动化和智能体应用的一个精巧结合点。项目本身是用Python写的结构清晰它并没有尝试去模拟一个完整的、拥有复杂推理能力的“通用人工智能”而是聚焦于完成一个定义明确、流程固定的单一任务。这种“小而美”的设计思路非常值得借鉴它降低了开发复杂度提高了可靠性并且很容易被集成到更大的智能体工作流中。无论你是想学习如何为AI Agent开发一个实用的技能插件还是单纯想给自己搭建一个省心的图书监控工具这个项目都提供了一个绝佳的范本。2. 项目架构与核心思路拆解2.1 技能Skill的定位与设计哲学在智能体Agent的生态中“技能”通常指代一个封装好的、可被Agent调用的特定能力单元。它接收明确的输入执行一个确定性的流程并返回结构化的输出。libby-book-monitor就是一个典型的技能。它的设计哲学体现了“单一职责原则”和“接口清晰化”。这个技能的核心输入非常简单你想要监控的图书的标识符例如ISBN号或Libby内部的Title ID以及你的Libby账户凭证。输出也很明确图书的可借阅状态变更通知。整个技能内部封装了登录Libby、查询图书详情、解析库存状态、判断状态变化、触发通知这一系列复杂操作。对于调用它的Agent比如一个家庭自动化中枢Agent或者一个日程管理Agent来说它无需关心Libby的网页结构如何、登录流程怎样它只需要知道“调用check_libby_book技能传入书ID和账号它会告诉我书能不能借了”。这种设计带来了几个好处。首先可复用性极强。任何支持类似技能调用协议的Agent框架如LangChain的Tool、AutoGPT的插件、或是自定义的Agent系统都可以轻松集成它。其次维护边界清晰。如果Libby的网页改版了只需要在这个技能内部更新网页解析逻辑所有使用它的Agent都不受影响。最后降低了Agent的认知负担。Agent不需要学习如何操作Libby它只需要在合适的时机比如每天凌晨调用这个技能即可。2.2 技术栈选型与依赖分析项目主要基于Python这是自动化脚本和智能体生态的主流语言拥有丰富的库支持。我们来看其核心依赖requests与BeautifulSoup4/lxml这是实现网页抓取Web Scraping的黄金组合。requests库负责发送HTTP请求模拟浏览器与Libby服务器通信例如提交登录表单、访问图书详情页。BeautifulSoup4或lxml则负责解析返回的HTML文档从中提取关键信息如“Waitlist: 3 people ahead of you”或“Borrow”按钮是否存在。选择这个方案而非Libby官方API如果存在的话的原因在于官方API通常限制更多或功能不全而网页端包含了最全的信息。但这也意味着项目需要应对网页结构变更的风险。schedule或apscheduler用于实现定时任务。监控需要周期性执行比如每30分钟或每2小时检查一次。这类库可以方便地设定Cron式的定时规则让脚本在后台持续运行。在容器化部署时也可以选择使用系统的Cron服务来触发脚本。通知渠道集成这是体现项目实用性的关键。一个监控工具如果发现了变化却不能及时通知用户那就失去了意义。项目通常会集成多种通知方式电子邮件SMTP最通用通过smtplib和email库实现。即时通讯应用如通过Telegram Bot API、Slack Incoming Webhook、企业微信/钉钉机器人等发送消息实时性更强。推送通知服务如Pushover、BarkiOS等专为移动端推送设计。本地系统通知在运行脚本的电脑上弹出提示适用于桌面场景。配置管理通常使用configparser读取INI文件或者直接使用json/yaml文件来存储敏感信息如账号密码、API密钥和运行参数如监控频率、图书列表。这里有一个至关重要的安全实践绝对不要将凭证硬编码在脚本中必须通过配置文件或环境变量传入。数据持久化为了判断状态是否“变化”技能需要记住上一次检查的结果。最简单的实现是使用一个本地的JSON文件或小型SQLite数据库记录每本书上次检查时的状态如“已借阅”、“等待中位置5”、“不可用”。每次检查后将新状态与旧状态对比只有发生变化时才触发通知。2.3 核心工作流逻辑整个技能的工作流是一个清晰的“获取状态 - 对比 - 决策 - 通知”循环初始化与认证加载配置使用存储的Cookie或重新登录获取新的会话Session以维持登录状态。处理可能出现的验证码虽然Libby通常没有但这是此类自动化工具的常见挑战。状态获取对于配置列表中的每一本书构造其详情页URL并发起请求。使用HTML解析器定位关键状态元素。这里的解析逻辑是整个技能最脆弱的部分需要精准地定位到包含等待人数、借阅按钮状态的HTML标签和CSS选择器。状态解析与标准化从HTML中提取出的可能是原始文本如“Available”或“Wait time: 2 weeks”。需要编写规则将其转化为程序可理解的标准化状态枚举例如AVAILABLE、ON_HOLD_WITH_POSITION: 5、UNAVAILABLE。状态对比与决策将本次解析的标准状态与持久化存储的上次状态进行比对。定义什么算“有意义的变化”例如从“等待位置5”变成“等待位置4”可能不需要通知但从“等待位置1”变成“可借阅”就必须要通知。触发通知如果检测到定义的变化则调用配置好的所有通知渠道发送包含图书标题、变化详情和直接借阅链接的消息。状态更新与休眠将本次的新状态更新到持久化存储中然后根据配置的间隔时间休眠等待下一次检查。3. 核心模块深度解析与实操要点3.1 网页抓取与反爬策略应对Libby作为一个面向公众的服务其反爬虫措施可能不像商业数据网站那么严格但基本的礼节和规避策略必不可少。会话Session管理必须使用requests.Session()对象。它会自动处理Cookies使得登录后的多次请求保持在同一个会话中模拟真实浏览器的行为。登录通常是一个POST请求到登录端点提交用户名和密码。成功登录后服务器返回的Cookie会被Session自动保存用于后续的认证请求。请求头Headers伪装这是绕过基础反爬的关键。你的请求头需要看起来像一个普通的浏览器。至少需要设置headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36, Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8, Accept-Language: en-US,en;q0.5, Accept-Encoding: gzip, deflate, br, DNT: 1, Connection: keep-alive, Upgrade-Insecure-Requests: 1, }User-Agent尤为重要。可以考虑准备一个列表轮流使用但对此项目来说一个固定的、常见的UA通常足够。请求频率控制这是最重要的“网络礼仪”。绝不能以秒级甚至毫秒级的频率去疯狂请求Libby服务器。这不仅不道德还可能触发IP限制或封禁。合理的检查间隔是30分钟到2小时。对于等待列表中的书状态不会频繁变化这个间隔完全足够。可以使用time.sleep()或在调度器中设置间隔。解析策略与容错HTML结构可能会变。因此解析代码不能依赖于固定的标签索引而应使用更健壮的属性选择器。例如不要用soup.find_all(div)[7]而要用soup.find(span, class_waitlist-position)或soup.select(button[data-actionborrow])。同时解析逻辑必须包含充分的异常处理和日志记录。如果某个关键元素找不到应该记录错误并跳过本次检查而不是让整个脚本崩溃。实操心得在编写解析器时先用浏览器开发者工具仔细分析目标页面的结构找到状态信息最稳定、最独特的CSS选择器。同时写一个简单的测试脚本定期比如每天运行一次将解析到的状态快照保存下来。这样即使Libby改版你也能第一时间发现解析失败或数据异常并快速调整选择器。3.2 状态机设计与变化检测逻辑这是技能的大脑决定了何时该“尖叫”发送通知。首先需要定义一个内部的状态枚举。例如class BookStatus: AVAILABLE “AVAILABLE” # 可立即借阅 ON_HOLD “ON_HOLD” # 已持有正在阅读期 WAITLIST_POSITION “WAITLIST” # 在等待列表中需要记录位置 UNAVAILABLE “UNAVAILABLE” # 图书馆未收录或无法借阅 UNKNOWN “UNKNOWN” # 解析失败从网页解析出的原始数据需要映射到这些状态。对于WAITLIST_POSITION还需要额外存储一个整数位置。变化检测的核心在于对比“新状态”和“旧状态”。但并非所有变化都值得通知。一个典型的决策矩阵如下旧状态新状态是否通知说明UNAVAILABLEWAITLIST是书已上架可以排队了WAITLIST(位置1)WAITLIST(位置提前)可选可配置。有些人喜欢知道进度。WAITLIST(位置1)AVAILABLE是最关键的通知轮到你了AVAILABLEON_HOLD是确认已成功借阅。ON_HOLDAVAILABLE是借阅期已到书已归还提醒可能需续借。任何状态UNKNOWN否但记录错误解析出错不应触发通知但需报警。持久化存储可以使用一个字典结构以图书ID为键存储状态和额外信息位置、上次检查时间。每次运行结束时将这个字典以JSON格式保存到文件。下次启动时加载。SQLite虽然更强大但对于这个场景JSON文件更简单直观。3.3 多渠道通知集成实战通知模块应该设计为可插拔的。定义一个Notifier基类然后为每种通知方式实现一个子类。class Notifier(ABC): abstractmethod def send(self, message: str, book_title: str, deep_link: str): pass class EmailNotifier(Notifier): def __init__(self, smtp_server, port, username, password, from_addr, to_addr): # 初始化SMTP参数 ... def send(self, message, book_title, deep_link): # 构造邮件内容并发送 ... class TelegramNotifier(Notifier): def __init__(self, bot_token, chat_id): # 初始化Telegram Bot ... def send(self, message, book_title, deep_link): # 调用Telegram Bot API发送消息 ...在主逻辑中你可以初始化一个通知器列表notifiers [EmailNotifier(...), TelegramNotifier(...)]。当需要通知时遍历这个列表调用每个通知器的send方法。这样新增一个通知渠道如Slack只需要添加一个新的类而不影响核心逻辑。通知消息模板消息内容应清晰有用。例如【Libby图书监控】状态更新 书籍《你当像鸟飞往你的山》 状态变化等待列表第1位 - 可借阅 立即借阅https://libbyapp.com/library/.../book/... ⏰ 检测时间2023-10-27 08:30:15包含表情符号可以让消息在手机上更醒目但需确保通知渠道支持如Telegram支持纯短信可能不支持。避坑指南对于电子邮件通知务必处理好SMTP服务器的认证和加密使用starttls或SSL。对于Telegram/Slack等将Bot Token或Webhook URL存储在环境变量中不要提交到代码仓库。另外考虑加入“免打扰时段”功能避免在深夜发送通知打扰休息。4. 从零开始部署与配置指南4.1 环境准备与依赖安装假设你有一台长期开机的机器如家里的树莓派、NAS、云服务器或旧电脑或者你打算使用支持定时任务的云函数服务。安装Python确保系统已安装Python 3.7或更高版本。在Linux/macOS上通常预装Windows可从官网下载。克隆项目与创建虚拟环境推荐git clone https://github.com/alexpolonsky/agent-skill-libby-book-monitor.git cd agent-skill-libby-book-monitor python -m venv venv # 创建虚拟环境 # 激活虚拟环境 # Linux/macOS: source venv/bin/activate # Windows: venv\Scripts\activate安装依赖项目根目录下应有requirements.txt文件。pip install -r requirements.txt如果项目没有提供你需要根据代码手动安装pip install requests beautifulsoup4 schedule python-telegram-bot或其他你需要的通知库。4.2 配置文件详解与安全设置在项目根目录创建一个config.ini或config.yaml文件。切记将这个文件添加到.gitignore中防止敏感信息泄露。Libby账户部分[libby] email your_libby_emailexample.com password your_secure_password_here # 有时需要图书馆卡号 library_card_number 123456789重要密码字段可以考虑只存一个占位符运行时通过环境变量LIBBY_PASSWORD传入这样更安全。监控列表部分[books] # 支持多种IDISBN或Libby Title ID book_ids 9787544276986, libby-title-abc123, 9787020002207 # 或者使用一个单独的JSON文件来管理更复杂的书单 book_list_file books_to_watch.json在books_to_watch.json中你可以存储更丰富的信息[ { “id”: “9787544276986”, “title”: “你当像鸟飞往你的山”, “type”: “isbn” }, { “id”: “libby-title-abc123”, “title”: “Project Hail Mary”, “type”: “title_id” } ]通知配置部分以Telegram和Email为例[telegram] enabled true bot_token YOUR_BOT_TOKEN_FROM_BOTFATHER chat_id YOUR_PERSONAL_CHAT_ID [email] enabled true smtp_server smtp.gmail.com smtp_port 587 username your_emailgmail.com password YOUR_APP_SPECIFIC_PASSWORD # 注意不要用普通密码 from_addr your_emailgmail.com to_addr your_notification_emailexample.com关于Gmail密码的特别提醒如果你使用Gmail不能直接使用登录密码。必须在Google账户设置中开启“两步验证”然后生成一个“应用专用密码”用于此脚本。调度配置[schedule] check_interval_minutes 60 # 每60分钟检查一次 # 或者使用cron表达式 # cron_expression 0 */2 * * * # 每2小时的0分执行4.3 首次运行与调试测试解析先写一个简单的测试脚本test_parser.py只包含登录和解析一本书的逻辑打印出抓取到的原始HTML和解析出的状态。确保你的解析器能正确工作。测试通知单独测试每个通知渠道。例如写一个test_telegram.py发送一条测试信息确认你能收到。完整试运行配置好所有信息后以调试模式运行主脚本一次观察其完整的登录、查询、解析、对比流程查看日志输出是否正常。日志配置完善的日志对于监控这类后台任务至关重要。使用Python的logging模块将日志输出到文件和控制台。设置合理的日志等级如INFO记录每次检查的时间、监控的书本、解析的状态、是否触发通知等。4.4 生产环境部署与持续运行对于个人使用有几种稳定的部署方式Linux系统树莓派/VPS使用systemd创建服务是最可靠的方式。创建服务文件/etc/systemd/system/libby-monitor.service[Unit] DescriptionLibby Book Monitor Service Afternetwork.target [Service] Typesimple Userpi # 你的用户名 WorkingDirectory/path/to/agent-skill-libby-book-monitor Environment“PATH/usr/bin:/home/pi/venv/bin” # 虚拟环境路径 ExecStart/home/pi/venv/bin/python /path/to/monitor.py --config /path/to/config.ini Restarton-failure RestartSec10 [Install] WantedBymulti-user.target启用并启动服务sudo systemctl daemon-reload sudo systemctl enable libby-monitor.service sudo systemctl start libby-monitor.service sudo systemctl status libby-monitor.service # 查看状态这样脚本会在后台持续运行即使服务器重启也会自动启动。云函数/Serverless如果你不想维护服务器可以使用AWS Lambda、Google Cloud Functions或Vercel等。需要将脚本改造成无状态函数由云平台的定时触发器CloudWatch Events/Cloud Scheduler调用。注意运行时间可能有限制且需要处理好依赖打包和凭证的安全存储使用云服务商提供的密钥管理服务。容器化部署使用Docker将应用及其环境打包成一个镜像。这提供了极好的可移植性。你需要编写一个Dockerfile并将配置文件通过环境变量或Docker Secrets注入。然后可以使用docker run或Docker Compose来运行同样可以配合系统的调度器。5. 高级技巧、问题排查与扩展思路5.1 常见问题与排查清单即使脚本运行起来也可能遇到各种问题。下面是一个快速排查指南问题现象可能原因排查步骤登录失败1. 账号密码错误。2. Libby登录流程变更如增加了验证码。3. 网络问题。1. 手动用相同凭证在浏览器登录测试。2. 检查脚本日志中的登录响应看是否有错误信息或重定向到验证页面。3. 临时关闭脚本的SSL验证仅用于测试requests.get(..., verifyFalse)。解析不到状态信息1. Libby网页HTML结构已更新。2. 图书ID无效或链接错误。3. 请求被限制返回了错误页或验证页。1. 运行测试解析脚本保存当前HTML到文件与之前能正常解析的HTML对比调整CSS选择器。2. 手动在浏览器访问该图书的Libby页面确认ID正确且页面能正常打开。3. 检查请求头是否完整特别是User-Agent。增加请求间隔。收不到通知1. 通知配置错误API密钥、Chat ID、邮箱密码等。2. 通知服务被墙如Telegram。3. 状态未达到触发通知的阈值。1. 单独运行通知测试脚本。2. 检查脚本日志看“触发通知”的日志行是否打印了。如果没有说明状态对比逻辑认为无需通知。3. 对于邮箱检查垃圾邮件文件夹。脚本运行一次后退出1. 调度器逻辑错误。2. 未捕获的异常导致程序崩溃。1. 检查schedule库的使用是否正确是否在循环中调用了schedule.run_pending()。2. 在代码最外层添加try...except捕获所有异常并记录到日志确保脚本不会静默崩溃。内存或CPU占用过高1. 检查间隔太短循环过快。2. 存在内存泄漏如未关闭响应对象。1. 将检查间隔调整到30分钟以上。2. 确保使用with requests.Session() as s:上下文管理器或手动关闭响应resp.close()。5.2 性能优化与稳定性提升并发检查如果你监控的书很多比如几十本顺序检查会耗时很长。可以使用concurrent.futures库的ThreadPoolExecutor进行简单的并发请求显著缩短单次检查周期。但要注意并发请求会增加对Libby服务器的压力务必控制并发数例如最多3-5个线程并确保遵守礼貌的爬虫规范。增量更新与缓存不是每次检查都需要重新登录。如果Session Cookie仍然有效就直接使用。可以将有效的Cookie序列化后保存到文件下次启动时尝试加载如果失效再重新登录。健康检查与报警为脚本本身增加监控。可以设置一个“心跳”机制比如每次成功运行后向一个特定的监控渠道如另一个Telegram Chat发送一条“我还活着”的消息。如果超过24小时没有心跳说明脚本可能已经挂掉需要人工干预。配置热重载实现一个信号处理如监听SIGHUP当配置文件修改后发送信号让脚本重新加载配置而无需重启整个进程。5.3 技能扩展与集成想象这个libby-book-monitor技能本身已经很有用但它的潜力不止于此。它可以成为你个人自动化生态中的一个智能模块。与日历集成当监控到书变为“可借阅”时除了发送通知还可以调用日历API如Google Calendar在你的日历中自动创建一个为期21天典型借阅期的“阅读《XXX》”事件并设置到期提醒。与阅读管理工具集成例如与Readwise或Notion集成。一旦你借阅了某本书状态变为ON_HOLD自动在Notion的“待读书单”数据库中创建一条记录或者添加到Readwise的待读列表。构建多用户服务将当前的单用户脚本改造成一个简单的Web服务或机器人。多个用户可以通过Telegram Bot与你的服务交互输入/watch 978XXXXXX来添加监控实现一个共享的图书监控机器人。数据统计与可视化记录每本书的状态变化历史生成简单的统计图表比如“平均等待时间”、“最热门书籍”等让你对自己的阅读习惯和图书馆资源热度有更直观的了解。作为Agent的核心技能将其封装成标准化的Tool集成到像LangChain、AutoGPT这样的智能体框架中。你可以对你的家庭助理Agent说“帮我监控一下《三体》在Libby上有没有货”Agent就会调用这个技能并持续为你监控在可用时通过你习惯的渠道通知你。这个项目就像一颗种子展示了如何将一个具体的、重复性的网络任务通过清晰的架构和稳健的代码转化为一个可靠的自动化服务。它的价值不仅在于帮你抢到想看的书更在于提供了一个完整的、可复用的模式。你可以借鉴其设计去监控其他类似的东西官网的产品库存、机票酒店价格、考试报名名额、甚至是你喜欢的博主是否更新了视频。关键在于理解其“状态获取-对比-决策-通知”的核心循环以及如何优雅地处理网络请求、数据解析和错误恢复。

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