Hi there 👋

Welcome to my tech blog

Zsh开箱即用

本文简单介绍了一下如何在linux(ubuntu24.04)上面安装zsh

March 23, 2026 · 1 min · Somnus

Dify初体验1

1.工作流介绍。 工作流整体如图所示。 首先是用户输入,对于用户输入的问题,使用一个参数提取器,调用glm-4.7模型对其进行参数提取,参数提取为year,region,task_type,keywords。为了方便的其他操作。 接着呢,就是一段代码执行块,执行了下面这一段python代码。主要实现的逻辑是,对于没有发布指定法规的年份,使用上一个最近的发布的法规,即对于2022徐州的问题,就返回2021年发布的支出标准。对于2026徐州就返回2025年发布的支出标准。 def main(year: int, region: str, keywords: str): REGULATIONS = [ {"region": "徐州", "year": 2021, "filename": "徐州市政务信息化项目运维服务支出标准(徐财评〔2021〕5号).pdf"}, {"region": "徐州", "year": 2025, "filename": "徐州市政务信息化项目运维服务支出标准(徐财评〔2025〕13号).pdf"}, {"region": "无锡", "year": 0, "filename": "《无锡市市级政务信息化建设及运行维护项目预算支出标准(试行)》.pdf"}, {"region": "江苏省", "year": 2021, "filename": "省政府办公厅关于印发江苏省省级政务信息化项目建设管理办法的通知(苏政办发〔2021〕24号).pdf"}, {"region": "辽宁", "year": 0, "filename": "《辽宁省省级政务信息化建设项目预算支出标准规定(试行)》.pdf"}, {"region": "连云港", "year": 0, "filename": "《连云港市市级政务信息化项目运维方案编制指南和支出预算标准(试行)》.pdf"}, ] FALLBACK_REGION = "江苏省" # 1. 匹配地区 candidates = [r for r in REGULATIONS if region in r["region"] or r["region"] in region] if not candidates: candidates = [r for r in REGULATIONS if FALLBACK_REGION in r["region"]] # 2. 匹配年份 if candidates: eligible = [r for r in candidates if r["year"] <= year] best = max(eligible, key=lambda r: r["year"]) if eligible else None else: best = None # 3. 拼接 query if best: filename_stem = best["filename"].replace(".pdf", "") query = f"{filename_stem} {keywords}" else: # 无匹配时用基础信息兜底 query = f"{region} {year}年 {keywords}" return { "year": str(year), "filename": best["filename"] if best else None, "query": query, } 接着,是一个llm节点,调用deepseekv3,根据得到的信息实现rag查询重写,为了方便在知识库中查找。以下为system提示词: 你是一个面向向量检索(RAG)的查询重写专家。用户当前的需求是估算政务软件项目的造价。 请根据用户的原始 query,将其拆解并改写为 2 到 3 个具体的【自然语言问句或短句】,以便在知识库中精准匹配到长文档中的计算公式和费率表。 改写规则与约束: 1. 严禁堆砌关键词:绝对不要输出用空格隔开的零散词汇组合,必须是结构完整的自然语言。 2. 剥离业务噪音:将用户原始 query 中具体的业务场景(如“录入表单”、“财政业务”)抽象为通用的造价术语(如“定制软件开发”、“功能点测算”)。 3. 必须包含多路检索意图: - 意图 A(找公式):生成一句专门针对底层计算公式的检索词(如:“定制软件开发服务费用的计算公式是什么?”) - 意图 B(找参数):生成一句专门针对费率和取费标准的检索词(如:“软件开发生产率基准、人月折算系数和基准人月费率是多少?”) 不要输出任何解释或思考过程,请直接分行输出优化后的自然语言查询句子。要明确年份和地区 接下来就是知识检索,我将文件分成了两个知识库,一个是行业基准数据,一个是地方政策。索引方式都是高质量,使用zhipu的embedding-3模型,检索方式采用混合检索,使用有道的bcererankbaseV1模型,top-K设置为7。 ...

March 23, 2026 · 3 min · Somnus

Raft训练日志1

