用LangChain构建大语言模型应用

news2024/9/20 16:50:28

用LangChain构建大语言模型应用

自 ChatGPT 发布以来,大型语言模型 (LLM) 广受欢迎。尽管您可能没有足够的资金和计算资源从头开始训练自己的大语言模型,但您仍然可以使用预训练的大语言模型来构建一些很酷的东西,例如:

  • 可以根据您的数据与外界互动的个人助理
  • 为您的目的定制的聊天机器人
  • 分析或总结您的文档或代码

大语言模型正在改变我们构建人工智能产品的方式

利用 API 和提示工程设计,大语言模型正在改变我们构建 AI 驱动产品的方式。由此的诞生了一个新的技术名字“LLMOps”—— LangChain 就是其中最流行的工具之一。

在这里插入图片描述

文章目录

    • 什么是LangChain?
    • 环境搭建
      • 安装LangChain
      • API 密钥
      • 向量数据库(可选)
    • LangChain 6大核心模块
      • Models
      • Prompts
      • Chains
      • Indexes
      • Memory
      • Agents
    • 总结

什么是LangChain?

LangChain 是一个旨在帮助您轻松构建大语言模型应用的框架,它提供如下功能:

  • 为各种不同基础模型提供统一接口(参见Models)
  • 帮助管理提示的框架(参见Prompts)
  • 一套中心化接口,用于处理长期记忆(参见Memory)、外部数据(参见Indexes)、其他 LLM(参见Chains)以及 LLM 无法处理的任务的其他代理(例如,计算或搜索)。

因为 LangChain 有很多不同的功能,所以一开始可能很难理解它的作用。因此我将在本文中介绍 LangChain 的(当前)六个关键模块,以便您更好地了解其功能。

环境搭建

要继续学习本教程,您需要安装 langchain Python 包并准备好所需的相关 API 密钥。

安装LangChain

在安装 langchain 包之前,请确保您的 Python 版本≥ 3.8.1 且 <4.0。

安装 langchain Python 包最简单的方法是通过 pip 安装。

pip install langchain

安装完成后,您可以导入 langchain 包,输出 langchain 包的版本号。如果能看到控制输出版本号,说明langchain 包安装成功。

>>> import langchain
>>> langchain.__version__
'0.0.154'

⚠注意:在本教程中,我使用的 langchain 版本为 0.0.154。 LangChain 项目非常活跃,版本库代码频繁更新;因此,请确保您使用的是与我相同或兼容的版本。

API 密钥

使用 LLM 构建应用程序需要您提供调用服务的 API 密钥,并且某些 API 会产生相关费用。

LLM 提供者(必需)——您首先需要选择一个大语言模型提供者并获取其 API 密钥。我们目前正在经历“AI 的 Linux 时刻”,开发人员必须在性能和成本之间做出权衡,在专有基础模型或开源基础模型之间做出选择。

在这里插入图片描述

专有模型是拥有大量专家团队和大量 AI 预算的公司所拥有的闭源基础模型。它们通常比开源模型更大,因此性能更好,但它们的 API 也很昂贵。专有模型提供商的典型代表包括 OpenAI、co:here、AI21 Labs 和 Anthropic。

大部分 LangChain 教程都使用 OpenAI,但请注意 OpenAI API 不是免费的,甚至 GPT-4 API 还很昂贵,具体请参阅《GPT-4 API 接口调用及价格分析》。 要获取 OpenAI API Key,您需要一个 OpenAI 帐户,然后在 API keys 页面中点击“Create new secret key”来创建API Key(参见下图)。

在这里插入图片描述

有了API Key后,您可以将该Key保存到环境变量中,供代码各模块使用:

import os
os.environ["OPENAI_API_KEY"] = ... # 填入OpenAI Secret Key

开源模型通常比专有模型规模更小,功能也稍弱,但开源模型比专有模型更具成本效益。 著名的开源模型有:

  • BigScience 的 BLOOM
  • Meta AI 的 LLaMA
  • Google 的 Flan-T5
  • Eleuther AI 的 GPT-J

更多开源模型请参阅《开源大语言模型(LLM)汇总》。

许多开源模型都托管在 Hugging Face 上。要获取 Hugging Face API 密钥,您需要一个 Hugging Face 帐户并在Access Tokens 下创建“New token”(参见下图)。

在这里插入图片描述

