LangChain大模型应用开发指南-传统编程范式思维的应用

news2024/12/28 20:18:08

LangChain大模型应用开发指南-传统编程范式思维的应用

上节课,我带领小伙伴们完成了baichuan2量化模型的OpenAI标准接口封装,并完成LangChain对大模型的调用与测试。

今天我们将正式开始LangChain大模型应用开发课程。

组件总览

上图为LangChain的组件与架构图,基本完整描述了LangChain的组件与抽象层以及它们之间的相关联系。主要包括以下六个部分,基于同传统软件开发的比较,我将其分为两个类型:

  1. 传统编程思想的AI工程化应用
 Chains:链,用于组合组件的结构化方式
 Agents:代理,用于执行特定任务的组件
 Callbacks:回调,用于在链中插入自定义逻辑的组件

2. AI大模型衍生的新能力

 Model I/O:模型输入输出,用于与语言模型交互的组件
 Retrieval:检索,用于从外部来源获取上下文的组件
 Memory:记忆,用于存储和更新上下文的组件

作为LangChain大模型应用开发指南第一课,我将介绍LangChain的六大核心组件和概念解析,帮助大家从全局的角度了解LangChain在AI应用开发流程中的能力边界,并将在最后给出一个使用到了以上所有相关组件和概念的实际使用示例。

受限于文章篇幅,本篇文章主要从传统编程出发,讲解LangChain应用开发中与传统IT应用开发相同的编程范式,本次课程整体提纲如下:

Chains

做过传统软件开发的小伙伴,对链这个名词肯定不陌生,比如Java设计模式里的责任链。LangChain中的Chain也便是大家熟知的链,是LangChain中用于组合组件的结构化方式,它可以让你按照一定的顺序和逻辑来执行不同的任务。你可以把它想象成语言模型进行流水线作业,每个环节都有一个特定的目标和功能。Chains有以下四种类型:

类型作用
LLMChain用于在语言模型周围添加一些功能的简单Chain,它由一个PromptTemplate和一个语言模型(LLM或chat model)组成,它可以使用输入键值和内存键值(如果有的话)来格式化PromptTemplate,然后将格式化后的字符串传递给语言模型,并返回语言模型的输出
RouterChain用于创建一个动态选择下一个要使用的Chain的Chain的范式,它由两个组件组成:RouterChain本身(负责选择下一个要调用的Chain)和destination_chains(RouterChain可以路由到的Chain)
SequentialChain用于将多个Chain连接起来,形成一个执行一些特定场景的管道的Chain,它允许将一个调用的输出作为另一个调用的输入
TransformChain用于创建一个通用的转换Chain,它可以对输入进行一些预处理或后处理,然后将其传递给另一个Chain

Chains是LangChain中完成业务逻辑拆解和组装的核心组件,它可以让你灵活地构建复杂的应用程序。你可以使用不同类型的Chains来实现大模型、现有数据等各种各样基础能力的组装与能力搭建。

  • 如下代码是使用Chain整合提示词模板,OpenAI接口,输出文本格式化解析器的一个简单示例
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import ChatPromptTemplate
from langchain.schema import BaseOutputParser

class CommaSeparatedListOutputParser(BaseOutputParser):
    """Parse the output of an LLM call to a comma-separated list."""

    def parse(self, text: str):
        """Parse the output of an LLM call."""
        return text.strip().split(", ")

template = """You are a helpful assistant who generates comma separated lists.
A user will pass in a category, and you should generate 5 objects in that category in a comma separated list.
ONLY return a comma separated list, and nothing more."""
human_template = "{text}"

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", template),
    ("human", human_template),
])
chain = chat_prompt | ChatOpenAI() | CommaSeparatedListOutputParser()
chain.invoke({"text": "colors"})
# >> ['red', 'blue', 'green', 'yellow', 'orange']

Agents

和责任链一样,Java设计模式还有一个设计模式叫代理模式。LangChain中Agents的概念与传统的代理模式基本一致,是通过对稳定的核心能力进行封装,通过Agents代理提供访问入口,既保证了对多样化业务能力需求的支持,也能保持核心能力的稳定性。

