突破界限:LangChain 引领 AI 应用构建的新时代

前言

在上一篇文章中我们对 ChatWithPDF 的方案设计进行了整体的概览,现在细化下整体流程,如下图所示:

Pasted image 20240415112516.png

针对上面的流程,我们思考🤔一下会面临的问题:

  1. 如何读取 PDF 中的内容?(肯定和直接读文本不一样)
  2. 如何切割文本块才能保证一定的语义和上下文的连贯性?(随意切割文本肯定会导致上下文的丢失)
  3. 如何对文本进行 Embedding,这个 Embedding 算法怎么实现?
  4. 请求 AI 大模型的格式是什么,响应的内容如何解析?
  5. 向量数据库如何增删查改?
  6. 如果想替换向量数据库的类型,想替换大模型 ChatGPT 成 ChatGLM 怎么办?

如果从头实现上面的所有功能,想想都头大😵‍💫,真的是从入门到放弃。LangChain 的出现让 AI 应用的构建变得简单。

Pasted image 20240415113601.png

LangChain 的功能进行归类总结下:

Pasted image 20240415115005.png

为了加速和简化构建 AI 应用的工作,LangChain 将是本系列的一个核心内容,但由于 LangChain 的版本迭代比较快,并且文档有点混乱,本篇的目的就是让大家更加轻松掌握 LangChain ,为后续 ChatWithPDF 的开发打下基础。

Chains 是什么?

Chains 中文是链的意思,它是 AI 应用开发中的一个重要概念,让我们用一个简单的例子来说明 Chains 的应用。比如开发一个自动生成代码的功能,输入的参数是两个 languagetasklanguage 表示编程语言(如 Python),task 是需要生成代码的说明,因此大致流程如下:

Pasted image 20240415130158.png

由于 token 数量的限制,建议使用英文作为 Prompt (提示语),最终通过与 AI 大模型 ChatGPT 的交互之后,可以得到相对应的 Python 代码。

通过 LangChain 我们可以轻易的替换所使用的 AI 大模型(ChatGPT、Llama、Claude 对应不同的大模型),而不需要改动其他模块的代码。

Pasted image 20240415130130.png

此时,我们再增加一个需求:对生成的代码进行代码审查,检查生成的代码是否有 Bug,并且需要用另外一个大模型完成这个功能。最简单的办法就是重新改写上面的 Prompt (提示语),让 AI 大模型先生成代码,然后在对代码进行审查。

但在 LangChain 中有个更灵活的方式,再构建一个流程,然后将上个流程的输出作为下一个流程的输入,具体情况如下图所示:

Pasted image 20240415163759.png

这个思想是不是有点熟悉?没错,就是 unix pipeline,比如统计包含 “aa” 日志的条目数: cat test.log | grep aa | wc -l。每个程序都实现单一的功能,然后通过 pipeline 将它们组合起来完成更复杂的功能。

LangChain 也是同样的,你可以通过 LangChain 构建不同的 Chain,然后将每个 Chain 串联起来完成复杂的工作,如下图:

Pasted image 20240415164743.png

相信通过上面的示例,大家对于 LangChainChain 的设计与使用有了更加深刻的理解,接下来我们通过一个具体示例来演示 LangChain 的使用。

AI 聊天机器人(easychat)

本节我们将使用 LangChain 构建一个 AI 聊天机器人,使用的 AI 大模型是 AzureOpenAI,https://juejin.cn/post/7356904325828378662)。

完整的代码已经上传 github 仓库:github.com/betnevs/lan…

环境初始化

Python 作为本地开发环境,要解决的第一个问题就是包依赖的问题,随着本地 Python 环境引入的包越来越多,依赖管理也会越来越复杂,所以需要解决这个问题。

本系列采用 Python 官方的 venv 创建虚拟的 Python 环境解决依赖问题,感兴趣的可以阅读:docs.python.org/3/library/v…

本文示例是基于 macOS 进行开发演示,Windows 代码基本一样,注意 Windows 使用 venv 的初始化命令不一样,请参考官方文档。

  1. 创建本地目录 easychat
bashmkdir easychat && cd easychat
  1. 初始化虚拟环境

python -m venv .venv
  1. 激活虚拟环境
bashsource .venv/bin/activate

建立主框架

主框架就是不断获取用户的输入,然后做业务逻辑的处理,最后将响应的内容显示到屏幕上。另外,当用户输入 exit 时,程序退出。代码很简单,如下所示:

Pasted image 20240415190219.png

逐步完善功能

在与 AI 大模型交互的时候,一般涉及三个角色:

  • system:设置 AI 大模型的角色
  • user:使用的用户,对应用户的输入
  • assistant:AI 大模型,对应大模型的输出

Pasted image 20240415191034.png

真正与大模型的交互就是靠调用 API 去实现,但如果不借助 LangChain作为开发者需要去阅读每个 AI 大模型的 API 文档,并且切换不同的大模型还需要修改相对应的代码,这些是比较繁琐的事情,有了 LangChain 就可以简化流程。

