AI智能体框架yu-ai-agent:快速构建与部署开发者指南

news2026/4/27 7:56:44
1. 项目概述一个面向开发者的AI智能体框架最近在GitHub上闲逛发现了一个挺有意思的项目叫yu-ai-agent。这个项目来自开发者liyupi也就是大家熟知的“程序员鱼皮”。看到这个名字我的第一反应是这应该不是一个简单的“Hello World”级别的AI应用。点进去一看果然这是一个旨在帮助开发者快速构建、管理和部署AI智能体Agent的框架。在当前这个“人人都在谈Agent”的时代这样的工具框架对于想深入AI应用层但又不想从零造轮子的开发者来说吸引力是巨大的。简单来说yu-ai-agent试图解决的核心痛点就是“效率”和“标准化”。很多开发者包括我自己在尝试将大语言模型LLM的能力集成到自己的业务中时常常会陷入一些重复性的劳动如何设计智能体的记忆机制怎么处理工具Tools的调用和返回多轮对话的状态如何维护流式输出怎么实现这个框架的目标就是把这些通用且复杂的部分抽象出来封装成一套易于使用的接口和模块让开发者可以更专注于业务逻辑本身而不是底层的基础设施。它适合谁呢我认为主要面向几类人一是对AI应用开发感兴趣的独立开发者或小团队希望有一个快速上手的起点二是有一定Python基础想学习智能体系统设计思想的中高级开发者三是企业内部需要快速验证AI智能体场景的技术选型人员。这个项目就像一个“乐高积木箱”提供了各种标准件至于最终拼出机器人还是城堡就看你的想象力了。2. 核心架构与设计哲学拆解要理解一个框架首先得看它的设计思路。yu-ai-agent的架构清晰地反映了当前AI智能体领域的主流思想即“编排Orchestration”为核心。它不是一个大而全的、试图解决所有问题的庞然大物而是更倾向于做一个轻量、灵活的“粘合剂”和“脚手架”。2.1 模块化与解耦设计框架的核心价值在于其高度的模块化。通过阅读代码和文档我发现它将一个智能体系统拆解成了几个关键组件智能体Agent这是核心执行单元负责理解用户意图、规划行动步骤、调用工具并生成回复。工具Tools智能体可以调用的外部能力比如搜索网络、查询数据库、执行代码等。框架应该提供一套标准化的方式来定义、注册和调用工具。记忆Memory负责存储和检索对话历史、上下文信息这是实现多轮连贯对话的基础。短期记忆会话缓存和长期记忆向量数据库通常是两个维度。知识库Knowledge Base作为记忆的扩展用于存储和检索非结构化的文档知识通常结合向量化检索技术。编排器Orchestrator负责协调以上所有组件管理智能体的生命周期和工作流。这是框架的“大脑”。这种设计的优势非常明显可插拔性。比如今天你用OpenAI的GPT-4作为大脑明天想换成Claude 3或者本地部署的Qwen理论上只需要更换底层的LLM调用模块上层的工具、记忆逻辑可以基本不变。同样你可以轻松地为智能体“安装”新的工具或者更换不同的向量数据库来实现记忆存储。2.2 对流行范式的支持从项目更新和讨论区来看yu-ai-agent紧跟技术潮流积极融入了一些被验证有效的设计模式ReActReasoning Acting模式这是框架很可能支持的核心推理模式。智能体通过“思考Thought-行动Action-观察Observation”的循环来完成任务。框架需要提供清晰的机制来解析LLM的输出区分出“思考内容”、“要调用的工具”和“工具参数”然后执行调用并将结果作为“观察”反馈给LLM进行下一轮思考。这个循环的自动化管理是框架的关键能力。流式输出Streaming对于需要长时间运行的任务或者为了提供更好的用户体验支持流式输出一个字一个字地返回结果几乎是现代AI应用的标配。框架需要处理好与LLM API的流式交互并将结果实时推送到前端或调用方。函数调用Function Calling的标准化各大主流LLM API都提供了函数调用能力这本质上是将工具调用标准化。一个好的框架需要抽象这一层让开发者用一套统一的语法定义工具而框架负责将其适配到不同LLM如OpenAI的tools参数、Anthropic的tool_use块等的特定格式上。注意在选择或评估这类框架时一定要检查其“抽象层”的设计。一个优秀的抽象应该让开发者几乎感知不到底层LLM的差异。如果更换模型需要你大量修改工具定义或调用逻辑那这个框架的封装程度可能还不够。3. 快速上手与核心配置实战理论说得再多不如动手跑起来。我们以最常见的场景——创建一个能调用搜索引擎和计算器的智能体——为例来走一遍yu-ai-agent的基本流程。这里我会基于对项目结构的常见推断给出具体的操作步骤和代码示例。3.1 环境准备与安装首先自然是准备Python环境。建议使用Python 3.9或以上版本并使用虚拟环境隔离依赖。# 1. 克隆项目仓库 git clone https://github.com/liyupi/yu-ai-agent.git cd yu-ai-agent # 2. 创建并激活虚拟环境以venv为例 python -m venv venv # Windows: venv\Scripts\activate # Linux/Mac: source venv/bin/activate # 3. 安装依赖 pip install -r requirements.txt # 如果项目使用 poetry 或 pdm则使用对应的命令如 poetry install安装完成后最关键的一步是配置API密钥。框架需要连接LLM服务通常会在项目根目录或config/目录下提供一个配置文件模板如.env.example或config.yaml.example。你需要复制一份并填入自己的密钥。# 假设使用 .env 文件 cp .env.example .env # 然后编辑 .env 文件填入你的 OpenAI API Key 或其他模型密钥 # OPENAI_API_KEYsk-your-key-here # 如果使用国内模型可能需要配置 BASE_URL 等参数3.2 定义你的第一个工具Tool工具是智能体的手脚。框架通常会提供一个装饰器或者基类来让你定义工具。一个工具本质上就是一个Python函数加上一些元数据描述、参数schema来帮助LLM理解何时以及如何调用它。# 示例custom_tools.py from yu_ai_agent.tools import tool # 假设框架的装饰器叫 tool from pydantic import Field # 用于定义参数类型 tool def search_web(query: str Field(description搜索查询词)): 使用搜索引擎在互联网上搜索信息。 # 这里是一个模拟实现实际项目中你会接入SerpAPI、Google Search API等 print(f[模拟搜索] 正在搜索: {query}) # 模拟返回搜索结果 return f关于{query}的搜索结果这是一个模拟的搜索结果摘要。 tool def calculator(expression: str Field(description数学表达式例如3 5 * 2)) - str: 执行数学计算。支持加减乘除和括号。 # 警告直接使用eval有安全风险仅作示例。生产环境应使用安全计算库如ast.literal_eval或numexpr try: # 极其简化的安全处理实际请勿模仿 if any(c.isalpha() for c in expression): # 简单检查是否包含字母 raise ValueError(表达式不安全) result eval(expression) return f计算结果: {expression} {result} except Exception as e: return f计算错误: {e}实操心得在定义工具时函数描述docstring和参数描述至关重要。LLM完全依赖这些文本来决定是否以及如何调用工具。描述要清晰、具体说明工具的用途、输入和输出。参数使用Field(description...)能提供更细致的约束。3.3 创建并运行智能体有了工具接下来就是创建智能体并将工具“装配”给它。# 示例run_agent.py import asyncio from yu_ai_agent import Agent, AgentConfig # 假设主要的类名 from yu_ai_agent.llm import OpenAIChat # 假设LLM集成类 from custom_tools import search_web, calculator # 导入刚才定义的工具 async def main(): # 1. 配置LLM llm OpenAIChat( modelgpt-4-turbo-preview, # 或 gpt-3.5-turbo api_keyyour-api-key, # 通常从环境变量读取更安全 temperature0.1, # 较低的温度使输出更确定适合工具调用 ) # 2. 创建智能体配置 config AgentConfig( name我的助手, description一个能搜索和计算的智能助手, llmllm, tools[search_web, calculator], # 注册工具 memory_enabledTrue, # 启用记忆 streamingTrue, # 启用流式输出 ) # 3. 实例化智能体 agent Agent(config) # 4. 运行对话 print(智能体已启动输入 quit 退出。) while True: try: user_input input(\n你: ) if user_input.lower() quit: break print(助手: , end, flushTrue) # 调用智能体并处理流式响应 async for chunk in agent.run_stream(user_input): print(chunk, end, flushTrue) # 逐块打印流式输出 print() # 换行 except KeyboardInterrupt: print(\n再见) break if __name__ __main__: asyncio.run(main())这段代码展示了一个完整的交互循环。agent.run_stream方法会处理整个ReAct循环将用户输入和记忆上下文发送给LLMLLM可能返回思考过程或工具调用请求框架解析后执行对应工具将结果作为观察再次发送给LLM直到LLM决定生成最终回复并通过流式的方式返回。4. 深入核心记忆与知识库的实现一个只会回答单轮问题的智能体是“健忘的”价值有限。yu-ai-agent这类框架的核心竞争力之一就在于其对记忆和知识库的良好支持。4.1 对话记忆的实现机制记忆系统通常分为两层短期/会话记忆保存在内存中用于维护当前对话窗口的上下文。这通常通过维护一个消息列表如[system, user, assistant, tool, user...]来实现。框架需要智能地管理这个列表的长度以防超出模型的上下文窗口限制。常见的策略是“滑动窗口”或“总结压缩”即当对话过长时将早期的消息进行摘要保留摘要而非原始消息。长期记忆存储在外部数据库如Redis、SQLite或向量数据库如Chroma、Weaviate、Milvus中。这用于跨会话的记忆留存和基于语义的检索。在yu-ai-agent中你可能通过配置来启用和定制记忆from yu_ai_agent.memory import ConversationBufferMemory, VectorStoreMemory # 配置混合记忆 config AgentConfig( # ... 其他配置 memoryConversationBufferMemory(max_tokens2000), # 短期记忆最多2000个token long_term_memoryVectorStoreMemory( vector_storechroma, # 使用Chroma向量库 persist_directory./memory_db, # 持久化目录 embedding_modeltext-embedding-3-small, # 嵌入模型 ), memory_retriever_k3, # 每次从长期记忆中检索3条最相关的记录 )当用户提问时智能体不仅能看到最近的对话框架还会自动从长期记忆中检索与当前问题语义相关的历史片段一并作为上下文提供给LLM从而实现真正“有记忆”的对话。4.2 知识库的构建与检索知识库功能让智能体能够“阅读”你自己的文档如PDF、Word、Markdown文件并回答问题。其实现流程是标准化的加载与分割使用文档加载器如PyPDFLoader,UnstructuredFileLoader读取文件然后用文本分割器如RecursiveCharacterTextSplitter将长文档切成语义连贯的小块。向量化与存储使用嵌入模型将每个文本块转换为向量一组数字然后存入向量数据库并建立索引。检索当用户提问时将问题也转换为向量在向量数据库中搜索最相似的几个文本块即“相似性检索”。增强生成将检索到的相关文本块作为上下文与原始问题一起提交给LLM要求其基于此上下文生成答案。这就是所谓的“检索增强生成RAG”。在框架中这一过程可能被封装成一个高级的KnowledgeBaseAgent或一组便捷的APIfrom yu_ai_agent.knowledge_base import KnowledgeBase # 初始化知识库 kb KnowledgeBase( vector_storechroma, embedding_modellocal:/path/to/your/model, # 也支持本地嵌入模型 persist_directory./kb_db ) # 向知识库添加文档 kb.add_documents([/path/to/your/document.pdf]) # 创建一个基于知识库的智能体 kb_agent Agent( configAgentConfig(llmllm, ...), knowledge_basekb # 关联知识库 ) # 提问智能体会自动检索知识库并回答 answer await kb_agent.run(请总结一下文档中关于项目架构的部分。)注意事项知识库的效果严重依赖于文本分割的质量和嵌入模型的能力。分割得太碎会丢失上下文太大则检索不精准。嵌入模型如果对专业领域语义理解不好检索结果也会南辕北辙。通常需要根据你的文档类型技术手册、法律条文、自由文体调整分割策略和尝试不同的嵌入模型。5. 高级特性与定制化开发当你熟悉了基础用法后就会开始思考如何定制和扩展框架以满足更复杂的需求。yu-ai-agent作为一个框架应该提供了相应的扩展点。5.1 自定义工具与复杂工作流除了简单的函数工具现实中的任务往往需要多个工具按特定顺序协作或者工具本身包含复杂的内部逻辑。框架可能支持“工作流Workflow”或“规划器Planner”的概念。例如创建一个“数据分析报告生成器”工具工具内部先调用query_database工具获取数据。然后调用python_executor工具进行数据清洗和可视化。最后调用generate_report工具可能结合LLM撰写文字报告。这要求框架支持工具的“链式调用”或“子任务分解”。你可能需要继承框架提供的BaseTool类重写其_run方法在其中实现复杂的控制逻辑。from yu_ai_agent.tools import BaseTool from pydantic import BaseModel class DataAnalysisInput(BaseModel): query_sql: str chart_type: str line class DataAnalysisTool(BaseTool): name data_analysis description 执行数据分析并生成图表报告 args_schema DataAnalysisInput async def _run(self, query_sql: str, chart_type: str): # 1. 执行SQL查询这里假设依赖另一个工具或直接连接 data await self.execute_sql(query_sql) # 2. 生成图表 chart_path await self.generate_chart(data, chart_type) # 3. 分析数据并生成洞察文本 insight await self.llm_analyze(data) # 可能内部调用另一个LLM return { data_summary: str(data.describe()), # 模拟数据摘要 chart_path: chart_path, insight: insight } async def execute_sql(self, sql: str): # 模拟数据库查询 pass # ... 其他辅助方法5.2 集成外部系统与回调企业级应用通常需要将智能体嵌入到现有系统中这就涉及到与外部系统的集成和状态回调。框架应该提供完善的生命周期钩子Hooks或回调函数Callbacks。日志与监控你可能需要记录每一次LLM调用、工具执行和最终输出的详细日志用于分析和审计。权限与验证在工具调用前验证当前用户是否有权限执行该操作如删除数据、访问敏感信息。流式中间结果除了最终的文本流你可能还想实时获取智能体的“思考过程”或“工具调用状态”以便在前端展示一个更丰富的交互界面。from yu_ai_agent.callbacks import BaseCallbackHandler class MyCustomCallback(BaseCallbackHandler): async def on_llm_start(self, serialized, prompts, **kwargs): print(fLLM开始思考输入提示词: {prompts[:100]}...) async def on_tool_start(self, serialized, input_str, **kwargs): print(f工具开始执行: {serialized[name]}, 输入: {input_str}) async def on_tool_end(self, output, **kwargs): print(f工具执行结束输出: {output[:200]}...) async def on_agent_action(self, action, **kwargs): # action 可能包含 thought, tool, tool_input 等信息 print(f智能体决定采取行动: {action}) # 在配置中注入回调 config AgentConfig( # ... callbacks[MyCustomCallback()] )通过自定义回调你可以将智能体的内部状态无缝对接到你的日志系统、监控面板或实时前端推送如WebSocket。6. 部署与性能优化考量开发完成后下一步就是部署。一个AI智能体框架的部署比简单的Web API要复杂一些因为它涉及有状态的对话、可能长时间运行的任务以及LLM API的调用延迟和成本。6.1 部署模式选择Web API服务这是最常见的模式。使用FastAPI、Flask等框架将智能体封装成RESTful API或WebSocket端点。框架本身可能提供了现成的部署脚本或Dockerfile。# 假设框架提供了启动命令 uvicorn yu_ai_agent.server:app --host 0.0.0.0 --port 8000你需要处理并发请求、会话隔离每个用户一个独立的会话/记忆、请求队列和超时控制。Serverless函数对于轻量级、无状态或短会话的任务可以部署到云函数如AWS Lambda Vercel Edge Functions。挑战在于冷启动延迟和运行时长限制需要精心设计会话存储使用外部数据库和优化代码包大小。长运行后台进程对于需要持续监听消息队列如RabbitMQ, Kafka或定时触发的自动化任务智能体可以作为一个常驻的后台进程运行。6.2 关键性能优化点LLM调用优化缓存对相似的LLM提示词和结果进行缓存可以大幅减少API调用次数和成本。可以使用Redis或Memcached。批处理如果有多条独立的生成任务可以考虑将它们批量发送给LLM API如果API支持以提高吞吐量。模型选择在效果和成本间权衡。复杂的推理任务用大模型如GPT-4简单的分类或提取任务用小模型如GPT-3.5-Turbo或本地模型。向量检索优化索引选择向量数据库有不同的索引类型如HNSW, IVF。根据数据规模和查询延迟要求选择合适的索引。分层检索先使用关键词如BM25快速筛选出一批候选文档再使用向量检索进行精排兼顾速度和精度。预过滤在向量检索前先根据元数据如文档类型、创建时间进行过滤缩小搜索范围。记忆管理优化选择性记忆不是所有对话都需要存入长期记忆。可以设定规则只将包含特定关键词或用户标记为重要的对话进行存储和向量化。记忆总结对于冗长的对话定期触发LLM对之前的对话内容进行总结用总结文本替代原始长文本存入记忆节省存储空间并提升后续检索效率。实操心得在部署前务必进行压力测试。模拟大量并发用户与智能体对话观察内存使用、响应延迟和LLM API的消耗。你会发现上下文长度是成本和延迟的主要驱动因素。积极管理上下文及时清理、总结是生产环境中控制成本和保证性能的关键手段。7. 常见问题排查与调试技巧在实际开发和运行yu-ai-agent这类项目时你肯定会遇到各种问题。下面是一些常见坑点和排查思路。7.1 智能体不调用工具或调用错误症状智能体一直用自然语言回答而不是调用你定义的工具。排查检查工具描述这是最常见的原因。LLM完全依赖函数名和描述来决定是否调用。确保你的工具描述清晰、准确并且与用户可能提出的问题在语义上匹配。可以尝试让LLM例如在Playground中根据你的工具描述生成几个可能的用户提问看看是否对齐。检查LLM温度Temperature温度参数设置过高如 0.7会增加输出的随机性可能导致LLM“创造性”地忽略工具调用。对于需要稳定工具调用的场景将温度调低如0.1-0.3。查看系统提示词System Prompt框架会给LLM一个默认的系统提示词指导其使用工具。检查这个提示词是否被覆盖或修改得不恰当。你可以在回调中打印出完整的请求消息看看系统指令是否包含“你可以使用以下工具”之类的引导。验证工具参数Schema确保工具的参数定义使用Pydantic模型是正确且完整的。LLM有时会因为参数类型不明确比如stringvsinteger而拒绝调用。7.2 流式输出中断或不流畅症状流式响应时断时续或者前端收到的是整个大块而不是逐字输出。排查网络与缓冲检查服务器到LLM API如OpenAI的网络稳定性。同时检查你的服务端和客户端代码确保没有在中间层进行不必要的缓冲。在服务端使用真正的异步流式转发在客户端使用SSEServer-Sent Events或WebSocket来接收数据块。框架流式处理逻辑深入阅读框架中处理流式响应的代码。有些框架在处理工具调用时可能会等待整个工具执行完毕后才继续流式输出LLM的后续思考这会导致“卡顿”。理想的流式应该在LLM生成思考文本时就开始推送工具调用期间暂停工具返回后继续推送后续思考。超时设置检查LLM客户端和服务器的超时设置。流式连接长期没有数据流动可能会被代理服务器或负载均衡器切断。7.3 记忆检索效果不佳症状智能体记不住之前说过的话或者从知识库检索到的内容不相关。排查嵌入模型不同的嵌入模型在不同领域如通用文本、代码、多语言的表现差异巨大。如果你处理的是中文技术文档使用通用的text-embedding-ada-002效果可能不如专门针对中文优化的模型如BGE、M3E系列。尝试更换或微调嵌入模型。文本分割策略尝试不同的分割器RecursiveCharacterTextSplitter,TokenTextSplitter和参数chunk_size,chunk_overlap。对于结构清晰的文档如Markdown可以尝试按标题分割。检索策略除了简单的向量相似度similarity_search可以尝试max_marginal_relevance_search来平衡相关性和多样性或者加入关键词匹配作为混合检索。元数据过滤在存储文档块时为其添加元数据如来源文件、章节标题。检索时可以先根据用户问题中的关键词对元数据进行过滤再进行向量检索提高精度。7.4 部署后并发能力差症状单个用户访问正常多个用户同时访问时响应变慢甚至出错。排查会话隔离确保每个用户的对话状态记忆是隔离的。检查框架是否使用了全局变量来存储会话这在多线程/异步环境下是致命的。正确的做法是使用基于会话ID的存储后端如Redis。LLM API限速所有用户共享同一个LLM API Key会触发API的速率限制RPM/TPM。需要在框架层面实现一个请求队列或令牌桶对发往LLM API的请求进行限流和排队或者为不同优先级的用户配置不同的API Key池。数据库连接池如果使用了关系型数据库或向量数据库确保创建了连接池而不是为每个请求新建连接。异步处理确保整个处理链路从接收请求、调用LLM、执行工具到返回响应都是异步的使用asyncio避免阻塞事件循环。调试这类复杂系统日志是最好朋友。务必在关键节点LLM输入输出、工具调用前后、记忆存储检索打上详细的日志并结构化输出如JSON格式这样当问题发生时你可以像查看飞行数据记录器一样回溯整个智能体的“思考”过程快速定位问题根源。

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