同样,你可以将Hugging Face Access Token 保存在环境变量中供其他模块使用:

import os

os.environ["HUGGINGFACEHUB_API_TOKEN"] = ... # 插入Hugging Face Access Token

向量数据库(可选)

如果你想使用特定的向量数据库,如 Pinecone、Weaviate 或 Milvus,你需要单独注册来获得 API 密钥。在本教程中,我们使用无需注册的 Faiss。

LangChain 6大核心模块

langchain包为许多基础模型提供了一个通用接口,支持提示管理,并通过代理充当其他组件(如提示模板、其他大语言模型、外部数据和其他工具)的中央接口。

LangChain 有6大核心模块:

  • Models:从不同的 LLM 和嵌入模型中进行选择
  • Prompts:管理 LLM 输入
  • Chains:将 LLM 与其他组件相结合
  • Indexes:访问外部数据
  • Memory:记住以前的对话
  • Agents:访问其他工具

Models

目前,许多不同的大型语言模型正在不断涌现。 LangChain 了提供与各种模型的集成接口,并为所有模型提供了 streamlined 界面。

LangChain 区分三种输入和输出不同的模型:

  • LLMs接受一个字符串作为输入(prompt)输出一个字符串
# 专有模型,例如:OpenAI
# pip install openai
from langchain.llms import OpenAI
llm = OpenAI(model_name="text-davinci-003")

# 或者托管在Hugging Face 上的开源模型
# pip install huggingface_hub
from langchain import HuggingFaceHub
llm = HuggingFaceHub(repo_id = "google/flan-t5-xl")

# llm实例接受一个提示输入,返回字符串作为输出
prompt = u"中国的首都是?"
completion = llm(prompt)

在这里插入图片描述

  • Chat Model 与 LLM 类似,将聊天消息列表输入模型并返回一条聊天消息。
  • Text embedding model 接受文本输入并返回浮点数(嵌入)列表,这是输入文本的数字表示。 文本嵌入有助于从文本中提取信息,供后续使用。例如,用于计算文本(例如电影摘要)之间的相似性。
# 专有文本嵌入模型,例如:OpenAI
# pip install tiktoken
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()

# 或者托管在Hugging Face 上的开源文本嵌入模型
# pip install sentence_transformers
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model_name = "sentence-transformers/all-MiniLM-L6-v2")

# 文本嵌入模型接受文本输入输出浮点数列表
text = u"中国的首都是?"
text_embedding = embeddings.embed_query(text)

在这里插入图片描述

Prompts

虽然用自然语言向大语言模型输入提示很直观,但想要获得预期的良好输出需要对提示进行相当多的调整。这个过程称为提示工程。

在大语言模型使用中,好的提示是珍贵的。因此,一旦你有了一个好的提示,建议你将它保存成模板供以后复用。 为此,LangChain 提供了 PromptTemplates,它可以帮助您从多个组件构建提示。

from langchain import PromptTemplate

template = u"请为宠物{animal}起一个好听的名字。"

prompt = PromptTemplate(
    input_variables=["animal"],
    template=template,
)

prompt.format(animal="猫")

上面的提示可以看作是零样本问题设置,您希望 LLM 在足够的相关数据上进行训练以提供令人满意的响应。

改进 LLM 输出的另一个技巧是在提示中添加一些示例,也就是所谓的小样本问题设置

from langchain import PromptTemplate, FewShotPromptTemplate

examples = [
    {"word": "高兴", "antonym": "悲伤"},
    {"word": "高大", "antonym": "矮小"},
]

example_template = """
词语: {word}
反义词: {antonym}\n
"""

example_prompt = PromptTemplate(
    input_variables=["word", "antonym"],
    template=example_template,
)

few_shot_prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    prefix="给出输入词语的反义词",
    suffix="词语: {input}\n反义词:",
    input_variables=["input"],
    example_separator="\n",
)

few_shot_prompt.format(input="美丽")

上面的代码将生成一个提示模板,并根据提供的示例和输入组成以下提示:

给出输入词语的反义词

词语: 高兴
反义词: 悲伤


词语: 高大
反义词: 矮小

词语: 美丽
反义词:

Chains

