Android聊天机器人课设全攻略:架构设计、网络层与本地规则引擎实战
简介一份面向移动应用开发学习者的Android聊天机器人课程设计报告围绕智能机器人App的完整实现展开适合作为安卓课程设计或移动开发实训的参照范本。报告从实验目的与内容入手详细介绍在图灵机器人平台申请API Key、创建聊天界面布局、设计ChatBean消息模型、编写ChatAdapter数据适配器、接入OkHttp网络库从服务器获取回复并更新界面的全过程并对activity_main、chatting_left_item、chatting_right_item等布局给出设计思路同时对MainActivity中的initView、showData、sendData、getDataFromServer、updateView等关键方法及onKeyDown返回处理作了说明配有运行界面截图便于复现和修改。资源为单个doc文档约1.46MB内容覆盖Android基础知识、UI设计、数据存储、四大组件与网络编程等多个课设考察点。目前已有2705人浏览学习对需要系统掌握Android项目流程的读者具有较高的参考价值。1. 这不是一个“聊天机器人”课设而是一个“工程闭环”课设先说个反直觉的结论Android聊天机器人这种课设拿高分的关键从来不是模型多聪明、回复多拟人而是你能不能把一条完整的技术链路跑通并讲清楚。我见过太多同学把精力砸在“怎么让机器人更懂我”上结果网络层、数据库、UI状态一塌糊涂答辩时被问两句就哑火也见过有人就用一个最简单的关键词匹配加一个公开API因为架构清晰、边界分明、测试数据完整最后拿了优秀。这门课设的完整含义是在Android端实现一个具备输入→理解→回复→记录完整链路的聊天机器人并且用一份课程设计报告把它讲明白。它要解决的核心问题有三个机器人怎么接住用户的自然语言、回复从哪里来、历史聊天怎么管理和展示。适合谁做适合正在选课设题目、准备答辩的计算机相关专业学生也适合想快速在Android上验证一个AI交互原型的开发者。本文的路径是先定架构再写网络层和本地逻辑层最后把课设报告和答辩的加分点一并交代。2. 先想清楚你的聊天机器人是“自研派”还是“调API派”动手写代码之前必须做一次架构选型这是课设报告里最先要写、也最能体现工程判断力的部分。很多人的第一反应是“我要自己做一个NLP模型”但在Android课设这个体量下这条路几乎走不通你训不出像样的模型也解释不清模型在手机上的内存和耗时开销。反过来完全调远程API又显得课设太薄老师会追问“你自己写的东西在哪”。我常用的做法是双通道架构本地意图识别作为第一层负责快速响应和拦截简单指令拿不准的请求走网络API拿高质量回复。这样既保住工程实现量又能在报告里理直气壮地写“本地规则引擎兜底云端能力增强”。2.1 架构图先画清楚四层结构是课设报告的骨架一份优秀的课设报告第一张图一定是架构图不需要画得多华丽但层次必须分明。我这边的推荐分层是这样表现层UIRecyclerView的消息列表、输入框、发送按钮外加一个正在输入的动画状态。逻辑层Controller/ViewModel负责调度。用户发消息后先走本地意图识别再由它决定是直接返回本地话术还是发起网络请求。数据层Repository网络请求封装与数据库读写都在这一层ViewModel不直接碰API和SQLite。基础层Network/DBRetrofit实例、OkHttp配置、SQLiteOpenHelper实现。这个分层的好处是答辩时特别好讲。老师问“你网络层怎么设计的”你把Repository和Network拆开给他看老师问“你消息历史存哪了”你直接指到数据库那层。最怕的是所有代码堆在一个Activity里那跟没设计一样。对应到代码骨架我会建这样的包结构com.example.chatbot ├── ui # MainActivity、ChatAdapter、ChatViewModel ├── core # 意图识别器、关键词规则表 ├── data # 消息仓库、远程数据源、本地数据源 ├── network # Retrofit接口、OkHttp配置、数据模型 └── db # 数据库Helper、消息DAO包结构本身就在帮你的报告生成目录。我见过不少优秀课设的目录结构和代码包几乎一一对应这不是巧合——代码组织本身就是设计文档的一部分。2.2 依赖与权限一把梭还是克制引入依赖选择上建议克制四个库足够dependencies { implementation com.squareup.retrofit2:retrofit:2.9.0 implementation com.squareup.retrofit2:converter-gson:2.9.0 implementation com.squareup.okhttp3:okhttp:4.12.0 implementation com.squareup.okhttp3:logging-interceptor:4.12.0 }没有加RxJava、没有加协程这里说句实话如果课设周期只有两三周协程或者RxJava带来的复杂度远大于收益回调写法虽然老土但每一步都直白答辩时不容易翻车。数据库用自带SQLiteOpenHelper就够了Room作为加分项可以写在“后续改进”里没必要真上。权限方面Android 6.0以上只需声明网络权限uses-permission android:nameandroid.permission.INTERNET /有一个新手常踩的坑提前说如果API地址是http明文协议Android 9.0及以上版本默认禁止明文流量需要在AndroidManifest里开usesCleartextTraffic否则通通被拦。application android:usesCleartextTraffictrue ... 参数说明usesCleartextTraffic只在调试阶段建议开启上线前应改为HTTPS。课设场景基本是本地后端或临时服务器开明文没问题但报告里一定要写清楚“生产环境应配置HTTPS”这个细节本身就是评分点。依赖选定后主界面的骨架也要在一开始搭好。聊天界面核心是RecyclerView 两种气泡布局这里先给出最基本的单类型消息布局后面第5章再展开双类型适配器。2.3 消息模型先行所有代码都围着它转写任何功能前先把消息实体定义好。这个消息类会在UI、数据库、网络层之间来回传递定义得不好后面全是重构的眼泪。data class ChatMessage( val id: Long 0L, val content: String, val isFromUser: Boolean, val timestamp: Long System.currentTimeMillis() )字段说明id用于数据库主键content是消息文本isFromUser区分左右气泡timestamp存毫秒时间戳展示层再格式化成时间。我没在这里加“是否来自本地规则”之类的标记因为课设阶段没必要把消息来源暴露到UI层真需要的话可以在报告的数据流图里说明。实际经验是先花十分钟定消息模型后面写适配器、写数据库、写日志文件都顺了。不少同学的代码后期改不动就是因为在实体类上一改全改。3. 网络层实现把远程API变成你App里的一个方法架构定完后第一块硬骨头是网络层。这部分的目标是让逻辑层调用时感觉不到网络的存在——拿一个字符串进去回一个字符串出来。中间的重试、超时、错误处理全部收编。3.1 定义一个“够用即可”的API接口以最常见的GET型聊天API为例接口往往长这样请求带一个参数userMsg响应是一个JSON对象里面是reply字段。Retrofit定义如下interface ChatApiService { GET(chat) suspend fun fetchReply( Query(msg) userMsg: String ): CallChatResponse }注意这里用了suspend关键字配合协程使用。如果你不想引入kotlinx-coroutines去掉suspend改成同步Call也行但推荐保留——协程在Android已经是默认事实标准Retrofit从2.6.0开始原生支持suspend函数成本极低。对应的响应数据模型data class ChatResponse( SerializedName(reply) val reply: String, SerializedName(code) val code: Int )SerializedName的作用是把网络返回字段名和Kotlin属性名解耦。比如后端返回的字段叫replyContent你属性叫reply注解里写replyContent即可。这个技巧课设报告里值得提一句它让你的代码不被后端字段命名绑架。3.2 单例Client全局只有一个OkHttp实例RetrofitClient写成单例是好习惯避免每次请求都新建连接池和线程池object RetrofitClient { private const val BASE_URL https://your-api-server.com/ private val okHttpClient: OkHttpClient by lazy { OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .addInterceptor(HttpLoggingInterceptor().apply { level HttpLoggingInterceptor.Level.BODY }) .build() } val apiService: ChatApiService by lazy { Retrofit.Builder() .baseUrl(BASE_URL) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build() .create(ChatApiService::class.java) } }三个参数值得解释连接超时10秒是TCP建连的上限超过就放弃读超时10秒是后端处理时间上限。课设里的后端通常是自己写的Spring Boot或Python Flask10秒绰绰有余如果你对接的是大型云服务API读超时建议放到15秒以上。日志拦截器Level.BODY会打印完整请求和响应体调试时开、答辩演示时关掉因为BODY模式会暴露所有链路细节演示时一旦接口空返回满屏红色堆栈很尴尬。调级别为Level.BASIC只打印请求行和响应概要。3.3 封一层Repository让ViewModel只管业务网络请求不能直接在Activity里调用这是课设报告里最容易拿分的分层设计。中间加一层仓库对上层暴露一个“尽量不抛异常”的方法class ChatRepository(private val apiService: ChatApiService) { suspend fun getRemoteReply(userMsg: String): String { return try { val response apiService.fetchReply(userMsg) if (response.code 200) { response.reply } else { 服务开小差了稍后再试试 } } catch (e: Exception) { 网络好像不太顺畅请检查连接后重试 } } }这段代码的设计重点在错误吞掉。有同学觉得catch到异常应该往上抛让用户看到具体错误这在正式产品里是对的但课设答辩现场你要的是“任何情况下App都不崩、都有合理的文案输出”。把异常转化为兜底文案演示时即使后端挂了也能从容应对。3.4 数据流串起来ViewModel是调度中心如果你用了协程ViewModel里的调度写法极简fun sendMessage(content: String) { val userMsg ChatMessage(content content, isFromUser true) _messages.add(userMsg) viewModelScope.launch { val reply repository.getRemoteReply(content) _messages.add(ChatMessage(content reply, isFromUser false)) } }这里有个隐藏的细节先同步把用户消息塞进列表再异步等回复。如果先走网络再一起插入UI上就会出现“发出消息后一两秒没反应”的体验用户会手滑连发好几遍。正确做法就是上面这样用户消息立刻上屏机器人回复到了再追加。我见到不少翻车案例是直接把网络请求放在Activity onCreate里做的这在demo里看着能跑老师一翻代码就问“线程呢生命周期呢”当场哑火。用ViewModel viewModelScope天然避免几个问题配置变更旋转屏幕时请求不会中断、协程自动绑定生命周期。4. 本地智能规则引擎才是你课设的“原创部分”网络层搞定后整个App已经能聊了。但如果就这么交上去老师大概率只给个中等分——因为“调用一个API”不是你的工作后面的部分才是。4.1 意图识别器先定意图再定话术本地规则引擎的设计思路是定义几个核心意图每个意图对应一组关键词命中后从话术表里随机取一条回复。这是纯规则匹配不谈机器学习但正因为简单它可靠、可控、能在答辩时当场讲清楚。意图定义我用枚举GREETING打招呼、TIME问时间、WEATHER问天气、HELP功能帮助、BYE道别、UNKNOWN兜底。enum class Intent(val keywords: ListString) { GREETING(listOf(你好, 您好, hi, hello, 在吗)), TIME(listOf(时间, 几点, 现在)), BYE(listOf(再见, 拜拜, 走了, 晚安)), HELP(listOf(帮助, 能做什么, 功能, 你会什么)), UNKNOWN(emptyList()) }关键词表设计有几个讲究列表里不要放太短的词“在”这种单字会误伤一大片英文词要小写匹配同一个意图至少放5个关键词因为课设报告里会要求你写明“覆盖了哪些典型表达”多写几个词表正文就多几行材料。4.2 匹配策略优先级排序与随机兜底匹配逻辑不是简单“第一个命中的意图”还要考虑意图冲突。比如用户说“你好现在几点”同时命中GREETING和TIME这时候怎么选我的策略是长词优先用户在一条消息里表达的真实诉求通常落在更具体的关键词上。class IntentClassifier(private val replyPool: MapIntent, ListString) { fun match(rawInput: String): Intent { val normalized rawInput.lowercase() val hitIntents mutableListOfIntent() for (intent in Intent.values()) { if (intent Intent.UNKNOWN) continue var isHit false for (keyword in intent.keywords) { if (normalized.contains(keyword.lowercase())) { isHit true break } } if (isHit) hitIntents.add(intent) } if (hitIntents.isEmpty()) return Intent.UNKNOWN return hitIntents.maxBy { intent - intent.keywords.maxOf { keyword - keyword.length } } } fun getReply(intent: Intent): String { val replies replyPool[intent] ?: listOf(我听不懂你在说什么。) return replies.random() } }这段逻辑有两个亮点值得写进报告一是用maxBy选择“关键词最长”的意图解释为“更具体的意图优先”比固定if-else判断优雅二是回复文案用random()随机抽取让用户感觉没那么机械。随机抽取在答辩演示时有个小心机——同一句话问两三遍回复不一样现场效果很好。4.3 本地规则和远程API怎么串门双通道的调度逻辑放在ViewModel里核心是一个分支判断private val localReplyPool mapOf( Intent.GREETING to listOf(你好呀我是你的智能助手。, 嗨我在呢), Intent.TIME to listOf(现在是北京时间 getCurrentTime() 。), Intent.BYE to listOf(再见啦下次聊, 拜拜有需要再找我。), Intent.HELP to listOf(你可以问我时间和我聊天拜拜时我会送你离开。) ) fun sendMessage(content: String) { // ... 先把用户消息加到列表 ... viewModelScope.launch { val intent classifier.match(content) val reply if (intent ! Intent.UNKNOWN) { classifier.getReply(intent) } else { repository.getRemoteReply(content) } // ... 把reply加到列表 ... } }这里的设计决策是本地规则命中就直接返回不经过网络。好处有二响应快无网络环境下App不瘫痪答辩时你可以现场开飞行模式证明本地规则仍可用这个操作几乎必加分。坏处也要在报告里说清楚本地规则只能覆盖有限意图长尾问题全部交给远程API两者是互补关系而非替代关系。4.4 把聊天记录存进SQLite课设的“数据层”不能空着数据层是很多课设的盲区。你做了一个聊天机器人结果关闭App聊天记录全丢老师会觉得你只做了“玩具”。用SQLiteOpenHelper写一个消息表二三十行代码数据层就完整了。class ChatDbHelper(context: Context) : SQLiteOpenHelper(context, chat.db, null, 1) { override fun onCreate(db: SQLiteDatabase) { db.execSQL( CREATE TABLE chat_message ( id INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT NOT NULL, is_from_user INTEGER NOT NULL, timestamp LONG NOT NULL ) .trimIndent() ) } override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { db.execSQL(DROP TABLE IF EXISTS chat_message) onCreate(db) } fun insertMessage(message: ChatMessage) { val values ContentValues().apply { put(content, message.content) put(is_from_user, if (message.isFromUser) 1 else 0) put(timestamp, message.timestamp) } writableDatabase.insert(chat_message, null, values) } fun loadAllMessages(): ListChatMessage { val messages mutableListOfChatMessage() val cursor readableDatabase.query( chat_message, null, null, null, null, null, timestamp ASC ) cursor.use { while (it.moveToNext()) { messages.add( ChatMessage( id it.getLong(it.getColumnIndexOrThrow(id)), content it.getString(it.getColumnIndexOrThrow(content)), isFromUser it.getInt(it.getColumnIndexOrThrow(is_from_user)) 1, timestamp it.getLong(it.getColumnIndexOrThrow(timestamp)) ) ) } } return messages } }存储这层有几点经验布尔值存INTEGER0和1不存TEXT时间戳存LONG毫秒不存字符串这样排序和格式化都有余地查询时按timestamp升序排列正好对应聊天记录从上到下的展示顺序。之前有位同学的insert语句忘了之后要按时间取全表乱序加载每次进App消息顺序都是乱的查了一晚上才定位到是忘了ORDER BY。UI层加载历史消息的时机放在onCreate里进入聊天页先读一次数据库再展示这样即使用户退出了App再进来上下文还在这个体验对课设评分帮助非常直观。5. 避坑手册课设里最容易翻车的五个位置课设出问题的高发区其实很集中这里把血泪经验整理成清单每一条都是先看现象再给解法。5.1 明文HTTP请求被系统拦截现象本地起了个Spring Boot后端模拟器里访问http://10.0.2.2:8080/chat结果日志报CLEARTEXT communication not permitted。原因Android 9.0API 28起默认禁止明文HTTP流量而你课设阶段的API几乎不可能配好HTTPS证书。解决在AndroidManifest的application标签里加android:usesCleartextTraffictrue。需要注意的是这个开关是对整个App开放的严谨做法是配置network_security_config只对特定域名开放明文课设报告里写一句“生产环境应移除该配置并启用HTTPS”就能体现安全意识。5.2 主线程网络请求直接崩现象App一打开就弹“Application Not Responding”或者直接抛出NetworkOnMainThreadException代码明明照着网上写的。原因Android不允许在主线程做网络操作Retrofit同步execute()在Activity里调用必崩。解决用我前面第3章的写法Retrofit接口加上suspend配合lifecycleScope或viewModelScope调用或者退一步用线程Thread { ... }.start()然后在主线程更新UI。千万不要用Thread.sleep在主线程假装等网络。5.3 Gson解析JSON类型对不上现象后端返回的JSON里字段是字符串123Kotlin数据类定义成Int解析直接报NumberFormatException或者字段本身是null转出来变成空字符串界面上显示null。原因后端字段类型和客户端模型不一致Gson严格模式下遇到不匹配会抛异常Kotlin的非空类型声明遇到null也会在运行时失效。解决数据类字段都声明为可空类型String?在展示层再统一做空值兜底真要和后端团队协作最稳的是约定好字段类型但课设场景多半是自问自答后端是自己写的直接改后端返回更省事。改模型加SerializedName别名比改后端字段名更常见。5.4 键盘弹起把消息列表挤成一团现象输入框获得焦点后软键盘顶起RecyclerView被压缩成一小条最新消息看不见。原因没在Manifest里配置windowSoftInputMode默认的adjustUnspecified在带导航栏的模拟器上表现很怪。解决给Activity加一行android:windowSoftInputModeadjustResize然后RecyclerView用layoutManager.scrollToPosition(itemCount - 1)在消息增加后自动滚到底部。另外建议在RecyclerView布局上设置android:clipToPaddingfalse配合底部padding让最后一条消息离输入框留一点呼吸感这个细节在演示时容易被注意到。5.5 数据库升级把聊天记录全清了现象自己改了一下表结构onUpgrade里直接drop表重建装上新版本后之前的聊天记录全没了。原因这是最简单的实现方式但会丢数据课设阶段没问题报告里要写明是“开发期策略”。解决课设阶段不需要真正做数据迁移但要在报告的设计说明里写清楚“后续将使用ALTER TABLE迁移”然后代码注释里标一句// TODO: 实现增量迁移。这种“已知边界”的表述在评审老师那里比“假装完美”更讨喜。6. 从“能交差”到“优秀课设”三个低成本高回报的进阶动作课设拿到及格不难但要冲优秀光把功能跑通是不够的。这里给出三个我自己带学生时反复用、成本极低但回报极高的进阶操作。第一个是消息展示的拟人化细节。发送消息后不是马上显示机器人回复而是先显示一个“对方正在输入”的状态气泡延迟800~1200毫秒再替换成真实回复。这个时间差和人类打字节奏接近演示时观感完全不同。实现上用普通的Handler或协程delay就行viewModelScope.launch { _messages.add(ChatMessage(content , isFromUser false, isTyping true)) delay(1000) _messages.removeLast() _messages.add(ChatMessage(content reply, isFromUser false)) }第二个是把local和remote的命中率做成一个简单日志系统。不需要用第三方统计就在本地SQLite里加一张表记录每条消息是本地规则还是远程API命中的课设结束前跑100句当天能统计出命中率。这个数据写进报告里比任何截图都有说服力。第三个是画好一张时序图放进报告。就用普通的工具画出用户输入、本地规则命中、远程API请求、数据库落库的生命周期时序关系。图纸画对、术语准确足以证明你真的理解这套流程。答辩时直接对着这张图讲比念代码快而且清楚。如果时间还有富余把本地规则引擎改成支持上下文追踪——上一轮命中WEATHER后用户接着说“明天呢”自动补全为“明天天气如何”这个改进能让你的课设从“规则匹配”跨到“对话管理”的层次很多人在这一块给高分。但我也有句实话每年都有同学在最后一周试图把模型换成深度学习的Transformer最后项目没跑通报告写得再漂亮也没用。课设的边界是“完整地交付一个小系统”不是“证明你懂前沿算法”。把网络层、本地规则、数据库、UI展示这条链路擦得干干净净比堆砌一个跑不起来的神经网络靠谱得多。我自己做课设时就是把一个简单的双通道方案做到极致——回来重测每一项边界条件所有异常场景都有兜底文案那份报告后来成了学弟学妹的模板。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Blume 部署完全指南:从静态 HTML 托管到 Vercel、Netlify、Cloudflare 服务端适配全覆盖

