- 博客(608)
- 收藏
- 关注
原创 双精度(float64)、单精度(float32),为什么把float64说成是双精度,把float32说成是单精度
IEEE754浮点数标准中,32位浮点数被称为"单精度",64位浮点数被称为"双精度",这两个名称源自1970年代的标准定义,代表不同的精度等级而非字面意义。具体来说,float32具有23位尾数(约7位有效数字),属于基础精度;float64具有52位尾数(约15-16位有效数字),属于更高精度等级。这种命名类似于服装尺码的S/M/L分级,表示精度级别而非精确倍数关系。例如存储π时,float32只能精确到7位,而float64可精确到15位,体现了精度级别的差异。
2025-11-14 23:41:24
589
原创 拼接“音频片段”生成完整文件
这段代码b"".join(audio_chunks)实现了将多个音频数据片段拼接为一个完整音频文件的功能。核心要点:1) b""表示空字节串,用于处理二进制数据而非文本;2) .join()方法将列表中的字节片段按顺序连接;3) 所有音频片段必须是bytes类型。该操作将离散的音频数据块(如WAV/MP3片段)无缝拼接成连续可播放的音频流,适用于语音合成、录音处理等场景。文中通过模拟示例展示了字节拼接过程,并解释了其在实际音频处理中的应用原理。
2025-10-22 14:10:32
607
原创 密集向量,稀疏向量,二进制向量 之间有什么区别和联系
摘要: 密集向量(Dense Vector)、稀疏向量(Sparse Vector)和二进制向量(Binary Vector)是机器学习中常用的三种向量表示方法。密集向量由连续浮点数组成,通常由神经网络生成,用于捕获语义信息(如BERT嵌入)。稀疏向量大部分维度为0,适用于词袋模型或TF-IDF,高效存储非零特征。二进制向量仅用0/1表示特征存在性,适合布尔场景(如图片哈希)。三者区别在于数值类型、维度和应用场景:密集向量适合语义匹配,稀疏向量用于关键词检索,二进制向量用于快速特征比对。现代系统(如Milv
2025-10-21 14:59:18
1843
原创 langGraph 恢复不是“继续”,而是“重跑 + 带已有上下文”
LangGraph中断恢复与Python input()的区别 Python的input()是真正暂停程序执行,恢复后从中断点继续;而LangGraph的恢复机制是中断后重新执行节点函数,而非从中断点继续。 关键差异: input():恢复后从中断行继续 LangGraph:恢复后从节点函数开头重新执行(利用上下文数据继续流程) 示例: Python:input()暂停后输入Alice,程序从原位置继续 LangGraph:恢复时重跑整个节点函数,通过Command(resume=...)注入新数据 本质区
2025-10-14 10:37:44
646
原创 langgraph中全量更新(values 模式)和增量更新(updates 模式)
摘要:增量更新(incremental update)是一种只传输变化部分数据的更新方式,区别于全量更新需要发送完整数据。增量更新通过维护当前状态,将接收到的"补丁"数据逐步应用到现有状态上,从而获得最新完整状态。这种方式能显著节省带宽、提升性能,特别适合处理大数据或需要实时更新的场景。全量更新则直接覆盖原有数据,适合数据量小的简单场景。在实际应用中,增量更新更具优势,尤其当数据量庞大时能有效避免性能问题。
2025-09-26 15:19:52
414
原创 continue跳啊跳过,在模型输出结果有啰嗦时用得上哦
continue用于跳过当前循环的剩余代码,直接进入下一轮循环。示例中,当i=3时,不加continue会继续执行并打印"数字:3";而加了continue后,遇到3就直接跳过,不执行后续打印语句。对比结果显示:前者会输出1-5所有数字,后者则跳过3,仅输出1,2,4,5。
2025-09-25 11:42:21
261
原创 VSCode 的 launch.json 配置
VSCode调试Python时,launch.json中的program、module和code字段是互斥的。对于需要导入模块的情况(如from agents import ...),推荐使用module方式而非program。正确配置示例指定module字段并设置PYTHONPATH以解决导入问题。若必须使用program模式,需直接指定脚本路径并同样配置PYTHONPATH,但可能遇到导入错误。调试时需确保仅使用一种启动方式。
2025-09-21 16:26:10
376
原创 vscode在断点旁边写expression让条件为true的时候才触发断点提高调试效率
VSCode条件断点使用指南:通过右键断点选择"Edit Breakpoint"可设置三种触发方式:1)表达式条件(如x==5时中断);2)命中次数(如第10次执行时中断);3)日志输出(不中断仅打印信息)。典型应用场景包括循环调试(如i==5时暂停)和复杂条件监控(如列表长度超限时中断)。该功能可有效提升调试效率,避免不必要的程序中断。
2025-09-20 20:59:30
548
原创 依赖注入机制
依赖注入(DI)是一种软件设计模式,通过从外部传递依赖对象而非内部创建,实现解耦和灵活性。FastAPI利用Depends自动注入依赖(如数据库连接、身份验证),减少重复代码并提升可测试性。例如,可通过依赖注入验证Token或管理数据库连接,使代码更简洁、可维护。其核心优势在于解耦功能、减少冗余逻辑,并支持灵活的测试场景。
2025-09-19 11:58:26
943
原创 invoke 和 ainvoke踩坑记录
本文通过报错分析,对比了LangGraph中invoke和ainvoke的区别。关键点在于:当节点函数是异步(async def)时,必须使用ainvoke调用;同步函数则需用invoke。 通过代码示例演示了两种调用方式: 同步节点会阻塞整个流程(耗时2秒) 异步节点允许并发执行其他任务(后台任务可同时运行) 最终结论: invoke适用于同步函数(阻塞式) ainvoke适用于异步函数(非阻塞,支持并发) 区别本质在于同步阻塞与异步并发的不同特性。
2025-09-19 10:27:10
478
原创 tuple/dict/list 这三个数据类型在取值时候的区别
Python三种数据结构的取值方式对比 list(列表):有序可变序列,通过从0开始的下标取值,如fruits[0]取第一个元素。 tuple(元组):有序不可变序列,同样用下标取值,如point[1],但内容不可修改。 dict(字典):无序键值对,通过键名取值,如person["age"],而非位置索引。 总结:list和tuple按位置取,dict按键名取;list可变,tuple不可变。比喻:list如排队,tuple如固定成绩单,dict如电话本。
2025-09-16 21:45:04
317
原创 不同 stream_mode 下 graph.stream()比较 values、updates、messages 三种流式输出的差别
这篇文章演示了如何使用LangGraph库构建并运行一个简单的状态图,展示了不同流式输出模式的差异。以下是核心要点: 构建流程: 定义包含topic和joke字段的State类型 创建两个处理节点:refine_topic(扩展主题)和generate_joke(生成笑话) 连接节点形成完整执行流程 流式输出模式: values模式:每步输出完整状态 updates模式:每步输出增量更新(带节点名) 混合模式:同时获取两种输出 messages模式:流式输出LLM消息token 功能演示: 从初始输入&qu
2025-09-16 11:42:57
1305
原创 LangGraph 在不同的 stream_mode 下返回的东西并不一样
本文解释了LangGraph中不同流式模式(stream_mode)下返回数据结构的差异。当使用stream_mode="messages"时,返回的是LLM原始消息对象(如AIMessage),不会包含自定义的joke字段;而stream_mode="values"则会返回状态更新字典。通过代码示例验证:return {"joke":...}实际更新的是graph state,只有在values模式或invoke时才能看到完整状态。建议根据需求选
2025-09-16 10:41:57
499
原创 OpenAI 的流式响应 (streaming chunks)
这是一段用于处理OpenAI流式响应的Python代码片段,主要功能是过滤无效数据块。代码通过hasattr()检查数据块chunk是否包含choices属性,同时验证该属性是否为空。若满足任一条件则跳过当前循环,避免处理空数据或无效内容。这在OpenAI的流式响应场景中特别有用,能有效过滤掉心跳包等无实际内容的数据块,只处理包含有效文本的数据。最终输出会拼接成完整的响应内容,如"你好"。这种处理方式既保证了数据处理的稳定性,又提高了代码的健壮性。
2025-09-15 21:35:33
1023
原创 Invalid message: Found duplicate in “env“: OPENAI_API_KEY问题修复
VSCode调试报错"Found duplicate in env: OPENAI_API_KEY"是由于环境变量重复定义导致。主要解决方法包括:1)检查launch.json,避免env和envFile同时定义相同变量;2)清理.env文件中的重复定义;3)检查系统或Conda环境变量;4)移除Python脚本中的重复赋值。确保运行时每个环境变量只定义一次即可解决该问题。
2025-09-07 09:59:50
531
原创 st.session_state 的存储机制
摘要:st.session_state是Streamlit服务器内存中的临时会话存储,与Python进程绑定,不写入持久化介质。刷新浏览器不会丢失数据,但重启服务器、切换会话或长时间闲置会导致数据清除。它仅适用于短期会话状态管理,如需长期保存需自行实现文件、数据库或前端存储方案。(149字)
2025-08-11 16:01:48
663
原创 协程(Coroutine)、线程(Thread)、进程(Process)三者的区别和联系
本文简明扼要地解释了Python中协程、线程和进程的关键区别。主要内容包括: 概念对比:进程是独立程序,线程是进程内的并发任务,协程是线程内更轻量的任务切换方式 特性比较: 进程:真并行、高开销、内存隔离,适合CPU密集型任务 线程:伪并发、中等开销、共享内存,适合IO密集型任务 协程:伪并发、极低开销、共享内存,适合异步IO任务 核心区别:协程主动交出控制权,线程和进程由操作系统调度 使用建议:CPU密集型用多进程,IO密集型用协程或多线程,轻量级任务优选协程 文章通过通俗类比和表格对比,清晰展示了三者的
2025-08-05 10:22:37
787
原创 asyncio.to_thread(...) 会把你传入的同步函数 丢到另一个线程中执行
asyncio.to_thread()将同步函数放到线程池中异步执行,避免阻塞主线程。它内部使用ThreadPoolExecutor默认线程池,可复用线程资源。通过await等待执行结果,适合处理CPU密集型或阻塞型任务。本质上是在后台线程同步执行函数,但提供了异步调用的接口。默认线程池最多32个线程,能有效避免频繁创建线程的开销。这种方法让主协程保持响应,特别适合需要同时处理I/O和计算任务的场景。
2025-08-05 10:15:37
293
原创 PyPDFLoader
PyPDFLoader是LangChain中用于加载PDF文本内容的工具,可将PDF转换为适合大模型处理的Document对象。它提取每页文本并生成带元数据(文件名、页码)的结构化文档,适用于RAG问答、摘要等任务。使用时需注意其依赖底层PDF解析器,无法处理图像和复杂表格。可通过自定义加载器结合PyPDF2获取更多PDF元信息(作者、标题等),增强文本处理能力。典型应用流程包括:PDF加载→文本分割→向量化→检索→LLM问答。
2025-08-01 15:35:39
993
原创 LangChain 中会经常遇到 .run() 和 .invoke(),理解它们的区别和联系能更灵活地控制链的执行方式
摘要: LangChain中.run()和.invoke()的主要区别在于输入处理与适用场景。.run()仅支持单一输入字段,适用于简单链(如LLMChain),而.invoke()能处理多字段输入,兼容复杂链(如Runnable)。例如: 简单场景(单字段):LLMChain.run("查询患者")等价于.invoke({"question":"查询患者"})。 复杂场景(多字段):如同时传递schema和question,必须使用.invoke
2025-07-03 21:10:46
731
原创 Neo4j 的向量搜索(Neo4jVector)和常见的向量数据库(比如 Milvus、Qdrant)之间的区别与联系
摘要 Neo4j向量存储与Milvus/Qdrant都支持向量检索和语义搜索,但核心定位不同。Neo4j将图数据库与向量搜索结合,适合结构化知识图谱问答;Milvus/Qdrant专注于高性能向量检索,适合大规模文档搜索。Neo4j的优势在于图结构与语义搜索的融合,而Milvus/Qdrant在纯向量相似度检索方面性能更优。选择取决于应用场景:结构化信息查询用Neo4j,纯文本语义匹配用Milvus/Qdrant。
2025-07-03 09:32:33
1732
原创 Cypher 是 Neo4j 专用的查询语言
摘要:Neo4j与SQL数据模型存在本质差异:1)Neo4j节点支持多标签(SQL每行仅属单一表);2)采用无模式结构,节点属性可动态扩展(SQL需预定义表结构);3)将关系作为一等公民,支持带属性的有向边(SQL仅能通过外键隐式关联)。核心区别在于Neo4j通过节点间的显式连接实现图遍历,而SQL依赖表联结。二者的数据单位、分类方式和连接机制均不相同,Neo4j更适合处理复杂关联数据。(149字)
2025-07-01 14:11:47
474
原创 Milvus 资源调度系统的核心部分:「查询节点」「资源组」「数据库」
Milvus系统的资源管理架构分为三层:查询节点(底层执行单元)、资源组(逻辑资源调度单元)和数据库(数据存储逻辑单元)。查询节点是实际执行向量检索的计算实例,运行在物理机或容器中;资源组将查询节点分组管理,实现不同优先级或租户的资源隔离;数据库作为顶层逻辑存储单元,通过绑定特定资源组来分配计算资源。这种分层架构类比图书馆系统(管理员组-分馆-书架),支持多租户场景下的资源隔离与优先级调度,例如为VIP客户分配专属高性能资源组。三层结构形成"数据库←资源组←查询节点"的资源映射链条。
2025-06-26 10:34:30
965
原创 Milvus中 Collections 级多租户 和 分区级多租户 的区别
摘要:本文探讨了Milvus向量数据库中实现多租户RAG的三种方案:1)所有租户共享一个Collection并用字段过滤;2)每个租户使用独立分区;3)基于Partition Key的自动分区方案。这三种方案虽然在结构上都通过租户ID区分数据,但在性能、隔离性、可扩展性等方面存在本质差异。文章详细比较了各方案的优缺点,指出字段过滤属于后过滤机制,而分区方案通过预过滤能显著提升性能。其中,Partition Key方案最适合海量租户场景,但需Milvus 2.3+版本支持。选择合适的方案需综合考虑租户规模、性
2025-06-26 10:19:13
1240
原创 虽然 8bit 和 4bit 在内存里是“整数”,但我们用它们去代表小数,靠的是“先记录 min/max,再换算回来”
摘要:8bit和4bit量化通过整数编号映射小数区间,实现高效存储。首先确定数据范围(min/max),将区间切分为256或16格,每个整数编号对应特定小数值(如8bit编号128≈0.0)。量化公式quantized = round((float_val-min)/(max-min)*(levels-1))将浮点数转为整数,反量化时还原为近似小数。4bit示例中,编号8映射到0.0,步长0.133。量化本质是用有限整数离散化无限小数空间,平衡精度与存储效率。(150字)
2025-06-18 16:47:52
526
原创 NF4 是一种更聪明的 4bit 压缩方法,它知道「有些值在神经网络里很常见」,所以就把稀缺的 4bit 编码资源优先给这些常见值更高的精度,稀有值就少给点精度
NF4是一种智能4bit量化方法,不同于传统线性均匀量化,它会根据神经网络参数的实际分布特点进行非线性优化。分析发现模型参数多集中在中间区域[-0.5,0.5],两端值较稀疏。因此NF4将有限的4bit编码(16个值)优先分配给高频区域,在[-0.3,0.3]区间设置更精细的分级(如0.05步长),而对低频的极端值(如±1.0)则分配较粗精度。实验表明,这种分配策略使常见中间值的量化误差显著小于线性方法,整体模型精度更接近原始浮点模型,而极端值的少量精度损失对整体影响很小。
2025-06-18 16:38:10
896
原创 为什么即使模型已经被 4bit 量化,仍然可以设置 bnb_4bit_compute_dtype=“float16“,并使用 NF4 算法来量化
文章摘要:本文解释了量化LLM模型的存储与计算过程,重点说明4bit量化仅作用于权重存储而非计算阶段。通过BitsAndBytesConfig参数解析,指出4bit权重会在计算时解码为float16进行运算以保持精度。文章对比了NF4先进量化算法与传统方法的区别,并用矩阵示例演示了4bit存储与float16计算的完整流程。最后强调直接4bit运算不可行的原因,以及"存储用4bit、计算用float16"的主流做法,帮助读者理解模型量化中的精度转换原理。
2025-06-18 16:37:05
827
原创 BitsAndBytes(简称 BnB)是一个用于“压缩”大语言模型的工具包
**BitsAndBytes(BnB)**是一个用于压缩大语言模型的工具包,能将16/32位模型压缩至4/8位,显著降低显存占用,同时保持较高精度。它通过8-bit和4-bit量化技术实现模型瘦身,支持多种量化模式(如nf4、fp4、int4)。例如,LLaMA 2-7B模型经BnB压缩后,显存需求从14-16GB降至4-5.5GB(4-bit)。开发者只需简单配置即可加载压缩模型,使其能在消费级显卡上高效运行。BnB平衡了精度与资源消耗,是部署大模型到资源有限环境的实用解决方案。
2025-06-18 16:29:30
1658
原创 浮点数(floating point number)在计算机中的三大组成部分:符号位(sign bit)、指数位(exponent) 和 尾数位(mantissa,也叫 significand)
浮点数由符号位、指数位和尾数位三部分组成,共同决定数值的正负、范围和精度。以32位单精度浮点数(FP32)为例,1位符号位控制正负,8位指数位决定数值大小级别(采用偏移编码),23位尾数位存储小数精度(隐含前导1)。计算公式为:(-1)^符号位 × 1.尾数 × 2^(指数-127)。例如,指数位01111111(127)减去偏移量127得到实际指数0,尾数全0表示1.0,符号位0则值为+1.0,符号位1则为-1.0。不同浮点格式(FP32/FP16/BF16/INT8)在精度、范围和适用场景上各有特点,F
2025-06-18 14:22:58
2566
原创 什么是“精度”?
这篇文章解释了表格中"精度举例"一列的真正含义:它表示的是浮点数据类型的最小可分辨差值(machine epsilon/ULP),而非十进制小数位数。重点包括:1)FP32等浮点数的精度指数值间的可区分最小间隔,由尾数位和指数位共同决定;2)INT8是整数类型,不能表示小数;3)提供了Python代码示例来验证不同浮点类型的精度差异。文章澄清了精度与小数位数之间的区别,强调精度反映的是数值分辨率而非小数点后位数。
2025-06-18 11:50:05
1426
原创 值接近于 1 + (1 - 2^-23) = 1.99999988这里为什么用1 + (1 - 2^-23) 而不是直接2^-23
摘要:IEEE 754浮点数尾数全为1时,其23位二进制小数总和约为(1 - 2^-23),加上隐含的整数1后,整体值为1 + (1 - 2^-23) ≈ 1.99999988,接近但不到2。这是几何级数求和的结果,而非直接用2^-23表示。
2025-06-18 11:30:01
257
原创 指数位的本质:用于控制数值的“数量级”(2 的多少次方)
FP32、FP16和BF16浮点数格式中,指数位的最大值受到偏移编码和特殊值保留的限制。FP32和BF16使用8位指数,最大指数位值为254(11111110),对应真实指数127;FP16使用5位指数,最大指数位值30(11110),对应真实指数15。由于IEEE 754标准保留全1指数位(如FP32的255)表示特殊值(Inf/NaN),实际可用指数范围减少。浮点数最大值由接近1.999的尾数(全1)乘以2的最大指数次方计算得出,如FP32约为3.4e38。尾数全1时,23位小数位累加得到1.99999
2025-06-18 11:27:37
1111
原创 浮点数的“偏移编码”(biased exponent)机制
计算机二进制无法直接表示负指数,因此FP32浮点数采用"偏移编码"方法存储指数。8位指数位通过127的偏移量,将真实指数范围(-126到+127)转换为1-254的无符号存储值。计算真实指数时需减去127,例如存储值129对应真实指数+2(2²),125对应-2(2⁻²)。这种偏移机制解决了负指数的存储问题,是IEEE 754标准的核心设计之一。
2025-06-18 11:13:38
612
原创 bit(比特)是什么
【摘要】比特(bit)是计算机最小的信息单位,表示0或1两种状态,对应电路的通断。多个比特组合可表示更复杂信息:1bit表示两种状态,8bit构成1字节(256种可能)。比特是数据存储的基础单位,例如英文字符占8bit,汉字占24bit。需注意bit(b)与字节(B)的区别(1B=8b)。理解比特机制是掌握计算机数据表示原理的关键,它揭示了电子信号如何转化为数字信息。
2025-06-18 09:35:25
1510
原创 bit、byte、char 的区别和联系
【字节、位与字符关系速览】 一个bit是最小单位(0/1),8bit=1byte(字节)。ASCII编码下,1个英文字符=1byte(如"A"=01000001),"ABC"占3字节(24bit)。但中文字符在UTF-8中占3字节(如"中文"=6字节/48bit)。简记:英文字符1byte,中文常用3byte,实际占用取决于编码方式。
2025-06-18 09:30:22
984
原创 pipeline 和AutoTokenizer, AutoModelForSequenceClassification的区别和联系是什么
摘要: Hugging Face 提供两种接口层级: 1️⃣ pipeline:一键式工具(如点外卖),适合快速调用预置任务(如文本分类),简化流程但灵活性低。 2️⃣ AutoTokenizer+AutoModel:手动分步处理(如自己做饭),需编码分词、模型推理等步骤,适合定制化需求或研究场景。 核心区别: 易用性:pipeline更简单(⭐vs⭐⭐⭐) 灵活性:底层接口支持模型微调、结构修改和多模态输入 适用场景:原型开发用pipeline,精细控制选底层接口 代码示例: # pipeline一键预测
2025-06-17 09:43:20
359
原创 AutoTokenizer 和 AutoModelForSequenceClassification 是不是可以导入任何模型?
摘要: Hugging Face的AutoTokenizer和AutoModelForSequenceClassification并非适用于所有模型,需根据任务类型匹配对应类。 ✅ 可用场景:AutoModelForSequenceClassification仅支持文本分类模型(如情感分析)。 ❌ 限制:加载非分类模型(如GPT-2)会报错,需改用其他类(如生成任务用AutoModelForCausalLM)。 🔍 关键点: 模型任务类型须与AutoModelForXXX匹配(分类、生成等)。 通过模型页
2025-06-17 09:39:10
524
原创 在正则表达式中语法 (?P<名字>内容)
本文详细解释了Python正则表达式中的(?P<xxx>...)命名捕获组语法。主要知识点包括: 该语法用于给捕获组命名(如(?P<name>.+)),通过match.group("name")可直观提取内容 与普通捕获组(.+)(需用数字索引提取)相比,命名捕获组更易读易维护 这是Python特有语法,其他语言如JavaScript使用(?<name>...)写法 包含完整示例:从客户信息中提取姓名和电话号码,对比了命名组和普通组的使用差异 总结口诀
2025-06-13 09:56:33
629
原创 BLOB 是用来存“二进制大文件”的字段类型
摘要: BLOB(Binary Large Object)是数据库中用于存储二进制大文件的字段类型,支持0-64KB数据(如TINYBLOB为255字节)。适用于图片、音频、PDF等非文本内容,通过二进制直接存入数据库(如Python用rb读取文件并插入)。实际应用中需注意:大文件建议改用MEDIUMBLOB(16MB)或外部存储,且频繁访问场景效率较低。示例演示了用户头像从文件读取→BLOB存储→恢复为文件的完整流程,并对比了不同BLOB类型的容量差异。关键点:BLOB是数据库的“二进制文件柜”,但需权衡
2025-06-05 21:38:03
577
原创 float、double 这类 浮点数 相比,DECIMAL 是另一种完全不同的数值类型
摘要:DECIMAL是定点数类型,用于精确存储小数值(如金额、利率等),与FLOAT/DOUBLE浮点数不同,它不会产生计算误差但性能稍低。Python中使用decimal.Decimal进行精确计算,SQL中通过DECIMAL(M,D)定义字段精度。金融、财务等场景推荐使用DECIMAL,而科学计算、AI等对精度要求不高的场景更适合FLOAT。关键区别在于:DECIMAL保证精确性,FLOAT追求性能。
2025-06-05 21:20:25
1120
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