LangChain 中的 Chains 描述了将大语言模型与其他组件相结合,来创建应用程序的过程。下面是 一些例子:

  • 将 LLM 与提示模板相结合(参见本节)
  • 将第一个 LLM 的输出作为第二个 LLM 的输入来串联多个 LLM(请参阅本节)
  • 将 LLM 与外部数据相结合,例如用于问答(参见Indexes)
  • 将 LLM 与 Memory 相结合,例如聊天记录(参见Memory)

在上一节中,我们创建了一个提示模板。当我们想将它与我们的 LLM 一起使用时,我们可以按如下方式使用 LLMChain

from langchain.chains import LLMChain

chain = LLMChain(llm = llm, prompt = prompt)

chain.run("猫")

如果我们想使用第一个 LLM 的输出作为第二个 LLM 的输入,我们可以使用 SimpleSequentialChain

from langchain.chains import LLMChain, SimpleSequentialChain

# 前面的代码定义了第一个chain
# ...

# 创建第二个chain
second_prompt = PromptTemplate(
    input_variables=["petname"],
    template="写一篇关于{petname}的小诗。",
)

chain_two = LLMChain(llm=llm, prompt=second_prompt)

# 将两个chain串联在一起
overall_chain = SimpleSequentialChain(chains=[chain, chain_two], verbose=True)

# 只需给出源头输入结合顺序运行整个chain
catchphrase = overall_chain.run("猫")

Indexes

LLM 的一个局限是缺乏上下文信息(例如,访问某些特定文档或电子邮件)。你可以通过授予 LLM 访问特定外部数据的权限来解决这个问题。

为此,你首先需要使用文档加载器加载外部数据。 LangChain 为不同类型的文档提供了多种加载器,从 PDF 和电子邮件再到网站和 YouTube 视频。

让我们从最简单的文本文件加载开始。

from langchain.document_loaders import TextLoader

loader = TextLoader('../state_of_the_union.txt', encoding='utf8')

documents = loader.load()

如果文本很大,可以使用 CharacterTextSplitter 对文档进行分割:

from langchain.text_splitter import CharacterTextSplitter

text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)

texts = text_splitter.split_documents(documents)

上面的代码中 chunk_size 表示块的最大大小,由 lengh() 来度量。chunk_overlap 表示块之间的最大重叠。 有一些重叠可以很好地保持块之间的一些连续性(例如,做一个滑动窗口)。最终切分好的文本在 texts 元组中,可以通过下标索引来读取。

有了外部数据后,你可以使用向量数据库中的文本嵌入模型(请参阅Model)对其进行索引。流行的向量数据库有很多,本文中,我使用 Faiss,因为它不需要 API 密钥。

# pip install faiss-cpu
from langchain.vectorstores import FAISS

# 创建 vectorestore 用作索引
db = FAISS.from_documents(texts[0], embeddings)

上面的代码将文本以词嵌入的形式保存到向量数据库中。这些外部数据可以做很多事情,下面我们将用这些外部数据做一个带有检索功能的问答机器人:

from langchain.chains import RetrievalQA

retriever = db.as_retriever()

qa = RetrievalQA.from_chain_type(
    llm=llm, 
    chain_type="stuff", 
    retriever=retriever, 
    return_source_documents=True)

query = u"中国古典四大名著是什么?"
result = qa({"query": query})

print(result['result'])

上面的代码会用输入问题从数据库中检索最相近的答案。

Memory

对于像聊天机器人这样的应用程序,它们必须能够记住以前的对话。但默认情况下,LLM 没有任何长期记忆,除非你将聊天记录输入给它。

LangChain 提供了几种不同的选项,用于处理聊天记录:

  • 保留所有对话
  • 保留最近的 k k k 个对话
  • 总结对话

在下面示例中,我们将使用 ConversationChain 为应用程序提供会话记忆。

from langchain import ConversationChain

conversation = ConversationChain(llm=llm, verbose=True)

conversation.predict(input="所有的北极熊都是白色的")

conversation.predict(input="bob是一只北极熊")

conversation.predict(input="bob是什么颜色的?")

如果没有 ConversationChain 来保存对话记忆,大模型会说没有足够的信息,无法回答该问题。用了 ConversationChain 就能很好地回答。

Agents

尽管大语言模型非常强大,但也有一些局限性:比如训练数据中缺乏特定领域知识,再比如 ChatGPT 的训练数据截止到 2021 年 9 月。

为了对大语言模型进行增强,我们可以让大模型访问辅助工具,例如搜索引擎、计算器或维基百科。此外,我们需要 Agent 根据 LLM 的输出来决定使用哪些工具来完成任务。