一、前情提要 1、什么是RAFT RAFT-stereo是基于RAFT的扩展。RAFT即Recurrent All-Pairs Field Transforms,是一个很出名的光流估计模型,他的特点是先建立全局匹配关系,再通过循环迭代不断细化结果,每一步更新都会变得更准,而RAFT-stereo是基于这个模型的双目改造。 2、RAFT-stereo的原理 先用卷积网络提取左右图的高维特征,而不是拿RGB去比较。因为原始RGB容易受到光照,纹理,噪声影响。 接着就是构建相关性体,简单说就是对于左图中的每一个位置,它都会和右图的一整条去进行相似度比较,形成一种“匹配代价”。 再接着就是不断迭代,他会先给个初始估计,然后通过循环更新模块来反复修正。 3、和其他立体匹配有什么不同之处 传统方法,比如SGM、Blocking Matching,是先算匹配代价,再代价聚合,再做视觉选择,最后再做左右一致性检查。 而RAFT-stereo,属于端到端的学习方法,他会自动学习,什么特征适合匹配,什么区域应该相信上下文,哪些遮挡、弱纹理、重复纹理区域该怎么处理。 4、为什么做这个 我的本科毕业设计做的是双目摄像头的,通过资料搜集,我发现网上感觉最新(2021年提出)的双目摄像头立体匹配算法就是这个RAFT-Stereo,于是我便接触到了这个项目。 二、训练过程 首先,这个项目已经被开源到Github,而且readme文档有较为详细的指令包括下载数据集,demo输出,train,evaluate等等。 说实话,这是我第一次进行正式的模型训练和微调项目,之前做过的模型训练是yolov5,之前g308(西南交通大学robocon校队,我梦开始的地方,没有这个机会,我根据不会接触技术路线,这个博客也不会诞生)的入队考核需要通过这个进行蓝球,红球,球框额的识别(实际上就是robocon2024的麦穗题目),每个人都会以自己的方式接触到yolo,都是回忆啊,在这个之后我就没有做过需要模型训练的项目了,而且就算是那个yolo项目,我也没有进行模型微调,毕竟是入队考核,还是以基础为主。 通过这个项目,chatgpt辅助我,让我也学会了大致的模型微调流程,以下是我的总结 首先要对原始模型进行推理和评测,得到baseline,也就是整个微调的基线。 然后控制变量,每次只改一部分,而且要保留原模型,改动要作为一个选择,也就是作为运行程序的一个可选参数,而不能直接在原模型上改,不然的话,感觉就没有回头路了。 再然后就是根据评价指标,对得到的模型进行评价,和baseline对比。 三、模型改进改动 对于模型改变,我只是根据chatgpt给的提示作了一些修改,代码全部上传到我自己fork的github上, 1.refinement 我首先尝试了增加一个refinement层,这是一个很微小的改变,以下为refinement层 import torch import torch.nn as nn import torch.nn.functional as F class RefinementHead(nn.Module): def __init__(self, in_channels=4, hidden_dim=32): super(RefinementHead, self).__init__() self.conv1 = nn.Conv2d(in_channels, hidden_dim, 3, padding=1) self.conv2 = nn.Conv2d(hidden_dim, hidden_dim, 3, padding=1) self.conv3 = nn.Conv2d(hidden_dim, hidden_dim, 3, padding=1) self.conv4 = nn.Conv2d(hidden_dim, 16, 3, padding=1) self.conv5 = nn.Conv2d(16, 1, 3, padding=1) def forward(self, image1, disp): x = torch.cat((image1, disp), dim=1) x = F.relu(self.conv1(x)) x = F.relu(self.conv2(x)) x = F.relu(self.conv3(x)) x = F.relu(self.conv4(x)) res = self.conv5(x) return disp + res 实际上RAFT-Stereo最核心的组件就是内置的精炼层—-多层卷积GRU,这样的设计本身就是在精炼,所以第一步的视差估计都是粗糙的,每一步都在上一步的基础上迭代、修正,最后一轮的输出就是经过了32次迭代的输出。 refinement是什么,本质上是一个输出端的残差修正模块,在RAFT-Stereo经过多次迭代后,会输出一个目前比较好的视差图,然后再和输入的左图拼接, ...

March 22, 2026 · 2 min · Somnus

我的第一篇博客

你好,这是我的博客 🚀 放一张linus的照片

March 20, 2026 · 1 min · Somnus