Blume 部署完全指南:从静态 HTML 托管到 Vercel、Netlify、Cloudflare 服务端适配全覆盖

【免费下载链接】blume The open-source docs framework for humans and agents. 项目地址: https://gitcode.com/gh_mirrors/blum/blume 点击查看 免费下载 Blume 是一个面向人类与 AI 代理的开源文档框架,本文带你完成 Blume 文档站点部署&#xff1a…

2026/10/11 16:20:35 阅读更多 →
python的先进制造技术工业场景模拟第一百二十二篇:读取机器人工作站来料数据,建立模型,预测来料偏差造成的抓取失败概率。

python的先进制造技术工业场景模拟第一百二十二篇:读取机器人工作站来料数据,建立模型,预测来料偏差造成的抓取失败概率。

机器人抓取失败概率预测——从来料偏差到抓取风险评估一、实际应用场景(真实痛点)时间:周三凌晨 2:47。地点:某家电企业注塑车间机器人上下料工作站。夜班班长小赵被电话吵醒赶到现场时,机器人已经第 7 次停在了安全位…

2026/10/11 16:20:35 阅读更多 →
2026乐山景区古建牌坊检测排名 TOP5 CMA 资质机构提供牌坊裂缝检测、牌坊倾斜检测、老化检测 联系方式推荐