LangChain中Agents与传统代理模式的区别就在于,其代理的核心能力便是AI大模型。通过Agents,我们可以让语言模型具有主动性和智能性。你可以把它想象成语言模型的打工人,它可以根据你的需求和指示来完成各种各样的工作。LangChain基于对AI应用开发的总结抽象,主要提供以下六种代理类型:

类型作用
Zero-shot ReAct用于根据工具的描述来决定使用哪个工具的Agent,它可以使用任意数量的工具,但要求每个工具都有一个描述
Structured input ReAct用于使用多输入工具的Agent,它可以根据工具的参数模式来创建一个结构化的动作输入,这对于更复杂的工具使用,如在浏览器中精确地导航,很有用
OpenAI Functions用于与一些特定的OpenAI模型(如gpt-3.5-turbo-0613和gpt-4-0613)协作的Agent,这些模型已经被显式地微调过,以便检测何时应该调用一个函数,并返回应该传递给函数的输入
Conversational用于在对话场景中使用的Agent,它的提示被设计成使Agent有助于和对话,它使用ReAct框架来决定使用哪个工具,并使用内存来记住之前的对话交互
Self-ask with search用于利用一个名为Intermediate Answer的工具的Agent,这个工具应该能够查找问题的事实答案,这个Agent相当于原始的自问自答与搜索论文,其中提供了一个Google搜索API作为工具
ReAct document store用于与文档存储交互的Agent,它使用ReAct框架,并且必须提供两个工具:一个Search工具和一个Lookup工具(它们必须被准确地命名为这样),Search工具应该搜索一个文档,而Lookup工具应该在最近找到的文档中查找一个术语,这个Agent相当于原始的ReAct论文,特别是Wikipedia示例

Agents是LangChain工程化封装与能力复用核心手段,可以动态的帮我们选择和调用 Chain 或者已有的工具,实现面向多种应用场景的智能适配。

  • 如下代码是使用Self-ask with search完成查询链
from langchain.llms import OpenAI
from langchain.utilities import SerpAPIWrapper
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType

llm = OpenAI(temperature=0)
search = SerpAPIWrapper()
tools = [
    Tool(
        name="Intermediate Answer",
        func=search.run,
        description="useful for when you need to ask with search",
    )
]

Callbacks

回调这个概念不用多说,各种编程语言的回调函数就是具体的应用。 LangChain中Callbacks是用于在链中插入自定义逻辑的组件,它可以让你对语言模型的行为进行控制和调整和调整。你可以把它理解成餐厅排队的叫号,当排队到你的时候就会触发提醒你用餐。同样在LangChain中,它可以在链中的任何位置执行你定义的函数或代码。。LangChain基于对AI应用开发的总结抽象,主要提供以下七种回调类型:

类型作用
Async callbacks用于在异步模式下执行回调函数的类,它可以让您在不阻塞主线程的情况下,监听和处理LLM应用的各个阶段的事件
Custom callback handlers用于自定义回调函数的类,它可以让您实现一些特定的逻辑,如验证,过滤,转换等,以及定义回调函数在哪些事件上被触发
Callbacks for custom chains用于为自定义的Chain添加回调函数的类,它可以让您在Chain的开始,结束,或每个组件的调用之前或之后执行一些操作
Logging to file用于将LLM应用的日志记录到文件中的类,它可以让您指定日志文件的路径,格式,级别等,并在每次LLM应用运行时自动写入日志信息
Multiple callback handlers用于同时使用多个回调函数的类,它可以让您将不同类型或功能的回调函数组合起来,并按照一定的顺序执行
Tags用于给回调函数添加标签的类,它可以让您根据标签来筛选或分组回调函数,并在一些特定的场景中使用它们
Token counting用于统计LLM应用使用的令牌数量的类,它可以让您监控和控制LLM应用的消耗,并在每次LLM应用运行时自动更新令牌计数

Callbacks是LangChain中实现自定义逻辑插入的入口,它可以让你的任务链达到合适场景时执行你自定义的功能和效果。

  • 如下是LangChain内置的标准输出的回调演示
from langchain.callbacks import StdOutCallbackHandler
from langchain.chains import LLMChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate

handler = StdOutCallbackHandler()
llm = OpenAI()
prompt = PromptTemplate.from_template("1 + {number} = ")

# Constructor callback: First, let's explicitly set the StdOutCallbackHandler when initializing our chain
chain = LLMChain(llm=llm, prompt=prompt, callbacks=[handler])
chain.run(number=2)

# Use verbose flag: Then, let's use the `verbose` flag to achieve the same result
chain = LLMChain(llm=llm, prompt=prompt, verbose=True)
chain.run(number=2)

# Request callbacks: Finally, let's use the request `callbacks` to achieve the same result
chain = LLMChain(llm=llm, prompt=prompt)
chain.run(number=2, callbacks=[handler])

总结

本文以传统应用编程设计模式和思维为入口和对比对象,介绍了LangcChain中的Chain、Agent、Callback三大核心概念,并整理了LangcChain为众多开发者内置的能力与工具。

通过本文的指导,读者可以迁移在传统应用编程中累积的思维方式和经验,快速入门掌握AI应用编程。

如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1965112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件工程之应用数学

软件工程之应用数学 第 20 章:应用数学20.1 运筹方法20.1.1 网络计划技术20.1.2 线性规划20.1.3 决策论20.1.4 对策论 20.2 数学建模 第 20 章:应用数学 数学是一种严谨、缜密的科学,学习应用数学知识,可以培养系统架构设计师的抽…

机器学习三步走:手写BP神经网络(入门) --> 基于TensorFlow框架开发(开发) --> 基于预训练模型快速构建应用(应用)

目录 前言第一步:手写BP神经网络1 概念简介1.1 神经网络内的概念1.2 神经网络外的概念 2 类BPNetwork2.1 初始化2.2 激活函数2.2.1 Sigmod2.2.2 Linear2.2.3 Sigmod_derivative 2.3 损失函数2.4 前向传播2.5 后向传播2.6 训练模型2.7 预测2.8 绘制损失值变化曲线 **…

实验 19. 用户进程

已完成实验 已完成实验链接 简介 实验 19. 用户进程 总结 main函数创造了1个主线程,两个内核线程,两个用户进程。共5个PCB,进程PCB->pgdir为进程自己的页表首虚拟地址,线程为null。因此本次实验是五个进/线程在来回切换。他…

抖音素材网站有哪些?这几个高质量的抖音无水印素材网站分享

在抖音这个视觉与创意并重的平台上,选择合适的无水印视频素材是提升内容质量的关键。如果你正在寻找既能使你的视频内容更具吸引力,又能避免版权问题的优质素材,那么本文将为你详细介绍几个高质量的抖音无水印素材网站。从国内的蛙学网到国际…

双指针算法大总结!!看完这篇再也没有难的双指针题!!例题C++解法!

题源acwing、力扣 讲解双指针题目一:盛最多水的容器思路AC代码 题目二:查找总价格为目标值的两个商品思路AC代码 题目三:链表的中间节点思路AC代码 题目四:环形链表思路AC代码 题目五:反转字符串中的元音字符思路AC代码…

【Vulnhub靶场AI-WEB-1.0打靶教程】

第一步:查看虚拟机的ip 第二步:扫描ip下开放的80端口 第三步:扫描查到的ip地址下的目录 第四步:访问查到的目录 访问robot.txt 第五步:访问robot.txt显示出的目录 第六步:打开kali终端,使用sqlmap功能 sq…

【Vue3】标签的 ref 属性

【Vue3】标签的 ref 属性 背景简介开发环境开发步骤及源码 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日子。…

win10游戏出现错误代码0xc0000142是什么情况?几种方法修复错误代码0xc0000142

错误代码 "0xc0000142" 通常表示应用程序无法正确启动,这经常与系统文件损坏、兼容性问题或环境设置不当有关。下面列出了一些步骤,可能帮助你解决在Windows 10上运行游戏时遇到的0xc0000142错误。 快速修复错误代码0xc0000142问题 1. 以管理…

更新Win11后出现无法检测到相机的情况