下面的例子中,Agent 首先使用维基百科查找 Barack Obama 的出生日期,然后使用计算器计算他在 2023 年的年龄。

# pip install wikipedia
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType

tools = load_tools(["wikipedia", "llm-math"], llm=llm)
agent = initialize_agent(tools, 
                         llm, 
                         agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, 
                         verbose=True)


agent.run("奥巴马的生日是哪天? 到2023年他多少岁了?")

总结

LangChain 是一个开源 Python 库,任何可以编写代码的人都可以使用它来构建 LLM 支持的应用程序。 该包为许多基础模型提供了通用接口,支持提示管理,并在撰写本文时充当其他组件(如提示模板、其他 LLM、外部数据和其他工具)的中央接口。

该库提供的功能比本文中提到的要多得多,并且还在快速迭代,以目前的发展速度,这篇文章也可能在一个月内就过时了。建议大家关注 LangChain 项目,时刻留意其新功能发布,并多参考 LangChain 的官方文档。

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

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

相关文章

01-权限提升-网站权限后台漏洞第三方获取

权限提升-网站权限后台漏洞第三方获取 本节课内容主要是权限提升的思路&#xff0c;不涉及技术 当前知识点在渗透流程中的点 前期-中期-后期对应知识关系 当前知识点在权限提升的重点 知识点顺序&#xff0c;理解思路&#xff0c;分类介绍等 当前知识点权限提升权限介绍 …

Java8

Java8 &#xff08;一&#xff09;、双列集合&#xff08;二&#xff09;、Map集合常用api&#xff08;三&#xff09;、Map集合的遍历方式&#xff08;四&#xff09;、HashMap&#xff08;五&#xff09;、LinkedHashMap&#xff08;六&#xff09;、TreeMap&#xff08;七&a…

Steve:AI创建视频和动画的在线工具

【产品介绍】 steve.ai是一款利用人工智能技术创建视频和动画的在线工具&#xff0c;可以让任何人在几分钟内把文字转换成吸引人的视频。核心功能是根据用户输入的文本&#xff0c;自动选择合适的素材、音乐、字幕和动效&#xff0c;生成高质量的视频。还提供了多种模板、风格和…

Photoshop如何使用滤镜之实例演示?

文章目录 0.引言1.将普通照片制作成油画效果2.使用液化滤镜修出完美身材3.用镜头光晕滤镜制作唯美的逆光人像4.用Camera Raw滤镜对偏色风景照进行调色 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对PS进行了学习&#xff0c;本文通过《Photoshop2021入门教程》及其…

Servlet 笔记

1. HTTP 协议 1.1 HTTP协议简介 超文本传输协议&#xff08;英文&#xff1a;HyperText Transfer Protocol&#xff0c;缩写&#xff1a;HTTP&#xff09;是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。 HTTP的发展是由蒂姆伯纳斯-…

etcd原理剖析一

为什么Kubernetes使用etcd&#xff1f; 首先我们来看服务高可用以及数据一致性。单副本存在单点故障&#xff0c;而多副本又引入数据一致性问题。 为了解决数据一致性问题&#xff0c;需要引入一个共识算法。例如Raft等。etcd选择了Raft&#xff0c;它将复杂的一致性问题分解…

Maven 笔记

1. Maven 的简介 1.1 简介 Maven 这个词可以翻译为"专家","内行"。作为Apache 组织中的一个开源项目&#xff0c;主要服务于基于java平台的项目构建&#xff0c;依赖管理和项目信息管理。 无论是小型的开源类库项目&#xff0c;还是大型的企业级应用&am…

Spring 5 笔记 - 入门与IOC

1. Spring 入门简介 Spring&#xff1a;轻量级、开源的JavaEE框架&#xff0c; 解决企业应用的复杂性。包括IOC和AOP两个核心部分。 IOC&#xff1a; 控制反转&#xff0c;把创建对象和对象之间的调用的过程都交给Spring 进行管理&#xff0c;使耦合度降低。 AOP&#xff1a…

Winform从入门到精通(38)—StatusStrip(史上最全)更新中

一、属性 1、Name 获取StatusStrip控件对象 2、AllowDrop 允许用户拖拽数据到控件上 3、AllowItemReorder 当用于按下alt键时,是否允许对项进行排列,如下图: 4、AllowMerge 5、Anchor 6、AutoSize 7、BackColor 设置StatusStrip的背景色 8、BackgroundImage 设置背…