2026乐山景区古建牌坊检测排名 TOP5 CMA 资质机构提供牌坊裂缝检测、牌坊倾斜检测、老化检测 联系方式推荐

在乐山这座历史文化名城,古建牌坊星罗棋布,从峨眉山麓的巍峨石坊到乡野村落的古朴木楼,每一处都承载着岁月印记。然而,本地古建牌坊检测机构虽鳞次栉比,却也鱼龙混杂,大量无资质机构出具的检测报告在住建、…

2026/10/11 16:20:35 阅读更多 →

最新新闻

Python接口自动化Token获取、传递与自动续期实战指南

Python接口自动化Token获取、传递与自动续期实战指南

做接口自动化测试越久,越发现一件事:很多用例跑不过去,不是接口逻辑变了,而是Token在背后“悄悄搞事”。要么登录返回的Token还没用到就过期,要么并发跑用例时Token被别人刷新下线,要么压根就没取到Token&a…

2026/10/11 19:48:44 阅读更多 →
QN8035 vs QN8075:FM收音芯片 选型指南

QN8035 vs QN8075:FM收音芯片 选型指南

一、QN8035与QN8075 QN8035和QN8075同属Quintic FM接收芯片系列。从芯片版图分析来看,QN8075是在QN8035基础上演进而来的,两者共享相似的核心架构,但在性能定位和功能特性上有所分化。 1.1 核心参数对比1.2 关键差异解读 频段覆盖差异是两者最…

