基于LLM的聊天机器人开发框架:架构设计与工程实践

news2026/5/1 16:19:20
1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目叫zhaoyingjun/chatbot。乍一看名字你可能会觉得这又是一个基于某个大语言模型API的简单封装或者是一个玩具级别的对话应用。但当我真正点进去把代码拉下来跑了一遍并且仔细研究了它的架构之后我发现这个项目远不止一个“聊天机器人”那么简单。它更像是一个精心设计的、面向开发者的对话应用开发框架和最佳实践样板。如果你正打算基于大语言模型LLM构建一个具备复杂交互逻辑、需要对接多种工具、并且对用户体验有要求的应用那么这个项目提供的思路和代码结构绝对值得你花时间深入研究。这个项目的核心价值在于它没有停留在“调用API返回回答”的层面而是系统地解决了构建一个实用聊天机器人时会遇到的一系列工程问题如何优雅地管理对话历史如何集成不同的工具比如搜索、计算、代码执行如何设计一个前后端分离的、响应式的用户界面如何处理流式输出以提升用户体验以及如何让整个架构足够清晰便于后续扩展和维护。它用实际代码给出了一个经过思考的答案这种“开箱即用”的完整解决方案对于想快速上手LLM应用开发的团队或个人来说节省了大量的前期设计和踩坑时间。2. 技术架构深度解析2.1 整体架构设计思路zhaoyingjun/chatbot项目采用了一个非常经典且实用的前后端分离架构。这种选择并非偶然而是基于现代Web应用开发和LLM应用特点的深思熟虑。前端部分项目使用了React和Vite构建。React的组件化特性非常适合构建复杂的交互界面比如聊天消息列表、输入框、工具调用状态显示等。Vite则提供了极快的开发服务器启动速度和高效的热更新极大地提升了开发体验。前端负责所有与用户交互相关的逻辑渲染对话气泡、管理本地输入状态、通过WebSocket或Server-Sent Events (SSE) 接收服务器的流式响应并实时更新到界面上。这种设计将视图层彻底解耦使得前端可以独立迭代比如未来替换成Vue或Svelte理论上也不会影响后端核心逻辑。后端部分从代码结构看很可能是一个基于Node.js(可能是Express或Koa) 或Python(可能是FastAPI或Flask) 的服务。它的核心职责是作为“智能中枢”或“编排层”。它并不直接包含LLM模型而是通过API调用云端的大模型服务如OpenAI的GPT系列、Anthropic的Claude或国内的一些大模型平台。后端需要处理几个关键任务接收前端传来的用户消息和对话历史根据会话状态和用户意图决定调用哪些工具Tool/Function将用户消息、历史上下文和工具调用描述整合成符合模型要求的Prompt调用LLM API并处理返回结果如果模型返回了工具调用请求则后端去执行对应的工具函数如查询数据库、调用第三方API、执行计算并将工具执行结果再次发送给LLM形成多轮对话直至得到最终答案最后将最终答案或流式生成的token返回给前端。这种架构的优势非常明显。首先安全性敏感的API密钥和工具调用权限都保留在后端前端无法触及避免了密钥泄露的风险。其次灵活性可以轻松切换不同的LLM提供商只需修改后端的适配层代码前端无感知。再者可扩展性新的工具可以以后端插件的形式添加复杂的业务逻辑也可以在后端集中处理。2.2 核心模块拆解一个健壮的聊天机器人光有架构还不够关键在模块设计。这个项目清晰地划分了几个核心模块对话管理模块这是聊天机器人的“记忆”系统。它不能只是简单地把所有历史对话文本拼接起来因为LLM有上下文长度限制。这个模块需要智能地管理对话历史可能包括对长对话进行摘要压缩、只保留最近N轮对话、或者根据相关性筛选历史消息。项目中可能会实现一个ConversationManager类负责消息的存储、修剪和格式化确保每次请求给LLM的上下文都是最有效且不超长的。工具调用模块这是让聊天机器人从“聊天”走向“有用”的关键。项目可能定义了一个工具注册机制。每个工具都是一个独立的函数并附有一段清晰的自然语言描述比如“get_weather根据城市名获取当前天气情况”。当LLM认为需要调用工具时它会返回一个结构化的请求遵循OpenAI的Function Calling格式或类似规范。后端收到后解析这个请求找到对应的工具函数传入参数执行然后将执行结果一段文本返回给LLM。这个模块的设计要点在于工具描述的准确性和函数执行的可靠性。提示词工程模块Prompt是驱动LLM的“燃料”。项目里应该会有一个专门的模块或配置文件来管理系统提示词System Prompt和用户消息的组装逻辑。系统提示词定义了机器人的角色、能力范围和行为规范。好的系统提示词能极大地约束模型输出使其更符合应用场景。这个模块可能会支持提示词模板允许根据不同的对话场景动态注入变量。流式响应处理模块为了用户体验现代聊天应用普遍支持打字机式的流式输出。这意味着后端不能等LLM生成完整答案后再一次性返回而需要以SSE或WebSocket的形式将生成的token逐个或逐批推送到前端。这个模块需要处理好与LLM API的流式接口对接以及与前端的流式协议通信同时还要保证在传输过程中对话境和工具调用的逻辑不受影响。3. 关键实现细节与实操要点3.1 对话历史的管理与优化直接无脑拼接所有历史对话是最简单的做法但也是最容易出问题的。随着对话轮数增加上下文会迅速膨胀导致API调用成本飙升、响应速度变慢甚至可能触及模型的上文窗口限制丢失最早的关键信息。在这个项目中一个更优的解决方案是实现对话历史摘要或滑动窗口机制。例如可以设定一个阈值当对话token数超过一定数量比如GPT-4 Turbo 128K上下文的一半就触发摘要过程。将较早的对话内容用一个更小的模型如GPT-3.5-turbo进行总结生成一段浓缩的摘要文本。之后的新对话将基于“摘要 最近若干轮完整对话”来进行。这样既保留了长期记忆的精华又为最新的交互留出了充足空间。在代码实现上可能会有一个MemoryManager类。它内部维护两个列表一个是summary_messages存放摘要一个是recent_messages存放最近对话。其get_context_for_llm()方法会负责将这两部分组合成最终的上下文列表。当recent_messages的token总数超标时调用一个condense_history()方法将一部分旧消息生成摘要并入summary_messages然后从recent_messages中移除。实操心得摘要的提示词Prompt设计至关重要。你需要明确告诉总结模型“请将以下对话浓缩成一个简短的段落重点保留用户的核心需求、已确认的事实和已做出的决策忽略寒暄和重复内容。” 多测试几次调整提示词直到生成的摘要能准确代表原对话的精髓。3.2 工具Tools/Function Calling的集成艺术工具调用是LLM应用的大脑到手脚的延伸。项目的工具集成方式很可能采用了类似LangChain Tools或自定义装饰器的模式。首先需要定义一个工具规范。每个工具需要提供name工具名、description给LLM看的描述、parameters参数JSON Schema以及func实际执行的函数。例如一个查询天气的工具# 伪代码示例 tool( nameget_weather, description获取指定城市的当前天气状况。, parameters{ type: object, properties: { city: {type: string, description: 城市名称例如北京、上海} }, required: [city] } ) async def get_weather(city: str): # 调用第三方天气API api_key os.getenv(WEATHER_API_KEY) response await call_weather_api(api_key, city) return f{city}的天气是{response.condition}温度{response.temp}摄氏度。后端在启动时会收集所有被tool装饰的函数将它们的信息主要是description和parameters在每次请求LLM时作为“可用工具列表”的一部分发送给模型。当LLM决定调用工具时它会返回一个标准的tool_calls字段。后端路由需要识别这个字段找到匹配的工具函数传入解析后的参数执行它并将执行结果以特定格式如tool_call_id 结果追加到对话历史中然后再次请求LLM让LLM基于工具结果生成面向用户的回答。注意事项工具描述要尽可能精确。模糊的描述会导致LLM错误地调用工具或传错参数。例如“获取信息”就太宽泛而“根据股票代码查询实时股价”就明确得多。另外工具函数的执行一定要做好错误处理try-catch并将错误信息友好地返回给LLM让它能向用户解释出了什么问题而不是直接崩溃。3.3 流式输出与前端实时渲染流式输出是提升用户体验的利器。实现它需要前后端配合。后端需要调用LLM API的流式接口如OpenAI API设置streamTrue。这会返回一个事件流Event Stream而不是一个完整的JSON响应。后端需要逐块读取这个流解析出有效的token或delta增量内容然后立即通过SSEContent-Type: text/event-stream或WebSocket发送到前端。发送的数据格式可以很简单比如data: {token: 你}\n\n。前端需要建立一个EventSource连接用于SSE或WebSocket连接来监听这些事件。每收到一个事件就解析出新的token并将其追加到当前正在回复的消息内容后面。这里有一个细节为了确保流畅的“打字机”效果前端更新的频率要合适。不宜每收到一个token就更新一次DOM性能开销大也不宜积攒太久再更新不流畅。通常可以设置一个简单的缓冲区和定时器每收到一批token先存入缓冲区然后用requestAnimationFrame或一个固定间隔如50-100毫秒的定时器将缓冲区内容更新到UI上。踩坑记录在实现流式传输时务必注意连接保活和错误重连。网络是不稳定的。前端需要监听连接的错误和关闭事件并实现自动重连逻辑。同时后端也要处理客户端意外断开的情况及时关闭昂贵的LLM API流式连接避免资源浪费。一个常见的做法是前端在建立连接时发送一个唯一的会话ID后端将此ID与LLM连接关联并在检测到前端断开时清理资源。4. 部署与性能优化实战4.1 从开发到生产环境部署本地跑通只是第一步让服务稳定可靠地运行在线上才是挑战。这个项目很可能提供了Docker相关的配置文件如Dockerfile和docker-compose.yml这是现代化部署的起点。容器化部署使用Docker可以将应用及其所有依赖Node.js/Python版本、系统库、环境变量打包成一个标准镜像。这保证了开发、测试、生产环境的一致性。Dockerfile通常会采用多阶段构建以减小最终镜像的体积。例如前端构建阶段使用Node镜像生成静态文件后端阶段使用Python或Node镜像复制前端产物和后端代码安装依赖。使用反向代理在生产环境中不应该直接用Node.js或Python应用服务器如Express或FastAPI监听公网端口。应该使用Nginx或Caddy作为反向代理。它们能处理静态文件前端构建后的HTML、JS、CSS、提供SSL/TLS终止HTTPS、进行负载均衡如果你部署了多个后端实例、以及设置缓冲和超时这些功能对Web应用至关重要。一个简单的Nginx配置片段可能如下server { listen 80; server_name your-chatbot-domain.com; # 重定向到HTTPS return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name your-chatbot-domain.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; # 前端静态文件 location / { root /path/to/chatbot-frontend-dist; try_files $uri $uri/ /index.html; } # 后端API代理 location /api/ { proxy_pass http://localhost:3001; # 假设后端运行在3001端口 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 流式响应端点代理 (如果需要) location /api/chat/stream { proxy_pass http://localhost:3001; proxy_buffering off; # 关键关闭代理缓冲否则流式响应会失效 proxy_cache off; proxy_set_header Connection ; proxy_http_version 1.1; chunked_transfer_encoding off; proxy_read_timeout 3600s; # 长连接超时时间 } }进程管理对于Node.js或Python后端需要使用进程管理工具来保证其持续运行并在崩溃后自动重启。PM2对于Node.js或Supervisor/Systemd通用是常见选择。它们还能帮你管理日志、监控资源占用。4.2 性能与成本优化策略LLM应用的成本主要来自API调用尤其是使用GPT-4这类高级模型时。性能则关乎用户体验。缓存策略对于某些常见、结果相对固定的查询可以引入缓存。例如如果机器人集成了知识库问答对于相同的问题可以直接返回缓存答案无需再次请求LLM。可以使用Redis作为缓存层。键可以是用户问题的哈希值值可以是完整的回答。需要为缓存设置合理的过期时间TTL。模型分级调用并非所有任务都需要最强大、最昂贵的模型。可以设计一个路由策略简单的问答、摘要、文本润色使用成本较低的模型如GPT-3.5-turbo复杂的推理、代码生成、创意写作再调用GPT-4。这需要根据用户问题的意图分类来实现。异步与非阻塞处理后端服务在处理LLM请求时尤其是流式请求是I/O密集型的大部分时间在等待网络响应。务必确保你的后端框架和代码是异步的如使用Node.js的async/awaitPython的asyncio。这能让单个服务进程同时处理多个并发请求大大提高资源利用率。避免在请求处理线程中进行同步的、耗时的操作如同步的文件读写、复杂的CPU计算这些会阻塞整个事件循环。监控与告警上线后必须建立监控。关键指标包括API调用延迟、每秒请求数QPS、错误率、不同模型的Token消耗量。可以使用像Prometheus和Grafana这样的组合来收集和可视化指标。设置告警规则例如当错误率超过5%或平均响应时间超过10秒时通过邮件或Slack通知开发团队。5. 扩展方向与高级玩法5.1 集成知识库与RAG基础版的聊天机器人只能基于其预训练知识和实时工具调用进行回答。要让它成为某个垂直领域的专家就必须为其注入专有知识。这就是检索增强生成RAG的用武之地。你可以扩展这个项目加入一个RAG模块。流程如下知识库构建将你的专有文档PDF、Word、Markdown、网页进行切片Chunking转换成文本片段。向量化使用嵌入模型Embedding Model如OpenAI的text-embedding-3-small将这些文本片段转换成高维向量。存储将这些向量及其对应的原文存储到向量数据库Vector Database中如Pinecone、Chroma、Qdrant或Weaviate。检索当用户提问时用同样的嵌入模型将问题转换成向量然后在向量数据库中搜索与之最相似的几个文本片段Top-K。增强提示将检索到的相关文本片段作为上下文和用户问题一起组装成新的Prompt发送给LLM。LLM就能基于你提供的专有知识来生成更准确、更相关的回答。在zhaoyingjun/chatbot项目中集成RAG意味着要新增一个RetrievalService。它会在对话链中被调用用户问题先进入检索服务拿到相关上下文后再连同问题和历史对话一起发送给LLM处理。5.2 实现多模态能力当前的聊天机器人可能只处理文本。但未来的交互是多模态的。你可以扩展它使其支持图片理解用户上传一张图片机器人能描述图片内容、回答关于图片的问题。这需要集成支持视觉的大模型如GPT-4V、Claude 3后端需要处理文件上传将图片转换成Base64编码或传递图片URL给模型API。文件处理用户上传PDF、Word、Excel文件机器人能读取其中内容并进行分析总结。这需要在后端集成文件解析库如PyPDF2、python-docx、pandas先将文件内容提取为文本再交给LLM处理。语音交互支持语音输入和输出。前端可以使用浏览器的Web Speech API或第三方SDK进行语音识别STT将语音转为文本后发送给后端。后端生成文本回复后再通过语音合成TTS服务转为语音流式传回前端播放。5.3 构建智能体Agent工作流这是更高级的玩法让聊天机器人从一个“问答机”升级为一个能自主完成复杂任务的“智能体”。智能体可以自我规划、调用工具、评估结果、并循环执行直到任务完成。例如用户说“帮我分析一下上个月我们产品在社交媒体上的口碑并写一份总结报告。” 这个任务可以分解为规划智能体LLM首先规划步骤a) 从社交媒体API获取上个月的数据b) 进行情感分析c) 提取关键主题和反馈d) 撰写报告。执行智能体依次调用对应的工具fetch_social_media_data-sentiment_analysis-extract_key_themes。观察每个工具的执行结果都反馈给智能体。循环智能体判断是否完成了所有步骤或者中间结果是否需要调整计划然后继续执行直到最终调用generate_report工具产出报告。在项目中实现智能体意味着需要构建一个更复杂的控制循环ReAct模式是一个经典参考并设计一套让LLM能进行任务分解和状态判断的提示词。这将是项目从“工具调用”迈向“自主智能”的关键一步。6. 常见问题排查与调试技巧在实际开发和运行中你肯定会遇到各种问题。这里记录一些典型场景和排查思路。问题1LLM不调用工具或者总是调用错误的工具。排查思路检查工具描述这是最常见的原因。打开调试日志查看发送给LLM的“可用工具列表”。确保每个工具的description和parameters描述清晰、无歧义、且与函数实际功能完全匹配。描述太短或太模糊模型无法理解何时该用它。检查系统提示词系统提示词中是否明确鼓励或指导模型使用工具例如加入“如果你需要获取实时信息或进行计算请使用我为你提供的工具。”这样的指令。调整温度参数过高的temperature参数会增加输出的随机性可能导致工具调用不稳定。对于需要精确工具调用的场景可以尝试将其调低如0.1或0.2。提供少量示例在系统提示词或对话历史中提供一两个用户提问和正确调用工具的示例Few-shot Learning能显著提升模型调用工具的准确性。问题2流式输出在前端卡顿、中断或不显示。排查思路检查网络代理和缓冲如前面Nginx配置强调的对于流式端点/api/chat/stream必须设置proxy_buffering off;和proxy_cache off;。任何中间代理包括云服务商的负载均衡器的缓冲都会破坏流式传输。检查后端响应头后端SSE响应必须包含正确的头Content-Type: text/event-stream、Cache-Control: no-cache、Connection: keep-alive。前端连接稳定性检查前端EventSource或WebSocket的代码是否实现了错误监听和重连机制。在浏览器开发者工具的“网络”Network标签页中查看对stream端点的请求类型应该是“EventStream”你可以看到数据分块到达的情况。后端LLM API连接确保后端到LLM供应商如OpenAI的网络连接稳定且延迟较低。不稳定的网络会导致流式数据块传输中断。问题3对话历史过长导致API调用失败或响应极慢。排查思路确认上下文长度首先明确你使用的模型上下文窗口有多大如GPT-4 Turbo是128K但要注意输入和输出共享这个窗口。计算你发送的整个Prompt系统消息历史对话工具定义用户问题的token数是否接近或超过限制。可以使用模型的tiktoken库或其他tokenizer进行精确计算。实施历史裁剪立即实施前面提到的对话历史摘要或滑动窗口策略。不要发送全部历史。优化工具定义工具列表的描述也会占用大量token。如果工具很多可以考虑动态发送工具只发送与当前对话可能相关的工具描述而不是每次都发送全部。压缩系统提示词在保证效果的前提下精简系统提示词移除不必要的叙述。问题4部署后服务内存持续增长最终崩溃。排查思路检查内存泄漏在Node.js中可以使用--inspect参数启动然后用Chrome DevTools的Memory面板抓取堆快照进行分析。在Python中可以使用objgraph或tracemalloc模块。常见泄漏点包括未正确关闭的数据库连接、缓存对象无限增长、全局变量意外累积数据。流式连接未关闭确保每一个到LLM API的流式请求在客户端断开连接后后端都能正确地关闭对应的请求和响应流。未关闭的连接会一直占用内存。对话历史管理如果每个会话的历史都永久存储在服务器内存中并发用户一多内存必然暴涨。确保历史记录有存储上限如只保留最近100条消息并且将会话数据持久化到数据库如Redis、PostgreSQL中而不是一直放在内存里。对于长时间不活动的会话应该设置过期清理机制。问题5工具执行失败但错误信息对用户不友好。排查思路后端完善错误处理在工具函数内部一定要用try...except包裹核心逻辑。捕获异常后不要返回原始的、包含技术细节的异常信息给LLM。而是应该生成一段对用户友好的、解释性的文本并附带一些可供排查的线索仅限开发环境。例如不要返回“数据库连接失败TimeoutError”而是返回“查询服务暂时不可用请稍后再试。如果问题持续请联系管理员。”设计错误处理流程当工具执行失败后是让LLM根据错误信息重新尝试还是直接告知用户失败这需要在编排逻辑中设计好。一个稳健的做法是将工具执行错误也作为一种“结果”返回给LLM让LLM决定如何向用户传达通常LLM能组织出更自然的语言。日志记录所有工具调用和错误都必须记录到日志系统如ELK Stack或云日志服务中并包含详细的请求ID、用户ID、参数和错误堆栈方便后端排查根本原因。

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