基于Flask与Vercel的ChatGPT Line机器人开发与部署指南

news2026/5/8 15:36:37
1. 项目概述一个部署在Vercel上的Python Flask ChatGPT Line机器人最近在折腾聊天机器人发现了一个挺有意思的项目用Python Flask框架把ChatGPT的能力集成到Line一款流行的即时通讯应用里并且直接部署在Vercel这个无服务器平台上。这个组合听起来就挺“现代”的把当下最火的AI大模型、流行的通讯工具和前沿的云部署方式揉在了一起。简单来说这个项目就是一个“桥梁”。它的一端连接着OpenAI的ChatGPT API另一端连接着Line的官方消息接口。当用户在Line上给你的机器人账号发消息时这个消息会先被发送到你在Vercel上部署的这个Flask应用。Flask应用收到消息后把它转发给ChatGPT拿到AI的回复再原路返回最终显示在用户的Line聊天窗口里。整个过程对用户是透明的感觉就像是在和一个聪明的、无所不知的Line好友聊天。这个项目特别适合谁呢首先是对AI应用开发感兴趣的开发者尤其是想快速验证一个AI聊天机器人想法的人。Vercel的免费额度对于初期原型验证非常友好。其次是那些有社群运营、客服自动化或者个人助理需求的个人或小团队。你不需要自己维护服务器也不需要处理复杂的网络配置就能拥有一个7x24小时在线的智能客服。最后对于学习Python后端开发和云服务部署的新手来说这也是一个绝佳的练手项目涵盖了Webhook、API调用、无服务器部署等多个实用技能点。2. 项目整体设计与思路拆解2.1 核心架构事件驱动的Webhook模型这个项目的核心架构采用了典型的“事件驱动”Webhook模型。理解这个模型是理解整个项目如何运作的关键。为什么是WebhookLine官方为机器人开发者提供了两种接收用户消息的方式一种是轮询Polling即你的服务器不断主动向Line服务器询问“有没有新消息”另一种就是Webhook回调即由Line服务器在收到用户发给机器人的消息时主动向你预设的一个URL地址发送一个HTTP POST请求通知你“消息来了”。Webhook方式更高效、实时也是Line官方推荐的主流方式。我们的Flask应用本质上就是一个Webhook的接收端点Endpoint。数据流闭环整个数据流形成了一个清晰的闭环用户触发用户在Line App中向你的机器人发送一条文本消息。Line推送Line平台服务器将这条消息包装成一个结构化的JSON事件通过HTTPS POST请求发送到你部署在Vercel上的Flask应用的特定路由例如/callback。应用处理Flask应用接收到请求解析JSON提取出用户消息文本。AI交互应用使用你的OpenAI API密钥将用户消息作为Prompt发送给ChatGPT API。获取回复等待并接收ChatGPT返回的文本回复。回传Line应用将AI回复文本通过调用Line的“回复消息API”发送回触发该事件的Line聊天会话。用户接收用户在他的Line App中看到机器人的回复。这个架构的巧妙之处在于“无状态”和“事件驱动”。我们的Flask应用不需要记住之前的对话除非你特意设计每次请求都是独立的。Vercel的无服务器函数Serverless Function特性完美契合了这种模式只有在有用户消息事件发生时Vercel才会启动或复用一个函数实例来处理请求完成后可能被回收非常节省资源。2.2 技术栈选型背后的考量为什么是Python Flask Vercel这个组合不是随意的每一环都有其实际考量。Python生态与效率的平衡Python是AI领域的第一语言OpenAI官方SDK (openai库) 对Python的支持是最完善、最稳定的。这避免了我们在其他语言中可能遇到的SDK不成熟或封装不全的问题。同时Python语法简洁开发效率高对于处理JSON、HTTP请求这类任务非常得心应手。Flask轻量灵活的微型框架相较于Django等“全家桶”式框架Flask是一个微型框架。它足够轻量没有太多预设的规则和结构让我们可以专注于核心的Webhook逻辑。对于这样一个功能单一主要就是一个接收POST请求的路由的应用来说Flask是绝佳选择它不会引入任何不必要的开销和复杂度。我们只需要定义一两个路由处理请求和响应即可。Vercel零运维的部署体验这是项目部署的关键。Vercel是一个针对前端和全栈应用的云平台其核心优势在于无服务器Serverless你无需关心服务器配置、系统维护、负载均衡。你只提交代码Vercel负责按需运行。极简部署与GitHub/GitLab等代码仓库无缝集成每次git push都能触发自动部署。免费的HTTPS证书Webhook要求端点必须是HTTPSVercel自动提供省去了申请和配置证书的麻烦。慷慨的免费额度对于个人项目或低流量应用Vercel的免费套餐完全够用包括每月100GB的带宽和足够多的函数调用次数。全球边缘网络部署的应用在全球多个边缘节点运行能保证Line服务器通常在日本调用时的低延迟。选择Vercel意味着你将部署和运维的复杂度降到了最低可以把全部精力放在业务逻辑开发上。Line Messaging API标准化的交互接口使用Line官方API是唯一正途。它提供了稳定、安全的消息收发通道支持文本、图片、贴图、富消息模板等多种消息类型。我们的项目主要利用其“回复消息”接口。通过官方API我们能确保机器人的功能稳定、合规并且能享受到Line平台未来的所有功能更新。3. 核心细节解析与实操要点3.1 环境变量与敏感信息管理这是项目安全性的基石。我们的代码中会涉及两个最高机密Line Channel Access Token和OpenAI API Key。绝对不能将它们硬编码在代码里然后上传到公开的Git仓库。为什么必须使用环境变量安全性避免密钥泄露。代码仓库可能公开或意外分享。灵活性在不同环境开发、测试、生产使用不同的密钥。符合12-Factor应用原则将配置存储在环境中。实操要点本地开发在项目根目录创建.env文件内容如下LINE_CHANNEL_ACCESS_TOKENYOUR_LINE_CHANNEL_ACCESS_TOKEN LINE_CHANNEL_SECRETYOUR_LINE_CHANNEL_SECRET OPENAI_API_KEYsk-your-openai-api-key然后在Python代码中使用os.getenv(‘KEY_NAME’)来读取。记得将.env添加到.gitignore文件中确保它不会被提交。Vercel部署在Vercel项目的设置Settings- 环境变量Environment Variables页面添加上述三个变量。Vercel会在运行你的应用时自动注入这些环境变量。关于LINE_CHANNEL_SECRET这个密钥用于验证Webhook请求是否真的来自Line服务器防止恶意伪造请求。在代码中我们需要用它来验证请求的签名Signature。注意.env文件中的示例密钥是无效的你需要替换成自己在Line Developers和OpenAI平台申请的真实密钥。申请过程比较简单Line Developers需要创建提供商Provider、频道Channel类型选择“Messaging API”。OpenAI平台则需要注册账号并在API Keys页面创建密钥。3.2 Flask应用结构与路由设计一个清晰的应用结构能让代码更易维护。虽然项目不大但良好的习惯从小项目培养。典型的项目结构your-bot-project/ ├── app.py # 主应用文件 ├── requirements.txt # Python依赖列表 ├── vercel.json # Vercel部署配置文件 ├── .env # 本地环境变量.gitignore └── .gitignoreapp.py的核心结构from flask import Flask, request, abort, jsonify import os import openai from linebot import LineBotApi, WebhookHandler from linebot.exceptions import InvalidSignatureError from linebot.models import MessageEvent, TextMessage, TextSendMessage app Flask(__name__) # 从环境变量初始化配置 line_bot_api LineBotApi(os.getenv(‘LINE_CHANNEL_ACCESS_TOKEN’)) handler WebhookHandler(os.getenv(‘LINE_CHANNEL_SECRET’)) openai.api_key os.getenv(‘OPENAI_API_KEY’) # 根路由用于健康检查或展示信息 app.route(‘/‘, methods[‘GET’]) def index(): return ‘ChatGPT Line Bot is running!’ # 核心Line Webhook回调路由 app.route(‘/callback’, methods[‘POST’]) def callback(): # 获取请求头和签名 signature request.headers[‘X-Line-Signature’] # 获取请求体文本 body request.get_data(as_textTrue) app.logger.info(“Request body: ” body) try: # 关键步骤验证签名处理事件 handler.handle(body, signature) except InvalidSignatureError: # 签名验证失败拒绝请求 abort(400) # 处理成功返回OK给Line服务器 return ‘OK’ # 定义处理文本消息的事件处理器 handler.add(MessageEvent, messageTextMessage) def handle_message(event): # 获取用户发送的文本 user_message event.message.text # 调用ChatGPT获取回复 ai_response get_chatgpt_response(user_message) # 构造Line回复消息对象 reply_message TextSendMessage(textai_response) # 调用Line API回复用户 line_bot_api.reply_message(event.reply_token, reply_message) def get_chatgpt_response(prompt): # 调用OpenAI ChatGPT API response openai.ChatCompletion.create( model“gpt-3.5-turbo”, # 或 “gpt-4” messages[ {“role”: “system”, “content”: “你是一个乐于助人的助手。”}, # 系统指令设定AI角色 {“role”: “user”, “content”: prompt} ], max_tokens500, # 控制回复长度 temperature0.7, # 控制回复随机性 (0.0-1.0) ) return response.choices[0].message.content.strip() if __name__ “__main__”: app.run(debugTrue)路由设计解析app.route(‘/‘, methods[‘GET’]): 一个简单的根路径用于验证服务是否在线。Vercel在部署后或健康检查时会访问它。app.route(‘/callback’, methods[‘POST’]): 这是项目的心脏。所有Line服务器推送的消息事件都会发到这个端点。它做了三件事1) 获取签名和请求体2) 用handler.handle()验证并处理事件3) 返回状态码。handler.add(...): 这是Line SDK提供的事件监听装饰器。它指定当收到MessageEvent且消息类型是TextMessage时就触发handle_message函数。这种基于事件的处理方式非常清晰。3.3 与ChatGPT API的交互细节如何与ChatGPT对话是体现机器人“智能”的关键。我们使用的是OpenAI的ChatCompletion接口。get_chatgpt_response函数详解模型选择 (model):gpt-3.5-turbo是性价比最高的模型响应快、成本低。gpt-4能力更强但更贵、更慢。对于大多数聊天场景gpt-3.5-turbo足够。消息序列 (messages): 这是一个对话历史的列表。每个元素都是一个字典包含role(角色) 和content(内容)。角色有三种system: 系统指令用于设定AI的“人设”或行为准则。例如“你是一个幽默的聊天机器人。” 这条指令对整个对话有全局性影响。user: 用户说的话。assistant: AI之前的回复。 在我们的简单实现中每次请求都是独立的只包含一个系统消息和当前用户消息。如果你想实现“有记忆的对话”就需要在每次请求时将之前几轮的user和assistant消息也附加上去。最大令牌数 (max_tokens): 限制AI回复的最大长度。一个英文单词约等于1-2个token中文字符约1-2个token。500大约对应250-350个汉字对于单次回复比较合适。设置太低可能导致回复被截断。温度 (temperature): 控制回复的随机性和创造性。值越高接近1.0回复越多样、不可预测值越低接近0.0回复越确定、保守。对于一般聊天0.7是一个不错的平衡点。对于需要精确答案的客服场景可以调低到0.2或0.3。成本控制提示OpenAI API按token数量收费。gpt-3.5-turbo每1000个token费用很低但对于个人项目仍需注意设置合理的max_tokens。考虑实现一个简单的对话长度限制比如只保留最近10轮对话作为上下文避免因长对话消耗过多token。可以在代码中加入使用量日志方便监控。4. 实操过程与核心环节实现4.1 本地开发环境搭建与测试在将代码部署到云端之前在本地进行开发和测试是至关重要的。这能帮你快速迭代逻辑排查问题。步骤1创建虚拟环境与安装依赖强烈建议使用Python虚拟环境来隔离项目依赖。# 1. 创建项目目录并进入 mkdir chatgpt-line-bot cd chatgpt-line-bot # 2. 创建Python虚拟环境 (这里使用venv) python -m venv venv # 3. 激活虚拟环境 # 在 macOS/Linux 上 source venv/bin/activate # 在 Windows 上 # venv\Scripts\activate # 4. 安装核心依赖 pip install flask openai line-bot-sdk python-dotenvpython-dotenv库用于方便地从.env文件加载环境变量。步骤2编写核心代码与配置文件按照上一节的结构创建app.py和.env文件。确保.env中已填入正确的密钥。创建requirements.txt文件列出依赖以便Vercel识别Flask2.3.3 openai0.28.1 line-bot-sdk3.0.0 python-dotenv1.0.0步骤3使用ngrok进行本地Webhook测试Line服务器需要将一个公网可访问的HTTPS URL作为Webhook地址。在本地开发时我们可以使用ngrok工具将本机的localhost暴露成一个临时的公网地址。前往 ngrok 官网注册并下载客户端。安装后在终端运行ngrok authtoken YOUR_AUTH_TOKEN进行认证。运行ngrok http 5000(Flask默认运行在5000端口)。ngrok会生成一个如https://abc123.ngrok.io的转发地址。在Line Developers控制台将你的机器人的Webhook URL设置为https://abc123.ngrok.io/callback。在本地运行你的Flask应用python app.py。现在向你Line机器人的好友发送消息消息应该会通过ngrok转发到你的本地应用并收到ChatGPT的回复。实操心得ngrok的免费版每次重启都会改变域名需要重新去Line后台更新Webhook URL有点麻烦。在开发初期可以先用一个固定的测试逻辑比如直接回复“我收到了XXX”来验证Webhook连通性确认无误后再接入ChatGPT API这样可以分步排查问题。4.2 Vercel部署配置详解本地测试通过后就可以部署到Vercel了。Vercel的配置非常直观。步骤1创建vercel.json文件这是告诉Vercel如何运行你项目的关键配置文件。{ “builds”: [ { “src”: “app.py”, “use”: “vercel/python” } ], “routes”: [ { “src”: “/(.*)”, “dest”: “app.py” } ] }builds: 指定构建配置。vercel/python是Vercel官方提供的Python运行时它会自动识别requirements.txt并安装依赖。routes: 将所有HTTP请求都路由到我们的app.pyFlask应用。这是无服务器函数部署的常见模式。步骤2通过Git部署这是最推荐的方式可以实现持续部署。在项目根目录初始化Git仓库git init。将代码提交到本地仓库git add .然后git commit -m “Initial commit”。在GitHub或GitLab上创建一个新的远程仓库。将本地仓库关联到远程仓库并推送git remote add origin YOUR_REPO_URLgit push -u origin main。登录 Vercel 官网点击 “Add New…” - “Project”。导入你刚创建的Git仓库。在配置页面Vercel会自动检测到vercel.json和requirements.txt。最关键的一步是在 “Environment Variables” 部分添加你在.env文件中定义的那三个变量LINE_CHANNEL_ACCESS_TOKEN,LINE_CHANNEL_SECRET,OPENAI_API_KEY。点击 “Deploy”。Vercel会自动开始构建和部署。部署成功后Vercel会给你分配一个*.vercel.app的域名。记下这个域名例如https://your-bot-name.vercel.app。步骤3配置Line Webhook回到Line Developers控制台将Webhook URL更新为你的Vercel应用地址加上/callback路径即https://your-bot-name.vercel.app/callback。 记得点击“Verify”按钮进行验证。如果配置正确Line会显示“Success”。这证明你的Vercel应用已经可以正确响应Line的验证请求了。至此一个完整的、部署在云端的ChatGPT Line机器人就搭建完成了。你可以扫描你机器人的二维码在Line里添加它为好友开始对话。4.3 功能扩展实现对话记忆与上下文基础的机器人是“健忘”的每次问答都是独立的。要实现连续对话就需要给机器人加上“记忆”。核心思路在handle_message函数中不再只发送当前用户消息而是将本次对话的上下文历史记录一并发送给ChatGPT。实现方案 我们需要一个地方来存储每个用户的对话历史。由于Vercel是无状态的我们不能用内存变量。简单的方案是使用轻量级的键值数据库比如Vercel KV基于Redis或Vercel Postgres。这里以内存缓存为例注意Vercel Serverless Function 实例间不共享内存此方案仅适用于演示或极低并发生产环境请用数据库。# 在 app.py 顶部添加一个简单的内存缓存使用字典 # 警告此方法在Serverless环境下不可靠实例回收后数据丢失。仅用于演示原理。 user_conversations {} handler.add(MessageEvent, messageTextMessage) def handle_message(event): user_id event.source.user_id user_message event.message.text # 获取或初始化该用户的对话历史 if user_id not in user_conversations: # 新用户初始化对话历史包含系统指令 user_conversations[user_id] [ {“role”: “system”, “content”: “你是一个友好的助手回答要简洁。”} ] conversation_history user_conversations[user_id] # 将用户新消息加入历史 conversation_history.append({“role”: “user”, “content”: user_message}) # 调用ChatGPT传入整个历史 ai_response get_chatgpt_response_with_history(conversation_history) # 将AI回复加入历史 conversation_history.append({“role”: “assistant”, “content”: ai_response}) # 可选限制历史记录长度防止token超限和内存增长 # 例如只保留最近10轮对话20条消息user和assistant交替 if len(conversation_history) 21: # 1条系统消息 20条对话 # 保留系统消息和最近的20条对话 conversation_history [conversation_history[0]] conversation_history[-20:] # 更新缓存 user_conversations[user_id] conversation_history # 回复用户 line_bot_api.reply_message(event.reply_token, TextSendMessage(textai_response)) def get_chatgpt_response_with_history(messages): response openai.ChatCompletion.create( model“gpt-3.5-turbo”, messagesmessages, # 直接传入整个对话历史 max_tokens500, temperature0.7, ) return response.choices[0].message.content.strip()生产环境建议 对于真正的生产部署你应该使用外部存储Vercel KV (推荐)这是Vercel自家的Redis服务与Serverless函数集成度极高速度快适合存储会话这类临时数据。你需要将对话历史序列化如用JSON后以user_id为键存储。Vercel Postgres如果需要更结构化的存储或长期保存对话记录可以使用Postgres。其他云数据库如Supabase、MongoDB Atlas等。使用外部存储后代码逻辑变为收到消息时根据user_id从数据库读取历史记录 - 添加新消息 - 调用API - 保存AI回复到数据库 - 回复用户。5. 常见问题与排查技巧实录在实际部署和运行过程中你几乎一定会遇到下面这些问题。我把它们和排查思路整理出来希望能帮你节省大量时间。5.1 Webhook验证失败与消息无法接收这是新手遇到最多的问题。症状是在Line后台设置了Webhook URL并点击“Verify”显示失败或者验证成功但给机器人发消息没反应。排查清单检查URL与路由绝对路径Webhook URL必须是完整的https://your-domain.com/callback。确保域名正确且路径/callback与你的Flask应用中的app.route(‘/callback’, …)完全匹配包括大小写。本地测试如果你在用ngrok确保URL是https://xxx.ngrok.io/callback并且ngrok正在运行。检查环境变量Vercel环境变量登录Vercel控制台进入项目设置确保LINE_CHANNEL_SECRET和LINE_CHANNEL_ACCESS_TOKEN已正确添加且没有多余的空格或换行。这是最常出错的地方。本地环境变量确保.env文件存在且内容正确并且代码中是通过os.getenv()读取。检查签名验证逻辑你的代码必须实现签名验证。使用line-bot-sdk的WebhookHandler时它会自动处理。确保你在callback函数中正确调用了handler.handle(body, signature)并且body是原始字符串request.get_data(as_textTrue)。常见错误在handler.handle之前对body进行了JSON解析或任何修改这会导致签名对不上。查看日志Vercel日志在Vercel项目的“Deployments”标签页找到最新的部署点击进入可以查看实时函数日志Function Logs。任何未捕获的异常都会在这里显示。本地日志在Flask应用中添加app.logger.info()语句打印关键步骤信息如收到的请求体。在ngrok终端也能看到原始的HTTP请求和响应。检查网络与防火墙确保你的服务器或Vercel应用的443端口HTTPS是开放的并且可以被Line的服务器主要在日本访问。Vercel默认是全局可访问的一般没问题。5.2 ChatGPT API调用失败或回复慢API密钥错误或额度不足错误信息通常包含Incorrect API key provided或You exceeded your current quota。解决登录OpenAI平台检查API Key是否有效并确认账户是否有余额或免费额度。超时问题Line Messaging API要求Webhook端点必须在短时间内通常几秒内返回成功响应200 OK否则Line会重试。如果ChatGPT API响应慢可能导致超时。解决设置更短的max_tokens以减少生成时间。使用响应更快的模型gpt-3.5-turbo。关键技巧异步处理。在Webhook处理函数中先立即回复Line一个“已收到”的响应200 OK然后在一个后台任务如使用队列中调用ChatGPT API获取回复后再通过Line的push messageAPI主动推送给用户。这需要更复杂的架构但能彻底解决超时问题。对于Vercel可以考虑结合Vercel的Background Functions或使用外部任务队列服务。回复内容被截断如果max_tokens设置太小AI的回复可能在中途被截断。解决适当增加max_tokens值但要注意成本。对于中文聊天500-800通常足够。5.3 部署到Vercel后的特定问题ModuleNotFoundError: No module named ‘...’这通常是因为requirements.txt文件中的依赖包名称或版本不正确或者Vercel在构建时没有正确安装。解决检查requirements.txt格式是否正确包名是否准确。可以在本地虚拟环境中运行pip freeze requirements.txt来生成准确的依赖列表。然后重新提交代码触发部署。应用返回空白页或404访问你的Vercel域名如果显示空白或404可能是路由配置问题。解决检查vercel.json中的routes配置确保它将请求正确路由到了app.py。同时确保你的Flask应用定义了根路由app.route(‘/‘)用于响应GET请求这常用于健康检查。环境变量未生效代码在Vercel上运行时报错找不到环境变量。解决Vercel的环境变量需要在项目设置中手动添加并且每次添加或修改后需要重新部署才能使新的环境变量生效。不要以为在代码里写了.env文件上传就行Vercel不会自动读取项目中的.env文件。5.4 功能与体验优化处理非文本消息用户可能会发送图片、贴图、文件等。目前的代码只处理TextMessage。扩展你可以为其他类型的事件添加处理器例如ImageMessage。收到图片后可以通过Line API先将图片内容下载到临时存储然后使用支持视觉的AI模型如GPT-4V进行分析或者简单回复“我暂时还看不懂图片哦”。添加指令或命令让机器人支持一些特殊命令比如/help显示帮助/clear清空对话历史。实现在handle_message函数中判断user_message是否以特定前缀开头然后执行相应逻辑而不是转发给ChatGPT。设置速率限制Rate Limiting防止用户滥用过度消耗你的OpenAI API额度。实现可以使用一个简单的内存字典配合定时清理或Redis来记录每个user_id在最近一段时间内的调用次数。超过阈值则回复“调用过于频繁请稍后再试”。Vercel Serverless本身没有内置的全局速率限制需要自己实现。提升回复的稳定性和友好性ChatGPT API偶尔可能返回非预期错误或空回复。实现在get_chatgpt_response函数中添加try...except块捕获openai.error.OpenAIError等异常。发生异常时可以返回一个友好的默认提示如“抱歉我好像有点晕请再试一次吧~”并记录错误日志以便排查。

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