- 博客(74)
- 收藏
- 关注
原创 springAI Alibaba Agent Framework 实战:快速使用
本文系统阐述了Agent的两种主流模式:工作流(Workflow)与智能体自驱(Agentic)。通过SpringAI与Alibaba Agent Framework实战案例,对比链式工作流、ReactAgent、SequentialAgent及状态图工作流(StateGraph)的实现。重点展示状态图如何以动态拓扑、条件边、状态合并策略实现灵活编排,支持复杂业务流程的可视化建模与代码同构,具备高可维护性与扩展性,是构建复杂多智能体系统的底层核心引擎。
2026-10-26 13:56:13
235
原创 spring ai1.0实战:ChatClient(2)
SpringAI通过Advisor机制实现AI对话的灵活拦截与增强,支持日志、敏感词及自定义拦截(如重读)。结合ChatMemory组件,可实现多轮对话记忆,支持内存与JDBC等持久化存储,并通过配置控制最大消息数。为应对Token限制,引入多层次记忆架构:近期、中期(RAG)、长期记忆。同时支持结构化输出,如布尔值与POJO类型,提升Agent逻辑判断与信息提取能力。
2026-10-13 18:53:05
310
原创 LLM理论:流式输出、重试、限流与结构化返回
本文系统梳理了生产级大模型调用的8个核心阶段,涵盖请求校验、上下文组装、Token预算预估、模型路由、流式传输与解析、状态回写及观测告警。重点对比同步与流式返回差异,阐明流式如何降低TTFT(首字延迟),并分析SSE、WebSocket、HTTP chunked三种流式协议适用场景。深入探讨流式异常处理(取消、超时、断流、重连)、可重试错误类型及幂等设计,提出基于用户、租户、模型、供应商四层限流策略,强调按TPM、RPM、并发等维度精细化控制。最后给出结构化输出失败后的四级兜底方案,确保系统稳定与用户体验平
2026-10-13 18:52:35
451
原创 SringAi 1.0实战:快速使用
本文介绍了基于Spring AI集成多款大模型的实践,涵盖DeepSeek、阿里百炼(Qwen)、Ollama本地模型等。通过配置API密钥与模型参数,实现文生文、文生图、文生语音、语音翻译及文生视频功能,并支持流式输出与Chain-of-Thought推理。重点展示了Spring AI在多模态、本地部署及高阶选项配置中的灵活应用,助力快速构建AI驱动的Java应用。
2026-10-09 19:26:28
230
原创 SpringAI 1.0 实战 :认识spring ai
SpringAI是面向AI工程的现代化框架,解决企业数据与大模型集成难题。核心特性包括提示词工厂、对话记忆(通过ChatMemoryRepository实现)、RAG技术实现企业数据互联,支持20+向量数据库。通过MCP将工具外部化,实现开箱即用。提供Agent应用模式:自评估优化、智能路由、编排器-工作者、链式调用与并行处理,助力构建高效、可扩展的大模型应用。
2026-10-08 19:18:19
198
原创 LLM理论:RAG基础
RAG(检索增强生成)将信息检索与大语言模型结合,通过动态检索外部知识库中的相关片段,提升LLM回答的准确性、时效性与可追溯性。它有效缓解知识滞后、幻觉问题,支持私有数据安全访问,广泛应用于客服、医疗、法律等需依赖更新或敏感资料的场景。其核心流程包括离线索引与在线检索生成,关键环节为文档切块、向量化、相似性检索与上下文构建。虽具知识更新成本低、可解释性强等优势,但受限于检索质量、延迟高、工程复杂及Token开销,需权衡使用。
2026-09-30 20:13:27
368
原创 LLM理论:Prompt基础
本文系统介绍Prompt设计核心要素与技巧:通过Role、Task、Context、Format四要素构建高效指令,结合角色扮演、思维链(CoT)、小样本学习与任务分解等策略提升输出质量。区分System Prompt(规则)与User Prompt(任务)边界,确保模型既遵循长期规范又精准完成具体任务,适用于代码评审、方案设计等复杂场景。
2026-09-29 19:38:48
238
原创 LLM理论:结构化输出
调用大模型返回 JSON,看似简单,实际却常常踩坑:格式漂移、字段缺失、类型错位,甚至边界输入直接让输出崩溃。本文面向正在用大模型做结构化输出的后端开发者,系统梳理这些不可靠现象背后的原因,并对比 JSON Mode、JSON Schema、Structured Outputs 与 Function Calling 的边界。读完你会明白:为什么一句"请返回 JSON"远远不够,以及如何用工程契约让模型输出真正可校验、可消费。
2026-09-29 19:38:24
481
原创 Java进阶 深入解析JVM核心架构与运行原理
本文系统解析了JVM的架构与工作机制。JVM作为Java程序运行的核心,通过类加载、运行时数据区、执行引擎和本地方法接口等模块实现跨平台执行。重点分析了类加载的双亲委派机制、运行时数据区的组成(程序计数器、虚拟机栈、堆、方法区等)及其内存管理特点,详细探讨了垃圾回收算法(标记-清除、复制、压缩)和不同垃圾收集器(CMS、G1等)的工作原理与性能指标。文章还介绍了JVM调优的关键参数设置,帮助开发者深入理解JVM运行机制并进行性能优化。
2026-09-28 21:00:40
367
原创 LLM理论:Token、上下文窗口、Temperature
本文深入解析 LLM 的 Token 运行机制,重点剖析多模态图片输入的 Token 折算规则与成本控制方法,对比 OpenAI、Anthropic、Gemini 三大视觉模型的计费差异,并给出图片 Token 超预算、TTFT 延迟过高等常见问题的排查与优化方案,帮助开发者合理规划上下文窗口与 Token 预算。
2026-09-28 20:45:43
236
原创 C语言 第七章 常用函数(4)
在内存的动态存储区(堆区)中分配 n 个、单位长度为 size 的连续空间,总共占用 n*size 个字节,将该空间首地址作为返回值。将指针 p 指向的动态空间大小改为 size (单位字节),返回全新地址(数据自动复制)或原地址,分配失败返回 NULL。解决办法:使用内存前检查指针是否为 NULL ,如函数参数指针,在函数入口处用 if(p==NULL) 或 if(p!返回值为 NULL : malloc 可能分配失败返回 NULL (值为0,不可读写),使用时需检查,避免错误。
2026-09-19 20:01:00
229
原创 C 语言 第七章 常用函数(3)
头文件定义了各种数学函数。在这个库中所有可用的功能都带有一个 double 类型的参数,且都返回 double 类型的结果。从 source 开始位置向后复制 num 个字节的数据到 destination 的内存位置。将 ptr 指向的内存块的前 num 个字节设置为指定的值,一般用来初始化数组。以下函数定义都在 string.h 头文件中,使用前需要先导入。
2026-09-19 20:00:23
417
1
原创 C语言 第七章 常用函数 (2)
在程序开发中,我们经常需要将基本数据类型转成字符串类型(即 char 数组) 或者将字符串类型转成基本数据类型。
2026-02-07 20:54:27
321
原创 C语言 第六章 结构体(3)
输入一个班级的学生信息(包含id、name、gender、score),并把学习成绩超过全班平均成绩的学生找出来,输出这部分学生的姓名和成绩。先定义结构体类型,然后用结构体类型定义数组变量。先声明一个结构体类型,再用此类型定义结构体数组。struct 结构体名 {} 数组名[数组长度];
2025-05-12 19:30:00
483
原创 C语言 第六章 结构体(2)
/ b.name=宝马,b.price=40000.00。结构体的成员也是变量,那么成员可以是基本数据类型,也可以是数组、指针、结构体等类型。说明:如果成员本身又属一个结构体类型,则要用若干个 .,一级一级地找到最低的一级的成员。//这里默认的是int型,如需其他类型可修改。//指向Node型变量的指针。Name name = {"美美","韩"};
2025-05-09 18:30:00
1506
原创 C 语言 第六章 结构体(1)
struct 的数据类型声明语句与变量的声明语句可合并,struct 结构体名 {成员列表} 结构体变量名列表;举例char* name;int age;return 0;struct {成员列表;} 变量名列表;int age;//可在声明变量时赋值:struct {char* name;int age;
2025-05-07 18:30:00
1045
原创 C 语言 第五章 指针(6)
指针运算如果只是对单个变量操作其意义和作用不是很明显,在前面我们提到指针的很多操作都是和数组有关的,在一个连续存储空间中能发挥巨大作用,所以在此将指针在数组中的应用作为专题。数组是用来存放一系列相同类型的数据,当然数组也可以用来存放指针,这种用来存放指针的数组被称为指针数组,它要求存放在数组中指针的数据类型必须一致。上述字符串数组,其实是一个一维数组,成员是7个字符指针,每个指针指向一个字符串(字符数组)。arr是一个数组,有5个元素,每个元素是一个整型指针,需要使用下标来区分。能够指向整型数据的指针。
2025-05-02 18:45:00
847
原创 C 语言 第五章 指针(5)
为什么在 test() 函数内变量 a 和 b 的值改变,而主调函数 main() 中实参 x 和 y 却没有改变?
2025-05-01 22:15:06
1091
原创 C 语言 第八章 文件操作
变量、数组、结构体等数据在运行时存储于内存中,程序结束后内存数据会被释放。若需长久保存数据,可写入文件或数据库。文件是数据源的一种(如 word 文档、txt 文件、excel 文件、avi 文件等),作用是保存数据(如图像、视频、声音等)。
2025-04-13 22:24:42
1230
原创 JBDC java数据库连接(2)
基于以下的原因: 1、代码的可读性和可维护性. 虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读 性还是可维护性上来说.都比直接用Statement的代码高很多档次: stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
2025-04-08 21:56:31
732
原创 JBDC Java数据库连接(1)
JDBC(Java DataBase Connectivity)java数据库连接是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它由一 组用Java语言编写的类和接口组成,提供了诸如查询,新增,修改,删除更新数据库中数据的 方法有了JDBC规范(接口),不同的数据库开发商根据规范中的方法进行实现,开发人员面对的是 统一的接口.Java定义者制定了JDBC规范 不同数据库开发商对接口进行实现 程序员学习使用标准规范。
2025-04-07 23:14:27
878
原创 数据库 第一章 MYSQL基础(5)
其他字段组成的这行记录和主键表示的是同一行数据,它们只需要依赖于主键,也就成了唯一的。如果数据库表中的所有字段值都是不可分解的原子值,就 说明该数据库表满足了第一范式。inner join 表2 on 表1.column1 = 表2.column2。left join 表2 on 表1.column1 = 表2.column2。含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询。笛卡尔乘积现象:表1有m行,表2有n行,结果=m*n。● 外键:使用外键引用另外一个数据表的某条记录。
2025-04-03 21:15:50
1267
原创 数据库 第一章 MYSQL基础(4)
当使用union 时,mysql 会把结果集中重复的记录删掉,而使用union all , mysql 会把所有的记录返回,且效率高于union。[SQL 语句 1] UNION ALL [SQL 语句 2][SQL 语句 1] UNION [SQL 语句 2]对查询的显示结果限制数量 (sql语句最末尾位置)功能:用作统计使用,又称为聚合函数或统计。
2025-04-02 20:02:42
726
原创 数据库 第一章 MySQL(3)
DQL(Data Query Language)数据查询语言,查询是使用频率最高的一个操作, 可以从一个表中查询数据,也可以从多个表中查询数据。可以有多个when ifnull(被检测值,默认值)函数检测是否为null,如果为null,则返回指定的值,否则返回 原本的值。: select * from table 处理函数:select 函数 from table;:如concat、length、ifnull等,会对查询的每行进行处理。做统计使用,又称为统计函数、分组函数,会将多行处理为一行。
2025-04-01 23:31:47
1370
原创 数据库 第一章 MySql基础(1)
数据库(DataBase)为了方便数据的存储和管理,它将数据按照特定的 规则存储在磁盘上,就是一个存储和管理数据的仓库。
2025-03-25 22:50:53
1171
1
原创 C 语言 第五章 指针(4)
两个指针相减,通常两个指针都是指向同一数组中的元素才有意义。结果是两个地址之差除以数组元素的长度。不相干的两个变量的地址,通常没有做减法的必要。指针之间可进行==、!=、<、<=、>、>=比较,比较内存地址大小,返回1(真)或0(假)。
2025-03-20 21:45:00
631
原创 C语言 第五章 指针(3)
指针本质上就是一个无符号整数代表了内存地址。除了上面提到的取址、取值外,指针还可以与整数加减、自增自减、同类指针相减运算等。但是规则并不是整数运算的规则。指针类型变量也可以进行自增或自减运算,如下:注:++和--,这里针对指针的增加或减少指的是内存地址的向前或向后移动。当对指针进行++时,指针会按照它指向的数据类型字节数大小增加,比如int*指针,每++一次,就增加4个字节。当对指针进行--时,指针会按照它指向的数据类型字节数大小减少,比如int*指针,每--一次,就减少4个字节。
2025-03-19 19:17:27
2125
原创 C语言 第五章 指针(2)
在C语言中针对指针运算还提供了一个取值运算符,使用“*”符号表示。其作用与&相反,根据一个给定的内存地址取出该地址对应变量的值。也称为解引用符号。
2025-03-18 20:32:44
719
原创 C语言 第五章 指针(1)
一般格式:数据类型* 指针变量名 [=初始地址值];数据类型是指针变量所指向变量的数据类型。可以是int、char、float等基本类型,也可以是数组等构造类型。字符* 用于告知系统这里定义的是一个指针变量。举例: int* p;,读作“指向int的指针”或简称“int指针”,这是一个指针变量,用于存储int型的整数在内存空间中数据的地址。r变形写法: int *p;注意:指针变量的名字是p,不是*p。
2025-03-17 23:00:24
1347
原创 C语言 第四章 数组(4)
eg.该二维数组a由三个一维数组a[0]、a[1]、a[2]构成,每个一维数组有4个元素,共12个成员(3×4 = 12)。也可简化理解为矩阵形式,按行和列排列。声明与初始化同时进行eg.相当于将第一维的每个成员写成一个数组。
2025-03-14 20:42:32
909
原创 C语言 第四章 数组(3)
针对代码 int a[5] = {1,2,3,4,5};数组名记录数组首地址(即a[0]的地址),元素连续分布。假设a[0]地址是0x1122 ,则 a[1]地址= a[0]的地址+int字节数(4)= 0x1122 + 4 = 0x1126,a[2]地址= a[1]地址 + int字节数(4)= 0x1126 + 4 = 0x112A,依次类推。
2025-03-13 23:05:17
1335
原创 C语言 第四章 数组(2)
功能是判断一个包含10个元素的整型数组中是否存在指定数字(此处为9)。方法:代码先定义了一个有10个元素的整型数组 arr 并初始化,同时定义了一个整型变量 mark 并初始化为0,用于标记是否找到指定元素。接着通过 for 循环遍历数组,当数组元素等于9时,打印“数组中包含9”并将 mark 赋值为1。循环结束后,根据 mark 的值判断,若仍为0,则打印“数组没有中包含9”。主要功能是求解一个整型数组中的最大值、最小值、总和以及平均值。方法:处理一个包含10个元素的整型数组。
2025-03-12 19:30:00
595
原创 C语言 第四章 数组(1)
数组通过变量名后加方括号表示,方括号里是数组容纳成员数量(即长度)。如int arr[10];表示数组arr包含10个成员,每个成员都是int类型。声明数组时,必须给出数组大小。2数组可在声明时用大括号对每个成员赋值。等同于//数组长度为5。
2025-03-11 20:30:00
1006
原创 C 语言 第三章 函数(5)
在函数之外定义的变量就是外部变量,称为全局变量 (或全程变量)。一个程序中,凡是在全局变量之后定义的函数,都可以使用在函数之前定义的全局变量。也就是说,一个全局变量,可以被多个函数使用,但并不一定能被所在程序中的每一个函数使用。如果全局变量与函数中定义的局部变量重名,则在函数内部调用此同名的变量,默认是局部变量(就近原则)动态存储方式:在程序运行期间根据需要进行动态的分配存储空间的方式,数据存放在动态存储区。在动态存储区中存放以下数据函数形参:在调用函数时给形参分配存储空间。
2025-03-10 19:30:00
1259
原创 C 语言 第三章 函数(4)
1、使用递归函数大大简化了算法的编写。2、递归调用会占用大量的系统堆栈,内存耗用多,在递归调用层次多时速度要比循环慢的多,所以在使用递归时要慎重。3、在要求高性能的情况下尽量避免使用递归,递归调用既花时间又耗内存。考虑使用循环迭代。
2025-03-09 20:00:00
1146
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