使用腾讯会议的时候发现摄像头用不了,显示“未检测到摄像头”,打开设置显示“未找到任何相机” 试了很多方法都解决不了,后用了下面这种方法成功解决,相机就能用了 1.下载360驱动大师,检测下有没有要更新或者添加的驱…

希尔排序【C语言】

希尔排序 前言 在上一篇文章中我们了解了直接插入排序算法(建议先阅读),但其实这个算法还是有一定优化空间的。而它优化之后,就变成了另一个大名鼎鼎的排序算法:希尔排序。 希尔排序(Shell’s Sort)是插入排序的一种…

PDF怎么转换成Word?这些工具一键搞定!

在日常生活中,我们经常遇到需要将PDF文件转换成Word文档的情况。PDF怎么转换成Word?一些工具的使用十分重要!下文中就为大家推荐几个亲测好用的PDF转换工具。 一、Foxit PDF转换大师(365客户端) 链接:www…

【Story】编程迷航:从 “ 我怎么才学会 ? ” 到 “ 我怎么这么厉害 ! ”

目录 大学生编程入门指南:选择语言、制定计划与避坑技巧1. 选择适合的编程语言1.1 Python1.2 Java1.3 C/C1.4 JavaScript1.5 SQL 2. 制定有效的学习计划2.1 设定明确的目标2.2 制定学习时间表2.3 选择学习资源2.4 实践和项目 3. 避免常见学习陷阱3.1 避免过度焦虑3.…

7月31日学习笔记 基于域名,Ip,端口多虚拟主机配置以及上线商城系统

一,基于域名的虚拟主机 效果 劫持域名访问指定的文件夹的目录 步骤 1. vim /usr/local/nginx/conf/nginx.conf 2. 创建新的目录 mkdir /html/devopt/ 3. 在 devops 目录下添加新的 index.html 文件 4. 在 http 模块下添加新的 server 模块 1 . 设置监听的端…

数字的位操作——7、9、479、564、231、342

7. 整数反转(中等) 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 示例 1&…

钢铁无组织排放的超低改造(朗观视觉)

朗观视觉小编观察发现:随着环保政策的日益严格和公众对环境质量要求的不断提高,钢铁行业作为重工业的代表,面临着巨大的环保压力。无组织排放作为钢铁企业环保治理的难点之一,如何实现超低排放成为行业关注的焦点。本文将从技术路…

MAC安装mysql以及配置环境变量

安装mysql 下载mysql,网址:MySQL :: Download MySQL Community Server 我下载的版本是mysql-9.0.1-macos14-arm64.dmg 打开,双击 一路点击继续安装即可; 最后需要给root设置密码后就安装完成了 但是打开终端输入mysql,依然显…

河南萌新联赛2024第(三)场:河南大学

传送门&#xff1a;河南萌新联赛2024第&#xff08;三&#xff09;场&#xff1a;河南大学_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ B 正则表达式 思路&#xff1a;模拟 代码&#xff1a; #include<bits/stdc.h> using namespace std; typedef long lo…

狗狗换毛期怎么办?家里狗毛遍地,狗毛空气净化器帮你解决

对于养狗家庭来说&#xff0c;换毛季节的到来无疑是一场家中的“毛发风暴”。特别是养如萨摩耶、金毛等大型长毛犬的朋友们&#xff0c;更是深有体会。每日即便精心梳理&#xff0c;家中仍难以避免地被层层狗毛所覆。狗狗时不时晃一下身体&#xff0c;抖动身上的毛发&#xff0…

【list的模拟实现】

list的模拟实现 小杨 list相关类要实现的接口 namespace yang {// List的节点类template<class T>struct ListNode{ListNode(const T& val T());ListNode<T>* _prev;ListNode<T>* _next;T _val;};//List的迭代器类template<class T, class Ref, cla…

土壤分析仪:解锁土壤奥秘,赋能现代农业的绿色引擎

在广袤无垠的大地上&#xff0c;土壤是生命之源&#xff0c;滋养着万物生长。然而&#xff0c;随着现代农业的快速发展和环境的不断变化&#xff0c;土壤的健康状况日益受到关注。如何科学、精准地了解土壤的性质与养分状况&#xff0c;成为现代农业可持续发展的关键。这时&…