前言
在上一篇文章中我们对 ChatWithPDF
的方案设计进行了整体的概览,现在细化下整体流程,如下图所示:
针对上面的流程,我们思考🤔一下会面临的问题:
- 如何读取 PDF 中的内容?(肯定和直接读文本不一样)
- 如何切割文本块才能保证一定的语义和上下文的连贯性?(随意切割文本肯定会导致上下文的丢失)
- 如何对文本进行 Embedding,这个 Embedding 算法怎么实现?
- 请求 AI 大模型的格式是什么,响应的内容如何解析?
- 向量数据库如何增删查改?
- 如果想替换向量数据库的类型,想替换大模型 ChatGPT 成 ChatGLM 怎么办?
如果从头实现上面的所有功能,想想都头大😵💫,真的是从入门到放弃。LangChain 的出现让 AI 应用的构建变得简单。
对 LangChain
的功能进行归类总结下:
为了加速和简化构建 AI 应用的工作,LangChain
将是本系列的一个核心内容,但由于 LangChain
的版本迭代比较快,并且文档有点混乱,本篇的目的就是让大家更加轻松掌握 LangChain
,为后续 ChatWithPDF
的开发打下基础。
Chains 是什么?
Chains
中文是链的意思,它是 AI 应用开发中的一个重要概念,让我们用一个简单的例子来说明 Chains
的应用。比如开发一个自动生成代码的功能,输入的参数是两个 language
和 task
,language
表示编程语言(如 Python),task 是需要生成代码的说明,因此大致流程如下:
由于 token 数量的限制,建议使用英文作为 Prompt
(提示语),最终通过与 AI 大模型 ChatGPT 的交互之后,可以得到相对应的 Python 代码。
通过 LangChain
我们可以轻易的替换所使用的 AI 大模型(ChatGPT、Llama、Claude 对应不同的大模型),而不需要改动其他模块的代码。
此时,我们再增加一个需求:对生成的代码进行代码审查,检查生成的代码是否有 Bug
,并且需要用另外一个大模型完成这个功能。最简单的办法就是重新改写上面的 Prompt
(提示语),让 AI 大模型先生成代码,然后在对代码进行审查。
但在 LangChain
中有个更灵活的方式,再构建一个流程,然后将上个流程的输出作为下一个流程的输入,具体情况如下图所示:
这个思想是不是有点熟悉?没错,就是 unix pipeline
,比如统计包含 “aa” 日志的条目数: cat test.log | grep aa | wc -l
。每个程序都实现单一的功能,然后通过 pipeline
将它们组合起来完成更复杂的功能。
LangChain
也是同样的,你可以通过 LangChain
构建不同的 Chain
,然后将每个 Chain
串联起来完成复杂的工作,如下图:
相信通过上面的示例,大家对于 LangChain
中 Chain
的设计与使用有了更加深刻的理解,接下来我们通过一个具体示例来演示 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 的初始化命令不一样,请参考官方文档。
- 创建本地目录 easychat
bash
mkdir easychat && cd easychat
- 初始化虚拟环境
python -m venv .venv
- 激活虚拟环境
bash
source .venv/bin/activate
建立主框架
主框架就是不断获取用户的输入,然后做业务逻辑的处理,最后将响应的内容显示到屏幕上。另外,当用户输入 exit
时,程序退出。代码很简单,如下所示:
逐步完善功能
在与 AI 大模型交互的时候,一般涉及三个角色:
- system:设置 AI 大模型的角色
- user:使用的用户,对应用户的输入
- assistant:AI 大模型,对应大模型的输出
真正与大模型的交互就是靠调用 API 去实现,但如果不借助 LangChain
,作为开发者需要去阅读每个 AI 大模型的 API 文档,并且切换不同的大模型还需要修改相对应的代码,这些是比较繁琐的事情,有了 LangChain
就可以简化流程。
接下来,让我们逐步完善功能:
1、先安装相应的 LangChain
包
pip install python-dotenv langchain langchain-core langchain-community langchain-openai
2、Azure OpenAI
密钥和接口配置
bash
touch .env
根据自己账号下的配置填写配置文件
.env
AZURE_OPENAI_API_KEY=(请求key)
AZURE_OPENAI_ENDPOINT=(请求API)
OPENAI_API_VERSION=2024-02-01
AZURE_CHAT_MODEL=gpt-35-turbo
3、通过 load_dotenv
引入配置文件中的内容至环境变量
csharp
from dotenv import load_dotenv
load_dotenv()
通过以上操作,可以避免 Azure OpenAI
的相关配置写死在代码中。
4、构建提示语模板
python
prompt = ChatPromptTemplate(
input_variables=["content"],
messages=[
HumanMessagePromptTemplate.from_template("{content}"),
],
)
这个代码非常简单,利用 ChatPromptTemplate
定义提示语的模板,将用户的输入定义为 content
,然后通过 HumanMessagePromptTemplate.from_template("{content}")
将用户的输入直接构建成提示语。
5、初始化 AI 模型
python
chat = AzureChatOpenAI(
azure_deployment=os.getenv("AZURE_CHAT_MODEL"),
)
6、定义响应解析器
ini
output_parser = StrOutputParser()
7、构建 Chains
ini
chain = prompt | chat | output_parser
这里再次印证了上面说的 chain
和 unix pipeline
思路一样 ,使用方式都基本一致。
8、传入用户输入,调用 chain
css
# 5. 调用 chain,这里 `content` 就是构建填充到提示语模板中的 `content`
result = chain.invoke({"content": content})
最终完整代码:
python
import os
from dotenv import load_dotenv
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.schema import StrOutputParser
from langchain_openai import AzureChatOpenAI
load_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_parser
while True:
content = input(">> ")
if content.strip() == "exit":
break
# 5. 调用 chain,这里 `content` 就是构建填充到提示语模板中的 `content`
result = chain.invoke({"content": content})
print("AI Answer: ", result)
效果展示
直接执行 python main.py
运行程序,问几个问题,看看效果:
效果还是ok的,大家可以自己运行体验下。但是这个 easychat
的机器人有个问题,就是没有记忆功能,让我们做个功能测试:
- 告诉它我们的名字叫做“开发者语”
- 再问它我们的名字,看看效果
为什么会出现这种情况呢?因为调用 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扫描下方二维码免费领取🆓