R语言方差分析

R中的方差分析 介绍用于比较独立组的不同类型的方差分析&#xff0c;包括&#xff1a; 单因素方差分析&#xff1a;独立样本 t 检验的扩展&#xff0c;用于在存在两个以上组的情况下比较均值。这是方差分析检验的最简单情况&#xff0c;其中数据仅根据一个分组变量&#xff0…

垃圾回收器ZGC应用分析总结

目录 一、基本概述 二、基本关键技术知识总结 &#xff08;一&#xff09;三色标记法&#xff08;着色指针&#xff09; &#xff08;二&#xff09;读屏障 &#xff08;三&#xff09;多图映射 &#xff08;四&#xff09;简单场景说明ZGC并发 三、基本回收原理介绍 四…

PowerJob基本概念

本文来说下PowerJob的一些基本概念 文章目录 PowerJob概述PowerJob官网为什么选择PowerJob同类产品对比适用场景 PowerJob概述 PowerJob是新一代分布式任务调度与计算框架&#xff0c;支持CRON、API、固定频率、固定延迟等调度策略&#xff0c;提供工作流来编排任务解决依赖关系…

React框架第七课 语法基础课《第一课React你好世界》

React框架第七课 语法基础课《第一课React你好世界》 从这一课开始真正进入到React框架的基础语法学习&#xff0c;之前的前五课做个了解即可。 1 React框架的基本项目结构 ├── README.md 使用方法的文档 ├── node_modules 所有的依赖安装的目录 ├── package-lock.j…

[架构之路-181]-《软考-系统分析师》-19- 系统可靠性分析与设计 - 2-容错性: 软件容错技术

目录 前言&#xff1a; 1 9 . 4 软件容错技术 19.4.1 N 版本程序设计 1 . 与 通 常 软 件 开 发 过 程 的 区 别 2 . 其 他 需 要 注 意 的 问 题 19.4.2 恢复块方法 19.4.3 防卫式程序设计&#xff08;预防性设计&#xff09;》广泛使用 1 . 错误检测 2 . 破坏估计 …

【C++初阶】类与对象:6个默认成员函数-----构造函数和析构函数

我们在写代码的时候经常会忘记初始化和销毁&#xff0c;C的构造函数和析构函数就能避免这个问题。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成的成员函数称为默认成员函数。 一.构造函数 A.概念 1.构造函数是一个特殊的成员函数&#xff1b; 2.名字与…

React框架的第八课 语法基础课《第二课React框架中的事件》

React框架的第八课 语法基础课《第二课React框架中的事件》 React中的事件是指通过React建立的应用程序中处理用户交互的响应。React事件处理程序只是在组件上调用的JavaScript函数&#xff0c;以响应某些类型的操作或事件&#xff0c;例如点击、触摸、滚动等。 React组件可以使…

【P3】HTTP 接口设计

一、简答 HTTP 接口设计 HTTP请求默认值&#xff1a; 配置 http 请求的默认值&#xff0c;比如协议、主机、端口 HTTP信息头管理器&#xff1a; 配置 http 请求的头部参数 HTTP请求&#xff1a; 用于和业务交互 查看结果树&#xff1a; 用于结果展示 二、准备工作 慕慕生…

希尔排序详解(Shell Sort)

本文已收录于专栏 《算法合集》 一、简单释义 1、算法概念 希尔排序是插入排序的一种又称“缩小增量排序”&#xff0c;是直接插入排序算法的一种更高效的改进版本。希尔排序是把记录按下标的一定增量分组&#xff0c;对每组使用直接插入排序算法排序&#xff1b;随着增量逐渐…

【复杂网络建模】——Pytmnet进行多层网络分析与可视化

目录 一、Pymnet介绍 二、安装步骤 三、多层网络的构建 1、单层网络的构建 2、双层随机网络的构建和可视化 3、多路复用网络图的可视化 四、总结 一、Pymnet介绍 官网&#xff1a; Pymnet是一个用于网络分析和建模的Python库。它提供了各种网络分析工具&#xff0c;例…

shell的基础学习一

文章目录 一、shell的简介二、 Shell 变量三、Shell 传递参数总结 一、shell的简介 Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供…