Pasted image 20240416141728.png

接下来,让我们逐步完善功能:

1、先安装相应的 LangChain


pip install python-dotenv langchain langchain-core langchain-community langchain-openai 

2、Azure OpenAI 密钥和接口配置

bashtouch .env

根据自己账号下的配置填写配置文件

.envAZURE_OPENAI_API_KEY=(请求key)
AZURE_OPENAI_ENDPOINT=(请求API)
OPENAI_API_VERSION=2024-02-01
AZURE_CHAT_MODEL=gpt-35-turbo

3、通过 load_dotenv 引入配置文件中的内容至环境变量

csharpfrom dotenv import load_dotenvload_dotenv()

通过以上操作,可以避免 Azure OpenAI 的相关配置写死在代码中。

4、构建提示语模板

pythonprompt = ChatPromptTemplate(input_variables=["content"],messages=[HumanMessagePromptTemplate.from_template("{content}"),],
)

这个代码非常简单,利用 ChatPromptTemplate 定义提示语的模板,将用户的输入定义为 content,然后通过 HumanMessagePromptTemplate.from_template("{content}") 将用户的输入直接构建成提示语。

5、初始化 AI 模型

pythonchat = AzureChatOpenAI(azure_deployment=os.getenv("AZURE_CHAT_MODEL"),
)

6、定义响应解析器

inioutput_parser = StrOutputParser()

7、构建 Chains

inichain = prompt | chat | output_parser

这里再次印证了上面说的 chainunix pipeline 思路一样 ,使用方式都基本一致。

8、传入用户输入,调用 chain

css
# 5. 调用 chain,这里 `content` 就是构建填充到提示语模板中的 `content`
result = chain.invoke({"content": content})

最终完整代码:

python
import osfrom dotenv import load_dotenv
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.schema import StrOutputParser
from langchain_openai import AzureChatOpenAIload_dotenv()# 1. 定义提示语模板
prompt = ChatPromptTemplate(input_variables=["content"],messages=[HumanMessagePromptTemplate.from_template("{content}"),],
)# 2. 初始化 AI 模型
chat = AzureChatOpenAI(azure_deployment=os.getenv("AZURE_CHAT_MODEL"),
)# 3. 定义响应解析器
output_parser = StrOutputParser()# 4. 构建 chains
chain = prompt | chat | output_parserwhile True:content = input(">> ")if content.strip() == "exit":break# 5. 调用 chain,这里 `content` 就是构建填充到提示语模板中的 `content`result = chain.invoke({"content": content})print("AI Answer: ", result)

效果展示

直接执行 python main.py 运行程序,问几个问题,看看效果:

Pasted image 20240416173202.png

效果还是ok的,大家可以自己运行体验下。但是这个 easychat 的机器人有个问题,就是没有记忆功能,让我们做个功能测试:

  1. 告诉它我们的名字叫做“开发者语”
  2. 再问它我们的名字,看看效果

Pasted image 20240416173500.png

为什么会出现这种情况呢?因为调用 AI 大模型是没有记忆功能,也就是说调用 AI 大模型是一种无状态的调用,它并不会记忆你上次问的内容,那如何解决这个问题让 AI 机器人拥有记忆的能力,下一篇文章将详细介绍,敬请期待~😉

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

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

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

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

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

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

相关文章

一些重新开始面试之后的八股文汇总

一、内存中各项名词说明 1、机器内存概念说明 linux中的free命令可以查看机器的内存使用情况,vmstat命令也可以 其中不容易被理解的是: 内存缓冲/存数(buffer/cached) 1.buffers和cache也是RAM划分出来的一部分地址空间 2.buff…

如何利用逻辑引擎的对象变量节点优化表单数据处理?

JVS逻辑引擎-对象变量节点 概述 对象变量是面向对象编程中的一个重要概念。在编程中,对象变量用于存储对象的引用。在Java中,使用“类名变量名”可以创建一个对象变量,但此时对象变量本身并没有任何值。要赋予对象变量具体的值,…

Type-C接口PD取电IC6500

一、引言 随着科技的不断进步,移动设备已经成为我们日常生活中不可或缺的一部分。其中,电源管理对于确保设备的稳定运行和延长电池寿命至关重要。Type-C接口作为现代移动设备的主要电源和数据接口,其高效、便捷的特性得到了广泛应用。而Powe…

基于springboot实现音乐网站管理系统项目【项目源码+论文说明】计算机毕业设计

基于SpringBoot实现音乐网站管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了音乐网站的开发全过程。通过分析音乐网站管理的不足,创建了一个计算机管理音乐网站的方案。文章介绍了音乐…

李彦宏:开源模型会越来越落后

李彦宏:开源模型会越来越落后 昨天听完的李总讲座 大家以前用开源觉得开源便宜,其实在大模型场景下,开源是最贵的。所以,开源模型会越来越落后。 ——李彦宏 至于开源还是闭源,这和企业的利益息息相关。 随着科技的迅猛…

新品上市|水深测量专家 HD-680双变频测深仪

自动跟踪 一键测量 测深参数自动调节,换能器内置温度传感器,声速自动解算,提升数据精度,解放双手,提高测量效率。 高低频结合可实时显示淤泥厚度 HD-680双变频测深仪高低频双通道同时工作,全新升级的双频测…

如何使用WinSCP通过固定公网TCP地址实现远程连接内网设备传输文件

文章目录 1. 简介2. 软件下载安装:3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件,它的主要功能是在本地与远程计…

VIN车辆识别代码查询API接口是什么

VIN车辆识别代码查询API接口又叫VIN码查询接口、VIN码识别接口、车辆VIN码解析接口、车架号查询车辆信息接口,通过输入车辆VIN识别码(车架号)获取车辆参数信息,返回车辆品牌、车型、油耗、车身形式、排量等等。那么这个接口如何对…

什么是交叉连接:全面概述

交叉连接是数据中心上下文中使用的术语,指的是在两个单独的硬件单元之间建立直接链接所需的物理电缆和连接。这些连接在促进数据中心内各个组件之间的高效和安全通信方面发挥着至关重要的作用。通过在硬件单元之间创建专用网络链接,交叉连接消除了对基于…

Meta因露骨AI图片陷入困境

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

硬件?、嘉立创EDA画PCB规则设计

1、打开规则设计 设置单位为mil 点击全部 将安全距离设置为8mil,这个8mil是目前很多生产PCB的工厂可以做的,如果距离设置的更小也就是性能要求更高,相应的生产成本也高元件到元件的距离设置为20mil 2、设置导线的宽度规则,可以对v…

敏捷——登录校验/管理事项/Javaweb/后端/Springboot

勋的要求 1 登录后 后端返回一个token 2 数据库 用户表 事项表 用户表:用户名 密码 用户标识(id) 1 zhangsan 123456 2 zhangsan2 123456 3 zhangsan3 123456 事项表&#xff1a…

ccfcsp201409-3 字符串匹配

#include <bits/stdc.h> using namespace std; string s; int y, n; string o[105]; bool check(char a, char b) { // 大小写不敏感if (a b || a - a b - A || a - A b - a){return true;}return false; } int main() {cin >> s;cin >> y; // 0不敏感1敏…

挣钱新玩法,一文带你掌握流量卡推广秘诀

手机流量卡推广项目是什么&#xff1f;听名字我相信大家就已经猜出来了&#xff0c;就是三大运营商为了开发新用户&#xff0c;发起的有奖推广活动&#xff0c;也是为了长期黏贴用户。在这个活动中&#xff0c;用户通过我们的渠道&#xff0c;就能免费办理低套餐流量卡&#xf…

Linux 搭建私有yum源仓库

一、环境准备 IP系统版本作用192.168.140.155CentOS 7.9.2009yum源仓库192.168.140.153CentOS 7.9.2009测试 准备两台服务器&#xff0c;一台作为yum源仓库&#xff0c;另一台作为测试使用。 二、搭建yum源服务器 &#xff08;无法连接外网的情况&#xff0c;需要去官网下载镜…

【GoWeb框架初探————XORM篇】

1. XORM xorm 是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。 1.1 特性 支持 Struct 和数据库表之间的灵活映射&#xff0c;并支持自动同步事务支持同时支持原始SQL语句和ORM操作的混合执行使用连写来简化调用支持使用ID, In, Where, Limit, Join, Havi…

记录 nginx 出现 403 forbidden 和 404 的解决经历

403 当我修改了 nginx 所展示的页面路径了以后&#xff0c;访问 nginx 所在的 8080 端口就出现了403 forbidden 的错误 首先通过以下查看进程的命令 ps -aux|grep nginx发现 worker process 对应的启动用户是 nobody 是错的 &#xff08;图中是 root&#xff0c;是改正后的样子…

【uniapp踩坑记】——微信小程序转发保存图片

关于微信小程序转发&保存图片 微信小程序图片转发保存简单说明网络图片的转发保存base64流形式图片转发保存 已经好多年没写博客了&#xff0c;最近使用在用uniapp开发一个移动版管理后台&#xff0c;记录下自己踩过的一些坑 吃相别太难看&#xff0c;搞一堆下头僵尸号来点…

vite(vue3)配置内网ip访问的方法步骤

如果没有进行配置&#xff0c;运行项目之后&#xff0c;看到的访问地址是本地访问地址&#xff0c;其他人访问不了。 如下&#xff1a; 一、配置 “ vite.config.ts ” 文件 server: {host: 0.0.0.0 }, 如图所示&#xff1a; 添加 server 配置后保存 “ vite.config.ts ” 文…

深度学习发展中的继承和创新

深度学习是一步一步发展而来的&#xff0c;新的成就也是在原有的基础上&#xff0c;逐步取得突破&#xff0c;有一些东西是一点一点变化&#xff0c;突破发展而来的&#xff0c;也就是每一次小的突破和每一次小的突破累积起来&#xff0c;构成一个明显的进步。我们可以通过观察…