Hexo博客更新日志及踩坑经验总结
Hexo博客更新日志及踩坑经验总结博客功能
基本的Blog文章更新
博客文章的分类、标签、归档
Blog界面优化
本地搜索博客功能
留言功能(有点问题QAQ待完善)
侧边栏时钟
音乐🎵功能,可以播放网易云的歌单啦
解决上线后icon不显示的问题
增加了看板娘(其实是可爱的小男生)
SEO优化
页脚徽标
字体样式修改
滚动的副标题
一些于我有用的博主文章 我的Blog美化日记——Hexo+Butterfly | Guo Le’s Blog
如何在Hexo博客Butterfly主题开启Aplayer和“音乐”页面
hexo-butterfly魔改记录大全 | Black Flies (yyyzyyyz.cn)
欢迎来到舜桀BB的秘密基地!
欢迎来到舜桀BB的秘密基地呀!在这里你会看到我的日常分享,你也可以通过留言功能与我交流。希望你我都能在这个复杂的世界找到一份专属于自己的喜乐!
使用 LangGraph 来构建 SQL Agent
如何构建一个可以回答有关 SQL 数据库问题的 Agent 呢?
从高层次来看,SQL Agent 需要执行下面的步骤:
从数据库中获取可用的表
确定哪些表与问题相关
获取相关表的架构(schemas)
根据问题和架构中的信息生成查询
使用 LLM 仔细检查查询中是否存在常见错误
执行查询并返回结果
纠正数据库引擎发现的错误,直到查询成功
根据结果制定应对措施
设置安装依赖项pip install -U langgraph langchain_community "langchain[openai]"
选择 LLMfrom langchain_community.chat_models.tongyi import ChatTongyillm = ChatTongyi(model='qwen-plus', api_key=api_key)
配置数据库需要创建一个数据库用于交互。创建一个 SQLite 数据库。SQLite 是一个轻量级数据库,易于设置和使用。我们将加载该chinook数据库,它是一个代表数字媒体商店的示例数据库。
impor ...
LeetCode 0994 - 腐烂的橘子
LeetCode
📖 题目描述
在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。
示例 1:
输入:grid = [[2,1,1],[1,1,0],[0,1,1]]
输出:4示例 2:
输入:grid = [[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个方向上。示例 3:
输入:grid = [[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。
核心问题:如何在每分钟内模拟腐烂橘子的传播过程,并判断所有新鲜橘子是否都能在有限时间内被腐烂,如果可以则返回所需的最小分钟数,否则返回 -1。
💡 解题思路🔎 思路概览(一句话总结)使用多源广度优先搜索(BFS)从所有腐烂橘子同时开始扩散, ...
从 0 到 1 构建 LangGraph 对话系统:多节点持久化与前端实时渲染实践
为什么写这篇文章?市面上很多 AI 对话系统 Demo 代码长这样:
history = [{"role": "user", "content": question}]response = llm.chat(history)
但当项目走进实际业务场景时,这套逻辑会立即崩溃,原因包括:
用户输入不是单轮,而是多轮多流程
模型不是直接回答,而是分阶段决策:分析 → 拆解 → 生成 → 查询
模型输出不再是一个回复,而是多个节点逐步产出
用户随时刷新页面,需要可恢复的上下文与历史
于是,一个简单的问答系统,需要演进为:
多用户 + 多会话 + 多轮交互 + 多节点流图 + 状态持久化 + 前端可视化还原
本文将基于 LangGraph 构建一个支持上述功能的企业级对话系统,实现以下目标:
✅ 每轮对话可分为多个执行步骤✅ 每一步执行结果可落库并展示✅ 流式反馈进度,前端实时渲染✅ 数据可恢复,还原历史对话
技术栈与架构简介核心组件
技术
用途
LangGraph
定义每轮对话流程,支持多节点
...
Python 装饰器,别再只会加个 @log 了(彻底搞懂原理 + 应用)
装饰器可以说是 Python 最让人“又爱又恨”的语法糖之一。
刚开始我们觉得它只是个语法糖,可一旦深入,就发现它其实可以做很多:权限验证、日志记录、缓存、参数校验、接口拦截、自动重试……几乎所有能想到的“函数增强”都可以用装饰器实现。
但问题也随之而来:
装饰器到底是怎么“包裹函数”的?
为什么装饰器函数要写三层?
@wraps 到底有什么用?
装饰器能不能传参数?
多个装饰器嵌套,顺序怎么搞清楚?
这篇文章,让我们不依赖死记硬背,把装饰器的原理和实际用法讲清楚讲透。
装饰器是啥?
装饰器本质上是一个“接收函数,返回新函数”的函数。
说白了就是:它接收一个函数,然后生成一个“升级版”的函数,把你想加的功能(比如打印日志)包在原函数前后。
最小例子:
def outer(func): def inner(): print("before") func() print("after") return inner@outerdef say_hello(): print("H ...
高效提取数据库分析上下文:如何使用 Parquet 文件为大模型提供数据理解能力
在利用大语言模型(LLM)自动生成分析代码时,我们经常面临一个问题:无法将完整的数据库数据作为提示词提供给模型,因为数据量太大、隐私敏感或成本高。
本文将介绍一种高效、结构化的数据摘要方法,帮助将数据库数据导出并转换为结构描述 + 示例数据,以便 LLM 快速理解上下文,从而生成正确的数据处理代码。
场景背景开发过程中可能正处于如下场景中:
从数据库中查询了大量数据(百万行以上)
想让大模型帮你写分析代码
但无法把全部数据放进提示词(Token 受限)
我们只想告诉模型:“这个文件包含哪些字段?每列什么类型?长什么样?”
于是,我们需要一种方法来:
✨ 快速保存查询数据,并提取 schema 和部分示例,生成简洁的上下文描述供 LLM 使用。
为什么不用 CSV?虽然 CSV 是最常见的数据导出格式,但它存在很多局限:
问题
说明
无数据类型信息
所有内容都是字符串,模型不知道哪些是数字、时间等
文件大
无压缩,占空间大,加载慢
不支持嵌套结构
如果有 JSON 列、数组列,几乎无法兼容
不利于筛选
无列式存储,不方便快速读取前几行
解决方案: ...
Python 对象复制的坑:浅拷贝 vs 深拷贝
在 Python 开发中,我们常常希望复制一个对象,以避免直接修改原始数据。然而,“复制”这个操作远没有看起来那么简单。Python 提供了两种常见的复制方式:浅拷贝(shallow copy)和 深拷贝(deep copy),它们在处理嵌套对象时行为大不相同。
这篇博客会一步步解释它们之间的区别、使用场景,以及如何避免常见的坑。
赋值 ≠ 复制先看一个简单例子:
a = [1, 2, 3]b = ab[0] = 100print(a) # [100, 2, 3]
这里的 b = a 并没有复制 a,而是使 b 指向 a 的同一个内存地址,两者是同一个对象。
浅拷贝 (shallow copy)import copya = [1, [2, 3]]b = copy.copy(a)b[0] = 100b[1][0] = 200print("a:", a) # [1, [200, 3]]print("b:", b) # [100, [200, 3]]
浅拷贝特点
创建了一个新对象,但只复制了第一层结构
内部嵌套对象仍然引用原始对象
...