目录
一、前言
近年来,自然语言处理(NLP)领域取得了显著进展,特别是大型预训练语言模型的出现,如 ChatGPT 系列、BERT、T5 等。这些模型在各种 NLP 任务中展现了强大的性能,并且能够通过微调适应特定应用场景。然而,开发和部署这样的模型对于许多开发者来说仍然是一个复杂的过程,涉及到数据准备、模型选择、训练优化、推理服务等多个环节。因此,需要一个专门的框架来简化这一过程,而 LangChain 的出现很好的解决了这个问题。本文将详细介绍下LangChain 的使用。
二、LangChain 概述
2.1 LangChain 是什么
LangChain 是一个专注于构建和连接语言模型(Language Models, LM)应用的开源框架。它旨在简化开发者在创建基于语言模型的应用和服务时所面临的挑战,提供了一系列工具和库来加速开发过程,并使这些模型更容易被集成到各种应用程序中。
简单来说,LangChain提供了灵活的抽象和AI优先的工具,可帮助开发人员将LLM应用程序从原型转化为生产环境。 它还提供了一套工具,可帮助开发人员构建上下文感知、推理应用程序, LangChain的工具包括聊天机器人、文档分析、摘要、代码分析、工作流自动化、自定义搜索等。官网地址:LangChain
2.2 LangChain 主要特点
LangChain具有下面的特点:
模块化架构:
LangChain 提供了一个高度模块化的架构,允许用户根据需要选择不同的组件进行组合。这种灵活性使得开发者可以根据自己的需求定制解决方案,无论是构建简单的聊天机器人还是复杂的企业级自然语言处理系统。
丰富的预训练模型支持
该框架支持多种流行的预训练语言模型,如 GPT 系列、BERT、T5 等等。这为开发者提供了广泛的选择空间,可以根据具体应用场景挑选最合适的模型。
强大的推理与生成能力:
框架内置了对文本分类、命名实体识别、问答系统、对话管理等多种任务的支持,同时也提供了高级功能如文本摘要、翻译等,极大地扩展了语言模型的应用范围。
便捷的数据处理工具:
LangChain 内置了数据清洗、标注、增强等一系列数据处理工具,帮助开发者更高效地准备训练数据或优化现有数据集的质量。
易于部署和扩展:
LangChain 支持云服务和本地部署两种方式,并且具备良好的可扩展性,能够轻松应对从小型实验项目到大规模生产环境的不同需求。
社区驱动的发展模式:
作为一个活跃发展的开源项目,LangChain 拥有一个庞大而热情的社区。通过 GitHub、Slack 等平台,成员们可以分享经验、解决问题以及贡献代码,共同推动项目的进步。
文档详尽:
LangChain 提供了详细的官方文档和技术博客,帮助新手快速上手,同时也为有经验的开发者提供了深入理解框架内部运作的机会。
2.3 LangChain能做什么和能力一览
下面是一张LangChain的能力模型
结合上面这幅图,对LangChain 的能力做如下总结:
LLMs & Prompt
提供了目前市面上几乎所有 LLM 的通用接口,同时还提供了 提示词 的管理和优化能力,同时也提供了非常多的相关适用工具,以方便开发人员利用 LangChain 与 LLMs 进行交互。
Chains
LangChain 把 提示词、大语言模型、结果解析封装成 Chain,并提供标准的接口,以便允许不同的Chain 形成交互序列,为 AI 原生应用提供了端到端的 Chain
Retrieval Augemented Generation
检索增强生成式 是一种解决预训练语料数据无法及时更新而带来的回答内容陈旧的方式。LangChain 提供了支持检索增强生成式的Chain,在使用时,这些Chain会首先与外部数据源进行交互以获得对应数据,然后再利用获得的数据与 LLMs 进行交互。典型的应用场景如:基于特定数据源的问答机器人。
Agent
对于一个任务,代理主要涉及让 LLMs 来对任务进行拆分、执行该行动、并观察执行结果,代理 会重复执行这个过程,直到该任务完成为止。LangChain 为 代理 提供了标准接口,可供选择的代理,以及一些端到端的代理的示例。
Memory
指的是 chain 或 agent 调用之间的状态持久化。LangChain 为 内存 提供了标准接口,并提供了一系列的 内存 实现。
Evaluation
LangChain 还提供了非常多的评估能力以允许我们可以更方便的对 LLMs 进行评估。
2.4 LangChain 主要应用场景
Langchain可以在下面的一些场景中进行使用
个人助手
一些app或小程序,输入问题即可得到回答内容
聊天机器人
表格数据查询
文档总结
API交互
信息提取
三、环境准备
在正式开始使用LangChain 之前,需要先把开发环境准备好,LangChain目前有两个语言实现,python和Node.js,本文使用python进行演示。
3.1 python 开发环境
下面操作的环境基于win11的环境之下
3.1.1 python环境
版本号:>= 3.10
3.1.2 配置vscode环境
vscode 版本没有限制
vscode 安装python编码插件,支持python编程
3.1.3 安装LangChain相关插件包
1)更新pip
pip install --upgrade pip
2)设置拉取安装包镜像源
- 可以加速pip install过程中拉取安装包的速度,这里使用的是清华镜像源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/
3)安装几个与LangChain相关包
pip install langchain
pip install qianfan
pip install langchain_community
安装过程
3.2 获取大模型平台ApiKey
由于LangChain支持国内外多种大模型对其API的使用,比如Open AI,国内的通义千问,百川大模型,百度的千帆大模型等,所以在后文的演示中需要对接各个平台,就需要提前获取各个平台的apikey才能在代码集成中正常调用。这里以千帆大模型,百川大模型和通义千问为例进行说明演示。
3.2.1 获取百度千帆大模型ApiKey
1) 登录百度千帆大模型平台
登录地址,如果没有账号可以先注册一个账号
https://console.bce.baidu.com/qianfan/ais/console/applicationConsole/application/v1
2)创建应用
在应用接入那里,创建一个测试使用的应用,创建之后,平台会为该应用分配几个基本的信息,比如应用ID,ApiKey信息等,后面程序中需要通过这几个参数来调用langchain的api;
应用创建之后,注意保存这个应用的几个核心参数,包括:API Key,Secret Key
3.2.2 获取百川大模型ApiKey
登录百川平台,点击创建API Key,然后会生成一个可以使用的apikey,过程比较简单
https://platform.baichuan-ai.com/console/apikey
3.2.3 获取通义大模型apikey
参考下面这个文档,获取apikey,通常做法是,在阿里百炼大模型平台注册并获取这个apikey即可
https://help.aliyun.com/zh/model-studio/developer-reference/get-api-key
四、平台大模型调用LangChain能力操作实战
4.1 百度千帆大模型调用LangChain
LangChain 支持多种大模型对其API能力的使用,通过官方文档也可以看到,它不仅支持一些主流的大模型平台的调用,比如 OpenAI,也支持像持百度千帆大模型、百川大模型、腾讯混元大模型、通义千问大模型等调用,下面以千帆大模型为例进行Chat模型相关能力的使用。
https://python.langchain.com/v0.2/docs/integrations/llms/
4.1.1 Chat models 能力使用
点击Baidu Qianfan ,调整到下面的页面,官方也提供了详细的接入过程,这里以0.2版本为例进行说明
点击链接进入参考示例,里面给出了详细的接入示例过程
结合官方API示例,提供如下参考代码:
import os
from langchain_community.chat_models import QianfanChatEndpoint
from langchain_core.messages import HumanMessage
# 设置环境变量 #换成网页中的API_KEY和SECRET_KEY
os.environ["QIANFAN_AK"] = "你的apikey"
os.environ["QIANFAN_SK"] = "你的secretkey"
# 初始化聊天端点
chat = QianfanChatEndpoint(streaming=True)
# 无限循环,直到用户输入 'exit'
while True:
# 获取用户输入
user_input = input("请输入您的问题(输入'exit'退出): ")
# 检查是否输入了 'exit'
if user_input.lower() == 'exit':
print("退出程序...")
break
# 构造 HumanMessage 对象并发送请求
response = chat([HumanMessage(content=user_input)])
# 打印响应内容
print(response.content)
运行这段代码,观察控制台输出效果,可以在控制台与langchain进行持续对话了
4.1.2 LLM 能力使用
官方文档地址:
参考下面的完整代码:
"""For basic init and call"""
import os
from langchain_community.llms import QianfanLLMEndpoint
os.environ["QIANFAN_AK"] = "your_ak"
os.environ["QIANFAN_SK"] = "your_sk"
llm = QianfanLLMEndpoint(streaming=True)
res = llm.invoke("你是谁")
print(res)
4.1.3 Embedding 能力使用
Embedding即文档嵌入模型,文本嵌入模型接收文本作为输入,返回的是一组浮点数,对应的文档链接:
参考下面的完整代码
"""For basic init and call"""
import os
from langchain_community.embeddings import QianfanEmbeddingsEndpoint
os.environ["QIANFAN_AK"] = "your_ak"
os.environ["QIANFAN_SK"] = "your_sk"
embed = QianfanEmbeddingsEndpoint(
# qianfan_ak='xxx',
# qianfan_sk='xxx'
)
res = embed.embed_documents(["hi", "world"])
async def aioEmbed():
res = await embed.aembed_query("qianfan")
print(res[:8])
await aioEmbed()
async def aioEmbedDocs():
res = await embed.aembed_documents(["hi", "world"])
for r in res:
print("", r[:8])
await aioEmbedDocs()
4.2 百川大模型调用LangChain
4.2.1 Chat models能力使用
从下面的入口进去
https://python.langchain.com/v0.2/docs/integrations/chat/baichuan/
官网也提供了参考示例代码
完整代码参考如下:
1)基本使用
import os
os.environ["BAICHUAN_API_KEY"] = "你的apikey"
from langchain_community.chat_models import ChatBaichuan
from langchain_core.messages import HumanMessage
# 初始化ChatBaichuan
chat = ChatBaichuan(baichuan_api_key="你的apikey")
# 发送消息并获取回复
response = chat([HumanMessage(content="用通俗的语言解释下什么是蝴蝶效应")])
print(response.content)
2)流式输出
Baichuan API还支持流式输出,这对实时对话很有用
chat = ChatBaichuan(
baichuan_api_key="YOUR_API_KEY",
streaming=True,
)
for chunk in chat([HumanMessage(content="用通俗的语言解释下什么是蝴蝶效应")]):
print(chunk.content, end="", flush=True)
4.2.2 LLM 能力代码操作演示
在langchain文档中选择百川大模型进去 ,里面给出了调用的详细过程
https://python.langchain.com/v0.2/docs/integrations/llms/baichuan/
参考下面的代码:
import os
os.environ["BAICHUAN_API_KEY"] = "你的apikey"
from langchain_community.llms import BaichuanLLM
# Load the model
llm = BaichuanLLM()
res = llm.invoke("python程序员学习路线是怎样的")
print(res)
4.2.3 Embedding模型能力使用
文档链接:https://python.langchain.com/v0.2/docs/integrations/text_embedding/baichuan/
参考下面的完整代码:
import os
from langchain_community.embeddings import BaichuanTextEmbeddings
embeddings = BaichuanTextEmbeddings(baichuan_api_key="你的apikey")
text_1 = "今天天气不错"
text_2 = "今天阳光很好"
query_result = embeddings.embed_query(text_1)
print(query_result)
4.3 通义大模型调用LangChain
从LangChain官方文档也可以看到,对通义大模型也是支持的,下面来看看具体的操作和使用
4.3.1 LLM 能力使用
使用下面的命令提前安装依赖包
pip install --upgrade --quiet langchain-community dashscope
进入通义llm参考文档:https://python.langchain.com/v0.2/docs/integrations/llms/tongyi/ ,里面也提供了完整的示例代码
参考下面的完整代码:
import os
os.environ["DASHSCOPE_API_KEY"] = "你的apikey"
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.messages import HumanMessage
chatLLM = ChatTongyi(
streaming=True,
)
res = chatLLM.stream([HumanMessage(content="你是谁")], streaming=True)
for r in res:
print("chat resp:", r)
运行一下,通过控制台观察效果
4.3.2 使用chat models能力
进入通义chat models 参考文档:https://python.langchain.com/v0.2/docs/integrations/chat/tongyi/ ,里面也提供了完整的示例代码
参考下面的完整代码:
import os
os.environ["DASHSCOPE_API_KEY"] = '你的apikey'
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.messages import HumanMessage
chatLLM = ChatTongyi(
streaming=True,
)
res = chatLLM.stream([HumanMessage(content="请介绍一下上海这个城市")], streaming=True)
for r in res:
print("chat resp:", r)
运行一下观察效果
4.3.3 使用Prompt能力
Prompt 是一种精心设计的输入信息,可以是问题、指令、描述、场景设定或是对话历史的一部分,其主要目标是清晰、精确地传达用户的意图,使得模型能够据此生成满足需求的高质量输出。
LangChain 提供了创建和使用 Prompt 的工具。LangChain 致力于创建与模型无关的模板,以便于在不同的语言模型中重用现有模板。通常情况下,语言模型的最佳Prompt 是字符串或聊天消息列表。
PromptTemplate:
- 一种通用形式的模板,用于生成系统提示或信息模板。
- 它可以应用于多种场景,如用户输入错误时的提示、系统操作成功时的提示、数据加载提示、信息确认提示以及活动推广提示等,并不特定于对话或聊天场景。
# 导入prompt类
from langchain.prompts import PromptTemplate
from langchain_community.llms import Tongyi
import os
os.environ["DASHSCOPE_API_KEY"] = "你的apikey"
# 定义模板
pp = "{county}的首都是哪里?"
# 实例化模板类 PromptTemplate是LangChain 中用于构建和格式化提示(prompt)的一种方式
promptTemplate = PromptTemplate.from_template(pp)
# 输入
ins = input("请输入国家名:")
# 生成prompt 使用 format 方法来填充模板变量
prompt = promptTemplate.format(county=ins)
# 输出格式化提示
print(prompt)
# 实例化通义大模型
tongyi = Tongyi()
# Tongyi 模型的 API 接口通常遵循 LangChain 的 BaseLLM 接口规范,该规范推荐使用 .invoke() 方法来处理输入并返回输出。
ret = tongyi.invoke(prompt) # invoke() 方法用来调用模型并获取输出
print(ret)
运行上面的代码,在控制台输入:韩国 ,可以得到正确的响应
ChatPromptTemplate:
- 是PromptTemplate在聊天领域的一个特殊表达,专注于对话和聊天场景,帮助用户更好地组织和展示对话内容。
- ChatPromptTemplate的上下文功能使得用户能够更好地理解对话的背景和情境,从而更好地参与和回应对话内容。
参考下面的示例代码:
#!pip install langchain langchainhub dashscope
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import LLMChain
from langchain_community.llms import Tongyi
from langchain import hub
import os
prompt1 = ChatPromptTemplate.from_template("""{input}
"""
)
os.environ["DASHSCOPE_API_KEY"] = "你的apikey"
llm = Tongyi()
chain_one = LLMChain(
llm=llm,
prompt=prompt1,
verbose=False
)
print(chain_one.invoke("深圳1998年的情况介绍"))
print(chain_one.invoke("HTML入门"))
print(chain_one.invoke("什么是深度学习"))
运行上面的代码可以看到控制台的输出效果
ChatMessagePromptTemplate
- 是LangChain框架中用于生成特定角色或自定义角色对话提示的一个模板。
- 这个模板允许用户指定角色的名称,并基于提供的模板字符串生成相应的聊天消息提示。
参考下面的示例代码:
# 导入prompt类
from langchain.prompts import PromptTemplate
from langchain_community.llms import Tongyi
from langchain.prompts import ChatMessagePromptTemplate
import os
os.environ["DASHSCOPE_API_KEY"] = "你的apikey"
message = "请帮我写一篇关于{type}的文章,字数不超过300字"
# 实例化
promptTemplate = ChatMessagePromptTemplate.from_template(role = "IT技术专家",template=message)
prompt = promptTemplate.format(type="大数据")
print(prompt.content)
tongyi = Tongyi()
ret = tongyi.invoke(prompt.content)
print(ret)
运行上面的代码,可以看到控制台输出了一篇不超过300字的文章
五、写在文末
本文详细介绍了LangChain 的技术以及在国内几个主流大模型中的集成和使用,关于LangChain ,其提供的组件非常丰富,同时基于LangChain 可以进行很多个性化的定制大模型应用能力开发,限于篇幅本文先介绍到这里,有兴趣的同学可以继续深入研究,本篇到此结束,感谢观看。