2026/10/11 19:48:44 阅读更多 →
用纯文本搭建个人技能管理系统:从技能树到证据链

用纯文本搭建个人技能管理系统:从技能树到证据链

这两年我最大的一个体会是:很多人不是没有技能,而是根本没搞清楚自己“会什么”。年初写简历的时候对着空白文档发呆,年中复盘的时候只能凭印象说“大概学了点东西”,年底总结的时候又不得不翻遍聊天记录找自己到底做过什么。所以…

2026/10/11 19:48:44 阅读更多 →
YOLOv5数据集目录格式详解:从标注到训练一次搞定

YOLOv5数据集目录格式详解:从标注到训练一次搞定

简介:面向智能小车物品识别与智能购买等目标检测场景,提供一套已按YOLOV5标准目录结构整理的数据集,共1777个文件,以jpg图片、txt标签为主,另含py脚本和png示例,包体约26.48MB。图像统一为416416 RGB格式&a…

2026/10/11 19:48:43 阅读更多 →
用LangChain快速搭建Agent:框架实战入门详解

用LangChain快速搭建Agent:框架实战入门详解

怎么用框架快速搭一个Agent?目前最流行的两个框架是LangChain和LangGraph。LangChain适合快速上手,LangGraph适合复杂工作流。这篇先讲LangChain,下一篇再对比LangGraph。LangChain是什么LangChain是一个AI应用开发框架。它的作用是&#xff…

2026/10/11 19:48:43 阅读更多 →
CMake构建实战:核心逻辑、依赖管理与排错指南

CMake构建实战:核心逻辑、依赖管理与排错指南

你有没有过这种经历:一个项目从单个 main.cpp 变成十几个目录,编译命令从一行 g 变成一长串带路径的参数,最后谁也不愿意去碰构建脚本。我在这场混乱里挣扎了很久,最后老老实实把整个工程的构建交了给 CMake 这一层“元构建工具”…

2026/10/11 19:47:43 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →