- 博客(45)
- 收藏
- 关注
原创 提示词工程实战:让 RAG 答疑机器人从“能答“到“答得好“
上一节用 RAG 给答疑机器人补上了公司私有知识,解决了"不知道"的问题。但跑起来之后很快会发现新的不对劲:回答是对的,却不好用——该给链接的没给,格式随模型心情,语气像一份冷冰冰的公告。这一篇记录把机器人从"能答"打磨到"答得好"的完整过程:从一次失败的"补丁式"改造讲起,到提示词框架与模板,再到 Meta Prompting、参考答案驱动的自动迭代,最后训练一个"AI 裁判"来给整个优化流程踩刹车。
2026-09-21 08:54:19
266
原创 RAG 自动化评测:用 Ragas 给答疑机器人打分
前面几章我们把答疑机器人跑通了,看起来能答上来不少问题。但只要多问几句,就会撞到这种情况:问「张伟是哪个部门的」,机器人给出了回答,可这个回答到底对不对?是检索环节没找到资料,还是找到了资料但模型没答对?每次都靠人肉翻日志去排查,既慢又容易漏。传统软件开发有单元测试兜底,改一行代码跑一遍测试就知道有没有改坏东西。RAG 应用也应该有同样的机制:准备一批测试问题,每次优化后自动跑一遍,量化地看效果是变好还是变坏。这样优化才有依据,不至于"感觉变好了"就上线。
2026-09-21 08:51:50
356
原创 RAG 从原理到落地:让答疑机器人读懂公司制度文件
先想清楚问题出在哪。大模型的知识来自训练数据,截止在某个时间点,而且全是公开语料。你们公司的《考勤管理制度》不在里面,直接问"年假怎么算",模型要么编一个,要么给一堆通用废话。RAG 的解法可以用开卷考试来理解:闭卷靠记忆,记不住就丢分;开卷靠翻资料,找到相关段落,加上自己的理解作答。大模型也一样——回答前先把相关知识检索出来塞进上下文窗口,让它"看着资料答题"。这就是上下文工程(Context Engineering)的核心:给模型的上下文窗口填充恰到好处的信息。信息太少,模型"不知道";
2026-09-20 22:41:56
76
原创 用大模型构建答疑机器人:从 API 调用到上下文工程
新员工入职,老员工被同一批问题反复打断。“报销走什么流程”“项目管理该用哪个工具”“账号怎么申请”。答案都躺在公司文档库里,但没人愿意翻几十页 PDF。很自然地会想:拿大模型做一个答疑机器人不就行了。一开始确实很顺。几十行代码,一个 API Key,机器人就能流畅作答。这三堵墙不是各自独立的 bug,它们指向同一个东西。下面按撞墙的顺序走一遍,从调通第一次 API 到最终绕不开的那个概念。
2026-09-20 22:35:24
185
原创 反向传播全解:手推公式、手写网络、再交给 PyTorch
ann.py(节选)'''初始化全连接网络,layers 为各层神经元个数'''for layer_no in range(1, len(layers)): # 遍历除输入层外的每层for node_num in range(layers[layer_no]): # 本层每个节点一行vector_w = [] # 一个节点的权重向量for input_num in range(layers[layer_no - 1] + 1): # +1 给偏置权重矩阵一行 = 一个节点;
2026-09-02 00:44:11
435
原创 神经网络入门:从感知机到反向传播
打个比方:两个保安各守一道门——一个查"至少来一人",一个查"不能俩都来";最后主管看两道门的记录盖章放行。每个保安的规则都很简单,合起来却完成了一件任何单个保安都做不到的事。
2026-09-01 01:01:15
429
原创 python高级——Python 类型提示与 Pydantic
前向引用文件头加后,可省略引号直接写。泛型 TypeVarT = TypeVar('T') # 类型占位符,不是具体类Processor = Callable[[T], T] # 接收 T、返回 TT的灵魂在于类型一致性:一旦实参把T推断成int,函数签名里所有T同步锁定为int,保证进出同类型。bound=还能把Treturn a.speak() # 静态阶段即可调用家族方法字段级用(必须为),模型级用raise ValueError('密码至少8位')return v。
2026-08-24 22:50:48
237
原创 python高级——装饰器
重绑定之后返回什么,决定了它干什么——返回原对象自身,就只是"创建后处理";返回一个新函数/实例,就拦截了随后的每一次调用。光说不练不够硬。下面这段探针打印装饰前后。
2026-08-20 16:30:38
514
原创 python高级——异常处理
当标准异常不够表达业务含义时,自定义异常能让代码"会说话"。推荐的做法是建一个基类 + 多个子类"""业务异常基类,统一带 error_code"""super().__init__(f"用户 '
2026-08-17 21:24:28
291
原创 python数据结构——链式队列
队列是一种「先进先出」(First In First Out,FIFO)的线性数据结构:先来的先走,后来的排队。生活中排队买票就是典型模型。在代码里,队列常用于任务调度、缓冲区、广度优先搜索(BFS)等场景。顺序表也能实现队列,但它有个绕不开的毛病——rear指针走到数组末尾后,即便前面已经出队腾出了空位,也没法复用,只能整体搬移或者宣布「满了」。链式队列用链表来存,节点随用随申请,天然没有容量上限,也谈不上假溢出。本文就用 Python 手撸一个链式队列,把每个设计取舍讲清楚。
2026-08-10 21:56:43
317
原创 Python数据结构——链式栈
一句话:链式栈是用单向链表实现的栈,栈顶固定在链表头,push/pop 只改头指针、不搬数据,因此无需预设容量、永远不会「栈满」。
2026-08-10 21:56:09
628
原创 Python数据结构——循环队列
一句话:循环队列是用固定长度数组模拟环形、靠取模绕回解决「假溢出」的队列。物理上还是一段连续数组,逻辑上首尾相接成了环。
2026-08-07 22:36:47
553
原创 Python高级——迭代器
可迭代对象(Iterable):实现了__iter__()方法的对象。该方法返回一个迭代器对象,可被iter()调用。迭代器对象(Iterator):实现了__next__()方法的对象。该方法返回下一个元素,结束时抛出,可被next()调用。把迭代器想成"容器上的指针":初始指向第一个元素;每次调用__next__()指针前移一位;指向末尾时抛出。迭代器不是容器本身,但有些容器自己也实现了迭代器协议,它同时就是迭代器。fill:#333;important;important;fill:none;
2026-08-07 22:36:27
402
原创 RAG 向量检索:从“查字“到“查意“
向量检索用一句话概括:把文本映射到高维向量的语义空间,靠距离度量"意思有多近",用 ANN 算法在大规模数据中毫秒级找出最相关的文档。它在 RAG 链路里扮演"外部大脑的记忆索引"——不是取代 LLM,而是让 LLM 有据可依。分块策略 > Embedding 模型选择 > 向量数据库选型。很多项目在向量数据库上纠结半天,结果分块一塌糊涂——方向跑偏了。最后记住一个核心判断:向量检索擅长"语义模糊匹配",不擅长"精确条件查找"。
2026-08-06 21:57:54
675
原创 agent学习Day23——文件上传与 Embedding 语义检索
这一篇把两个核心能力串成一条线——(把文档安全接进后端)和(让机器"看懂"语义)。两者看着不相关,其实都在为后面的向量检索和 RAG 打地基:上传是为了拿到原始文本,Embedding 是把文本变成计算机能计算的向量。
2026-08-06 21:02:02
381
原创 文件上传全解:从 str/bytes 编码到三道安全防线
文件上传看似简单——前端选个文件,后端收一下存盘。但往深了扒,从"字符怎么变成字节"到"攻击者怎么用文件名写 Webshell",中间隔着编码原理、HTTP 传输机制、内存管理、路径安全、内容校验一整条链路。这篇文章不绑定任何具体项目,只把这些底层概念和"为什么这么设计"讲清楚,当成通用技术 note 反复翻。
2026-08-05 23:25:13
425
原创 Obsidian 完全上手:从本地 Markdown 到知识图谱
笔记不是终点,链接才是。本地优先保证你的数据永远属于自己,纯文本保证它永不过时,双向链接和图谱让零散知识自己长成网,插件系统则把这套范式扩成你想要的样子。真正用起来的路径很短:建个 Vault、写几篇、随手[[互链]]、打开图谱看一眼、装几个插件——今晚就能跑通。剩下的,是让链接的习惯长进日常,而不是让工具在硬盘里吃灰。小结:从"记"到"连"再到"看",Obsidian 把笔记从仓库变成网络。工具只是开始,持续链接才是它价值的来源。
2026-08-05 22:50:39
450
原创 agent学习Day21——阶段3收官:数据库持久化、事务边界与端到端测试
迁移脚本 = 数据库结构的 Git commit。它不是"改数据库",而是描述怎么改数据库——一个可重复执行的程序。Git数据库迁移git commit记录文件 diff生成 migration 文件(upgradedowngradegit push同步给队友队友跑git log看历史看迁移链git revert回滚回退一步任何人、任何环境,跑同一份迁移脚本,结果一样。假设以后加了张jd_tags表,每条 JD 有 3-5 个标签。# 概念示意:N+1 问题的诞生现场。
2026-08-04 23:11:04
1035
原创 Python高级——变量本质、对象模型与核心数据结构
变量是标签不是盒子——类型属于对象,共享引用 + 可变/不可变决定了值的传播行为。数值/None/字符串三大基础类型,记住//向下取整、逻辑短路、str不可变。列表/元组/集合/字典四大结构,按"可变?有序?"选型;深浅拷贝是共享引用的最大坑。序列协议让你对一切有序容器举一反三。文件 + pickle解决持久化,但 pickle 有安全风险。四个综合案例把以上全部串成真实系统。一句话收尾:对象模型是根,数据结构是骨,案例是肉——根骨清楚了,写什么都稳。
2026-08-04 20:51:43
432
原创 Python高级——解释器执行原理与虚拟环境工程化实战
Notebook 像"网页版单本笔记",JupyterLab 是"浏览器中的 IDE"(升级版)。解释器是"让别的程序跑起来的程序",位于代码与硬件之间的软件逻辑层。小结:venv 是工程化基本规范,流程五步——创建→激活→装包→导出→退出。系统 Python 被你塞满包,某天升级一个库,别的项目集体崩。(多态、运算符重载、多重继承、生成器、推导、闭包、装饰器、lambda)、是启动加速手段,源文件或解释器版本一变就会自动重编译,无需手动清理。小结:环境隔离不是可选项,是 Python 工程化的第一步。
2026-08-03 22:27:02
330
原创 Python康复训练——常用标准库
装好 Python 就自带一套"官方工具箱"。这篇把最常用的几个标准库过一遍,并把它串成 4 个能直接用的小工具。代码都来自实战片段,路径注释标了出处,照着敲就能跑。
2026-07-31 17:07:33
292
原创 agent学习Day16——get_db 依赖注入与测试数据库隔离
详情接口的本质不是"多写一个路由",是"列表返回摘要、详情返回正文"的场景分离。线程安全的关键补丁。,就自动管理生成器的"推进-暂停"节奏——请求进来跑到 yield 交出 session,路由跑完后回到 yield 之后执行。的函数,Python 不直接执行,而是返回一个 generator 对象。返回结果后,函数就死了——变量释放、执行位置清空,再也没下文。生成器,但替代品可以是任何可调用对象,只要返回的东西和路由期望的类型一致(这里是。是一个字典——key 是原始依赖函数,value 是替代品。
2026-07-30 22:39:34
620
原创 Python面向对象编程——让代码和现实世界对齐
继承Exception,用raise抛出,用as"""余额不足异常"""try:print(f'余额class InsufficientBalanceError(Exception) : """余额不足异常""" def __init__(self , balance , required) : self . balance = balance。
2026-07-30 21:15:27
329
原创 agent学习Day15——SQLAlchemy 查询过滤、分页与历史列表接口
这两关把数据从"能查"升级到"查得准、给得对"——3.1 让 Repository 学会过滤/排序/分页,3.2 让这些能力通过 API 有序地交给前端。分页响应的结构(items + total + page + size)是通用的——JD 列表要用,将来用户列表、订单列表也要用。的 fixture 每个测试前后自动清表——这是 3.2 的临时方案,4.1 会升级为内存数据库 + 依赖注入隔离,连开发库都不碰。3.1 解决了"数据库怎么查",3.2 解决"怎么把查到的数据通过 API 给前端"。
2026-07-29 21:24:59
435
原创 Python康复训练——数据结构
要顺序和改动就用 list,要定值就用 tuple,要按名查就用 dict,要去重算关系就用 set。但对列表、字典这类可变容器,通过一个名字改了,另一个名字看到的全跟着变——这种"幽灵联动"是新手 bug 的重灾区。列表、元组、字符串看上去不一样,但都遵守同一套"序列协议":能索引、能切片、能测成员、能拼接、能求长度。所有"通过某个标识取对应信息"的场景(联系人、配置、缓存、JSON)都该用字典。要"去掉重复元素"或做"哪些人既在 A 组又在 B 组"这类关系运算,用列表得手写循环,又慢又丑。
2026-07-29 19:42:56
318
原创 agent学习Day13——JD 记录持久化实战
阶段3·单元2 总结。本单元把「怎么把一条 JD 分析记录存进数据库、再安全地取出来」从头做了一遍:先摸清 Engine / Session / 事务边界,再用 Repository 模式把数据存取从业务里掰干净。代码均来自项目真实文件。
2026-07-27 22:23:55
163
原创 Python康复训练——Python基础
字符串是 Python 里最容易出问题、也最该吃透的类型。注意:声明 UTF-8 不代表文件真是 UTF-8 编码,编辑器也要用。编码全程 UTF-8;格式化优先 f-string。Python 用缩进来划分代码块,这是语法不是风格。两个小案例把前面知识点串起来(课件原版,可运行)。没有特殊业务要求,全程只用。重点:字符串不可变,所有。是最基础的人机交互。
2026-07-27 20:33:38
318
原创 agent学习Day12——从裸 SQL 到 ORM:SQLite 基础与 SQLAlchemy 模型定义
JD 分析结果,接口一返回就消失了——刷新、重启服务,啥都没了。下次想看"上周分析过哪几个 JD、结论是什么",去内存翻?去日志找?都不对。这篇就走这条路线。
2026-07-25 16:44:06
523
原创 agent学习Day10——单元测试体系化与mock隔离
阶段1 那些验证脚本(之类)是典型的"写完就丢"式验证:每个脚本自己连一遍,靠print加肉眼看结果,加一个新脚本就得记住一条新命令。print所以我引入pytest,用四件套解决:自动发现test_*.py、用assert当统一的"过/挂"判官、fixture把"前置准备"抽出来复用、让 fixture 全局共享,把散装验证收编成"一条命令重复跑、共享前置、结果可判定"的测试体系。
2026-07-18 18:15:49
436
原创 agent学习Day9——异常兜底与重试护栏
之前路由里只有一行——纯裸奔,零 try/except。service 层 catch 了异常也只是记日志再 raise,最后全砸到 FastAPI 默认兜底上。
2026-07-17 22:39:17
719
原创 anent学习Day8——async 异步与超时护栏
只设超时不用异步,慢调用依旧串行拖全局。把 LLM 调用从"同步排队陪等"升级成"异步并发 + 超时护栏",是接口扛住并发的关键一步。10 个人同时访问,同步写法就是排队:第 10 个人得等前面 9 个都跑完,总共 30 秒。而且等 LLM 的那 3 秒里 CPU 闲着,请求全在陪等。(同步阻塞),照样卡死,而且比同步还惨——它霸占事件循环,所有协程都调度不了,全站卡。比 demo 还猛,因为 LLM 调用"等网络"占比更高。不设超时会怎样:请求永久挂着不释放,连接池占满 → 雪崩。
2026-07-16 15:42:17
438
原创 agent学习Day7——依赖注入、中间件与 LLM 服务化
让代码从"能跑"走向"可控、可测、可维护"。依赖注入是地基,中间件是横切面的统一入口,服务化封装消除了启动期脆弱性,而覆盖测试则为前三者提供了可信保障。
2026-07-15 18:46:54
363
原创 FastAPI ——路由、请求响应、依赖注入与表单
概念解决什么问题关键工具Route定义接口路径与方法{path}收发数据、控状态码/头HeaderCookie抽公共逻辑、鉴权、资源清理Depends()yieldForm收 HTML 表单Form()参考来源:菜鸟教程 FastAPI 系列。
2026-07-14 22:22:32
585
原创 agent学习Day5——Ruff、日志与结构化 LLM 输出
此时 JSON 合法、类型也正确,Pydantic 无法发现,因为它只校验数据结构,不理解原始 JD 内容。今天先重新学习了项目工程规范。真正的项目应该使用 logging,因为日志有级别、时间、模块来源,也可以在以后接入文件或监控系统。本次完成的内容包括 LLM 调用封装、JD 分析主链路、日志、固定假响应测试和真实 JD 质量检查。每次真实调用都记录了 Prompt 长度、耗时和输出长度,平均耗时约 1 到 2 秒。日志只记录长度、耗时和状态,不记录完整 JD 或 API Key,避免敏感信息泄露。
2026-07-13 23:18:06
277
原创 FastAPI ——异步并发,async / await
异步代码的意思是:程序执行到某一点时,告诉计算机"我要等外面的某样东西完成"(比如慢文件、慢网络)。在等待的这段时间,计算机不是干等着,而是去处理别的工作;等那个慢任务好了,再回来取结果继续干。"等待外面"通常指相对于 CPU/内存速度来说很慢的I/O 操作客户端通过网络发数据 / 程序通过网络收数据系统从磁盘读文件 / 程序把内容写回磁盘调用远程 API数据库查询返回结果因为时间主要耗在"等 I/O"上,这类操作叫I/O 密集型。
2026-07-13 16:43:52
541
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