- 博客(71)
- 资源 (1)
- 收藏
- 关注

原创 LangChain-LangGraph框架 应用实例
LangGraph是LangChain的高级库,为大型语言模型(LLM)带来循环计算能力。LangGraph建立在LCEL之上,允许高效地协调应用程序组件,同时保持简洁和可读的代码。它包括内置持久性、对循环的支持,并优先考虑可控性。如果LCEL对于更大或更复杂的链变得笨重,它们可能会受益于LangGraph的实现。状态(State) 状态是一个共享的数据结构,通常是一个TypedDict或者Pydantic的BaseModel类型。
2025-05-30 22:22:00
1055
原创 Langchain - 实现网页文本自动摘要生成
Map 阶段:对每个文档片段进行摘要定义系统提示语,告诉模型对单个文档块进行摘要。构建提示模板 + LLM 的链式结构。以下是一组文档(documents)"{docs}"根据这个文档列表,请给出总结摘要:"""Reduce 阶段:将所有摘要合并成一个统一摘要使用 StuffDocumentsChain 合并多个摘要。最终通过 ReduceDocumentsChain 执行整合。reduce_template = """以下是一组总结摘要:{docs}
2025-06-20 12:47:40
613
原创 Langchian - 实现文本分类实际应用
定义一个 TextClassification 模型,用于指定输出格式:sentiment:情感倾向(如“愤怒”、“高兴”等)aggressiveness:攻击性评分(1~10 分)language:识别使用的语言(如“中文”、“英语”)sentiment: str = Field(description="文本的情感")aggressiveness: int = Field(description="描述文本的攻击性,数字越大表示越攻击性")
2025-06-08 16:43:16
270
原创 Langchain - 基于RAG的网页内容检索实战
定义系统提示语,告诉模型扮演“搜索引擎”角色。构建提示模板,包含系统指令、历史记录占位符、用户输入。使用 create_stuff_documents_chain 创建一个将文档整合进 LLM 的链。你是一个搜索引擎,根据用户的问题,从以下文档中检索相关信息,并给出答案。"""])
2025-06-02 21:42:02
686
原创 Langchian - 自定义提示词模板 提取结构化的数据
定义单个人的信息模型、多个人的信息模型Person 是一个人的数据模型,包含姓名、发色和身高三个可选字段。使用 Optional 表示这些属性可能为空,未提供时默认为 None。Field 提供字段描述和默认值ManyPerson 表示多个人的集合,其 people 属性是一个由 Person 对象组成的列表"""关于一个人的数据模型"""name: Optional[str] = Field(default=None, description='表示人的名字')
2025-06-02 21:41:28
1064
原创 LangChain-结合GLM+SQL+函数调用实现数据库查询(三)
针对进一步简化通过 LangChain 和大语言模型(GLM-4)实现了一个 AI 代理,能够根据自然语言提问自动生成 SQL 查询语句,并连接 MySQL 数据库执行查询,最终返回结果。整个流程如下:用户提问 → AI 生成 SQL → 执行查询 → 返回结果。
2025-06-01 19:02:37
545
原创 LangChain-结合GLM+SQL+函数调用实现数据库查询(二)
定义回答模板,包含问题、生成的 SQL 和执行结果。使用 LLM 解释结果并生成自然语言答案。最终通过 `StrOutputParser` 输出字符串格式的结果。"""根据以下的问题,生成SQL语句,并执行SQL语句,给出最终的查询结果Answer:"""
2025-06-01 19:00:54
591
原创 LangChain-结合GLM+SQL+函数调用实现数据库查询(一)
提示模板指导 LLM 根据给定的表结构和用户问题生成 SQL 查询语句你是一个专业的SQL工程师,请根据以下表结构生成标准SQL查询语句:请最多返回 {top_k} 条记录。问题:{input}SQL查询:""")
2025-06-01 18:59:30
301
原创 LangChain-结合智谱AI大模型实现自定义tools应用实例
4.构建一个基于 LangChain 的 Agent,并使用自定义工具 WeatherTool 来处理用户关于天气的自然语言查询。description="用于查询天气的位置信息":为该字段添加描述信息,可用于文档生成、调试或 IDE 提示。使用 LangGraph 提供的 chat_agent_executor 创建一个能够调用工具的 Agent。1.先定义一个查询 省市区的行政编码的方法 select_code,读取csv文件中的数据。这是 BaseTool 要求实现的方法,用于定义工具的具体逻辑。
2025-06-01 18:58:51
757
原创 LangChain-结合魔塔社区modelscope的embeddings实现搜索
以下使用 智谱AI大模型 + modelscope + LangChain 实现搜索功能。3.然后使用modelscope的embeddings实例化向量数据库。2.定义documents,这里可以自己使用本地的文档内容。5.定义一个用户提示词模板,用于上下文中问题的回答。4.创建检索器,取向量返回的相似度最高的第一个值。6.构建一个chain,调用链invoke。首先要安装modelscope。1.先定义要使用的AI大模型。
2025-05-30 22:24:02
299
原创 LangChain-Tool和Agent结合智谱AI大模型应用实例2
LangChain实现了模块化与智能化的结合,Tool提供基础能力,Agent赋予系统自主决策的灵活性,两者协同完成从简单查询到复杂问题求解的多样化任务。单一功能模块:Tool是完成特定任务的独立工具,每个工具专注于一项具体的操作,例如:搜索、计算、API调用等。任务协调者:Agent是自主决策的智能体,负责解析用户意图,规划任务步骤,调用工具并整合结果。上下文管理:维护任务状态,处理工具返回结果,最终生成用户友好的响应。决策逻辑:基于 LLM的推理能力,动态决定使用哪些工具及执行顺序。
2025-05-30 22:20:58
522
原创 LangChain-自定义Tool和Agent结合DeepSeek应用实例
以上,定义了一个my_search的搜索工具(具体没有实现,只是打印一句话) 和一个排序工具sort_num,同时使用了LangChain的内置工具 arxiv(该工具用于范文学术论文和文献)以上定义了一个计算字符串长度并求和的工具add_str_len。除了调用LangChain内置工具外,也可以自定义工具。
2025-05-30 22:19:02
328
原创 LangChain表达式 (LCEL)
LCEL 从第一天起就被设计为支持将原型投入生产,无需代码更改,从最简单的“提示词 + 大型语言模型”链到最复杂的链(我们看到有人成功在生产环境中运行包含数百个步骤的 LCEL 链)。合作伙伴库(例如 langchain-openai、langchain-anthropic 等):一些集成已进一步拆分为自己的轻量级库,仅依赖于 langchain-core。:使用 LangChain 的开源 构建模块、组件 和 第三方集成 构建您的应用程序。: 组成应用程序认知架构的链、代理和检索策略。
2025-05-30 22:16:34
1148
原创 AI入门示例
需要提前在环境中配置DASHSCOPE_API_KEY,这个KEY就是阿里云百炼中申请的API key。注意:这里 top_p,temperature 参数的值是在0-1之间。如果你有deepseek的API KEY,也可以这样。市面上有很多AI大模型,这里以 智谱的大模型 为示例。2.注册成功后,会赠送3个月的免费额度,如下。会送deepseek-r1的免费token)3.然后去控制台,创建一个API KEY。这里使用 阿里云百炼的API,(注册。4.接着就可以开始写代码了。提前导入包: openai。
2025-05-30 22:15:02
365
原创 Python3.11.9 绿色版安装配置教程
如:D:\Python\python3.11.9、D:\Python\python3.11.9\Scripts。下载后可将该文件放置在上一步的目录中(D:\Python\python3.11.9\pip.pyz)如:D:\Python\python3.11.9\python311._pth,文件名会根据版本不同。恢复对 Lib\site-packages 文件的读取,否则无法引入该目录下的模块。在目录中打开CMD命令行,执行命令,安装 pip 模块。如:D:\Python\python3.11.9。
2025-05-26 14:22:31
585
原创 JAVA 基数排序算法(详细实现过程介绍)
基数排序 是将整数按位数切割成不同的数字,然后按每个位数分别比较从而得到有序的序列。本文以数组中元素均为正整数来演示。给定一个数组 arr = [ 53, 3, 542, 748, 14, 214 ];准备十个桶:0~9第一轮按照元素的个位数排序0~9的各个桶内分别存放数组中各元素的个位数,按照数组元素的顺序依次存放53个位数为 3 ->放入第3个桶(桶下标为3)3个位数为 3 ->放入第3个桶(桶下标为3)542个位数为 2 ->放入第2个桶(桶下标为2)748个位
2020-11-04 10:10:26
631
2
原创 JAVA 归并排序算法(详细实现过程介绍)
概念:归并排序Merge Sort 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的典型应用。 它指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。归并排序有多路归并排序、两路归并排序 , 可用于内排序,也可以用于外排序。这里仅对内排序的两路归并方法进行讨论。原理:把 n 个记录看成 n 个长度为 l 的有序子表 进行两两归并使记录关键字有序,得到 n/2 个长度为 2 的有序子表 重复第 2 步直到所有记录归并成一个长度为 n 的有序表为止。 图
2020-10-14 15:00:00
423
原创 JAVA 快速排序算法(详细实现过程介绍)
https://blog.youkuaiyun.com/jianyuerensheng/article/details/51258374?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.c
2020-09-30 16:57:19
692
原创 JAVA 希尔排序-移位法 算法(详细实现过程介绍)
希尔排序-移位法第一轮,第1次8,9,1,7,2,3,5,4,6,0gap=5preIndex=0insertVal=arr[5]arr[preIndex]=arr[0]如果当前数字小于前一个数字,即arr[5]<arr[0],则while循环,条件为,preIndex>=0且arr[5]<arr[0]满足,则把下标为preIndex的元素的下一个元素,即下标为preIndex+5对应元素的值赋值为下标为preIndex的元素对应的值,arr[5]=arr[0],即ar
2020-09-29 17:54:24
376
原创 JAVA 插入排序算法(详细实现过程介绍)
场景:对数组int []arr={ 101, 34, 119, 1},使用插入排序方式实现从小到大排序。思路分析:4个数,外层循环需要排序三轮,即:循环从1开始,循环次数为 数组的长度1、第一轮排序的结果为:34,101,119, 11)设定下标为0的第一个数不动,下标为1的数为要插入的数 insertVal,该数的前一个数的下标preIndex为0即: 1-12)使用while循环,循环条件为:preIndex>=0 && insertVal<insertVal
2020-09-18 18:15:37
441
原创 JAVA 选择排序算法(详细实现过程介绍)
场景:对数组int []arr={ 101, 34, 119, 1},实现从小到大选择排序。思路分析:4个数,外层循环次数为3即:数组长度-1第一轮循环1、设定最小数的值和下标先设定数组中的下标为0的元素为最小的数int min = arr[0]设定最小数的下标为0int minIndex = 0使用for循环,从下标为1的数开始,循环次数为数组的长度 3i=1min=101,minIndex = 0,arr[1]=34min>arr[1],则设置min=arr[1],
2020-09-15 18:30:33
598
原创 JAVA 冒泡排序算法(详细实现过程介绍)
冒泡排序3, 9, -1, 10, -24个数,外层循环需要排序三轮,即:循环从1开始,循环次数为 数组的长度-1第一轮排序结果为:获得最大元素在最右侧3, 9, -1, 10, -23, -1, 9, 10, -23, -1, 9, 10, -23, -1, 9, -2, 10第一轮的内部第1次排序,下标为0的元素与下标为1的元素相比,arr[0]<arr[1],则不需要交换,第1次排序结果为:3, 9, -1, 10, -2for(int j=0;j<4;j++){.
2020-09-14 18:39:04
385
原创 JAVA 实现数独
一、数独是什么?数独是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,且不重复。数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。水平方向有九横行,垂直方向有九纵列的矩形,画分八十一个小正方形
2020-09-11 10:10:27
4934
原创 JAVA 输入任何奇数 完成九宫格填数
1、最小值永远在最上行的中间格,最大值永远在最下行的中间格。2、最上行碰壁,下一个数填入右列最下格。3、最右列碰壁,下一个数填入上一行最左格。4、右上格有空就一直填下一个数;右上格有数,就将下一个数字填入上一个数的下一格。5、右上角的下一个数,必定在其下一格;左下角的上一个数,必定在其上一格。https://blog.youkuaiyun.com/weixin_44485261/article/details/88912889?utm_medium=distribute.pc_relevant...
2020-09-07 18:30:57
992
原创 JAVA 使用栈实现后缀表达式的计算
JAVA 使用栈实现中缀表达式转换后缀表达式一文中详细说明了如何将中缀表达式转换成后缀表达式。那么如何计算后缀表达式的结果呢?后缀表达式的求值思路:1、从左到右扫描后缀表达式2、如果遇到操作数,将其压入栈中。3、如果遇到操作符,则从栈中弹出两个操作数,计算结果,然后把结果入栈。4、遍历完后缀表达式,则计算完成,此时的栈顶元素即为计算结果。例如:后缀表达式"3 4 + 5 × 6 - "(1) 初始化栈,栈顶指针为空,从左至右扫描;(2) 遇到操作数3,入栈;(3)..
2020-09-01 20:01:59
960
原创 JAVA 使用栈实现中缀表达式转换后缀表达式
二、中缀表达式转换成后缀表达式此方法需要遵循几个规则:(1)如果读入操作数,则直接放入输出字符串;(2)如果读入一般运算符如+-*/,则放入堆栈,但是放入堆栈之前必须要检查栈顶,并确定栈顶运算符的优先级比放入的运算符的优先级低;如果放入的优先级较低,则需要将栈顶的运算符放入输出字符串;(3)如果读入(,因为左括号优先级最高,因此放入栈中,但是注意,当左括号放入栈中后,则优先级最低;(4)如果读入),则将栈中运算符取出放入输出字符串,直到取出(为止,注意:()不输出到输出字符串;.
2020-09-01 19:23:16
1102
原创 JAVA 使用数组模拟栈的方式实现中缀表达式的计算
package com.sc.stack;public class Calculator { public static void main(String[] args) { String infixExpression ="1-5+50-1*2"; //44 char[] charArray = infixExpression.toCharArray(); ArrayStack numStack = new ArrayStack(20); .
2020-08-28 13:34:04
240
原创 JAVA 数组简单模拟栈的相关实现(入栈、出栈、遍历)详细实例验证
使用数组模拟栈的操作思路:使用数组来模拟栈步骤分析:1. 定义一个变量top表示栈顶,并初始化为 -13. 入栈操作,当有数据加入到栈时, top++; stack[top] = data;4. 出栈操作,先将栈顶的元素保存到一个变量中,然后再移动top变量,则int value = stack[top]; top--; return value;代码实现:1、创建数组对象ArrayStack.class1)构造方法,传入栈的最大容量 private i...
2020-08-19 17:25:09
1049
原创 JAVA 实现双向链表根据节点大小按顺序新增、修改、删除操作
单向链表查找的方向只能是一个方向,而双向链表可以向前或者向后查找。结合JAVA 实现带头结点的链表根据节点大小按顺序新增、修改、删除节点单向链表的操作。在单向链表的基础上进行双向链表的增删改就比较简单了。根据上图,分析双向链表的新增,修改、删除操作思路:1) 遍历 方和 单链表一样,只是可以向前,也可以向后查找2) 添加 (默认添加到双向链表的最后)(1) 先找到双向链表的最后这个节点(2)temp.next=newHeroNode(3)newHeroNode.pre=t..
2020-08-18 20:19:22
1258
7
原创 JAVA 使用栈从尾到头打印单向链表
思路1. 上面的题的要求就是逆序打印单链表.2. 方式1: 先将单链表进行反转操作,然后再遍历即可,这样的做的问题是会破坏原来的单链表的结构,不建议3. 方式2:可以利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点,就实现了逆序打印的效果.举例演示栈的使用 Stack //逆向打印链表 public void reversePrintSinglelist(HeroNode2 head2){ //如果当前链表为空,或者只有一个节点,无需反转,直
2020-08-14 18:28:24
270
原创 JAVA 查找单向链表中倒数第K个节点的代码实现
思路1. 编写一个方法,接收 head 节点,同时接收一个 index2.index 表示是倒数第 index 个节点3. 先把链表从头到尾遍历,得到链表的总的长度 getLength4. 得到 size 后,我们从链表的第一个开始遍历 (size-index)个,就可以得到5. 如果找到了,则返回该节点,否则返回 nulll //获取倒数第K个节点 public HeroNode2 getLastIndexNode(HeroNode2 head2,int index..
2020-08-07 18:32:54
734
2
原创 JAVA 实现单向链表的反转
JAVA 实现带头结点的链表根据节点大小按顺序新增、修改、删除节点该文章已实现单向链表的创建及遍历等操作。那么在此基础上,如何实现单向链表的反转呢?实现思路:1. 先定义一个节点 reverseHead = new HeroNode();2. 从头到尾遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表reverseHead 的最前端.3. 原来的链表的head.next = reverseHead.next代码实现上代码:在SingleLinkedList2.cl..
2020-08-06 18:48:25
653
原创 JAVA 获取单向链表中有效节点的个数
JAVA 实现带头结点的链表根据节点大小按顺序新增、修改、删除节点 该文章已实现单向链表的创建及遍历等操作。那么在此基础上,如何获取到单链表的节点的个数(如果是带头结点的链表,不需要统计头节点)呢?实现思路:1、先判断链表是否为空,为空则return。2、创建临时节点temp指向链表的头部,用于后续循环。3、创建变量size,用于存储有效节点个数。4、使用while循环,当temp的下一个节点为空时,则循环结束break; 否则,size++,同时将temp后移。5...
2020-08-06 13:01:49
1119
原创 JAVA 使用单向环形链表解决约瑟夫问题
约瑟夫问题:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。nums = 10 , 即有10个人 start = 2, 从第二个人开始报数count = 3, 数3下1、创建一个小孩节点对象 class Child{ private int no; private Chil
2020-08-06 12:48:58
256
原创 JAVA 实现带头结点的链表根据节点大小按顺序新增、修改、删除节点
思路:需要按照编号的顺序添加1. 首先找到新添加的节点的位置, 是通过辅助变量(指针), 通过遍历来搞定2. 新的节点.next = temp.next3. 将temp.next = 新的节点
2020-08-04 18:36:26
527
原创 JAVA 将两个有序链表合并为一个有序链表
将两个有序链表合并为一个有序链表思路:1.必须保证两个链表为有序链表2.在两个链表都不为空的条件下,设一个 last=null;(1)如果链表1的值小于等于链表2的值,进行循环,先放链表1的值到新链表result,如果result为空,视为头插,如果不为空,视为尾插,其中要保证last永远为最后一个结点,最后让循环走起来(2)如果链表2的值小于链表1的值,与(1)中方法相同,只是链表1全换为链表2即可3.如果链表2为空了,链表1不为空时,把链表1接在last的下一个,之后,可以.
2020-08-04 13:03:53
2399
原创 JAVA 实现带头结点的链表按添加顺序新增节点并遍历
链表是有序的列表,但是它在内存中是存储如下从上述图中可以看出:1) 链表是以节点的方式来存储,是链式存储2) 每个节点包含 data 域:存储节点的具体信息, next 域:指向下一个节点.3) 链表的各个节点不一定是连续存储.4) 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定单链表(带头结点) 逻辑结构示意图如下单链表的应用实例:使用带 head 头的单向链表实现 –向链表中增加、删除、修改最后遍历的操作。1、先创建一个LinkedNode对象,代表链表中的
2020-07-29 18:45:34
839
原创 JAVA 数组模拟环形队列
在上一篇JAVA 数组模拟队列的文章中存在问题:当队列中的元素全部取出后,输出队列元素为空。再次向队列中添加元素时,提示队列已满,无法添加。因为队列中数组只能使用一次,没有达到复用的效果。本文将使用环形队列解决这个问题。数组模拟环形队列思路分析:1.基于之前的front 变量,在环形队列中,front调整为指向队列的第一个元素,即arr[front]。front 的初始值为0。2.基于之前的 rear 变量,在环形队列中,rear 调整为指向队列的最后一个元素的...
2020-07-28 18:37:28
246
原创 JAVA 使用数组模拟队列
一、队列的概念1、队列是一个有序列表,可以用数组或是链表来实现。2、遵循先入先出的原则(例如:银行叫号排队)。即:先存入队列的数据,要先取出。后存入的要后取出二、数组模拟队列队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图。其中 maxSize 是该队列的最大容量。因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front 及 rear 分别记录队列前后端的下标, front 会随着数据输出而改变,而 rear 则是随着数据输入而改变。..
2020-07-24 13:00:09
243
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人