用LangChain构建大语言模型应用

用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 osos.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 PromptTemplatetemplate = u"请为宠物{animal}起一个好听的名字。"prompt = PromptTemplate(input_variables=["animal"],template=template,
)prompt.format(animal="猫")

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

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

from langchain import PromptTemplate, FewShotPromptTemplateexamples = [{"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 LLMChainchain = 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 TextLoaderloader = TextLoader('../state_of_the_union.txt', encoding='utf8')documents = loader.load()

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

from langchain.text_splitter import CharacterTextSplittertext_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 RetrievalQAretriever = 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 ConversationChainconversation = 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 AgentTypetools = 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.rhkb.cn/news/71407.html

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

相关文章

开发一个App大概要多少钱?只讲干货

结合自己的各种采坑失败经验以及周边个别成功试水经验&#xff0c;站在个人角度给出一些理解。 APP制作有多种形式&#xff0c;所以需要的成本差异较大。 1.寻找外包公司 2.模板APP&#xff08;内行叫SAAS&#xff09; 3.自己组建团队 互联网外包公司的成本构成&#xff1f…

chatgpt赋能python:为什么Python报错GBK,如何解决?

为什么Python报错GBK&#xff0c;如何解决&#xff1f; Python 是一种广泛使用的编程语言&#xff0c;但在使用过程中经常会出现 “GBk” 相关报错。本文将探讨这种报错的原因和解决方法。 什么是GBK&#xff1f; GBK 是中文编码&#xff0c;是用来在计算机上表示中文字符集…

谷歌如何注册账号?手机号无法验证处理方法!2023年最新教程!

最近学会了如何爬网站&#xff0c;然后在观看油管过程中&#xff0c;想要注册一个油管账号&#xff0c;也就是谷歌账号。但是在注册过程中&#xff0c;您发现无法使用手机号进行验证。您已经查阅了一些解决方法&#xff0c;不过没有解决&#xff0c;最后钞能力在某宝&#xff0…

【实战案例】分享6种常用的信用卡欺诈检测算法(附 Python 代码)

大家好&#xff0c;本文旨在使用 XGBoost、随机森林、KNN、逻辑回归、SVM 和决策树解决信用卡潜在欺诈的分类问题&#xff0c;内容较长&#xff0c;建议收藏、点赞。 文章目录 技术提升案例简介导入相关模块导入数据探索性数据分析特征选择和数据集拆分模型建立模型评估准确率F…

计算机毕业设计(附源码)python信用卡逾期数据处理分析系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

毕业论文使用的卡方检验该如何分析?

一、卡方检验基本说明 有时&#xff0c;在研究中某个随机变量是否服从某种特定的分布是需要进行检验的。可以根据以往的经验或者实际的观测数据分布情况&#xff0c;推测总体可能服从某种分布函数F&#xff08;x&#xff09;。卡方检验就是这样一种用来检验给定的概率值下数据…

金融学毕业论文选题哪些比较少人写而且资料比较多的?

提到金融学专业&#xff0c;你的第一印象是什么&#xff1f; 或许是金融学专业&#xff0c;是一个非常吸金的专业&#xff0c;又或者金融学专业是比较难考的专业&#xff0c;在这学习金融学专业的人都非常厉害&#xff0c;因为金融学非常难学&#xff0c;涉及的领域非常广。 …

教资教育知识与能力中学生发展心理

5.1 心理发展特征 1、中学生心理发展的一般特点【选择/材料】独闭不会过动 独立性&#xff1a;成人感、独立意识 闭锁性&#xff1a;不轻易表露内心世界 不平衡性&#xff1a;心理发展有时落后生理发展 社会学&#xff1a;关注社会生活 过渡性&#xff1a;半幼稚、半成熟…

缺考计算机软件考试影响诚信吗,教资缺考一次会被记入诚信档案?会影响之后的考试?...

大家好&#xff0c;我是小灵通岳麓sir 关注我(csylzxxy)&#xff0c;了解更多相关资讯 很多小伙伴都想问&#xff1a;如果没能去参加考试&#xff0c;会影响下一次报考&#xff1f;听说还会被记入诚信档案&#xff1f;那么不去考试&#xff0c;会不会造成严重的影响呢&#xff…

教资手机报名就5步

愁不想开电脑怎么办呢&#xff1f;就看到一个帖子说苹果手机可以直接报名教师资格证1手机 开心坏了&#xff0c;躺在床上就把名报了&#xff0c;随便给大家做了一份攻略&#xff0c;超级简单&#xff0c;只需5步。 第一步&#xff1a; 就是打开你的手机搜索【中国教育考试网】&…

教资信息技术

笔记↓ 导入新课 引导学生进入学习状态 创设情境 激发学生学习兴趣&#xff0c;使注意力快速集中到课堂上。通过多媒体展现生活实例&#xff0c;讲故事&#xff0c;做游戏。 温故知新 新旧知识之间有联系&#xff0c;适合逻辑复杂内容充实的课程&#xff0c;帮助学生把本课体系…

教师资格证报名照片有什么要求?这些小细节要注意

教师资格证报名照片有什么要求吗&#xff1f;教师资格证考试也是每年当中比较火热的一门考试&#xff0c;很多小伙伴都会在大学期间想要考到教师资格证&#xff0c;想要在毕业之后当一名老师。但是我们在报名的时候是需要上传照片的&#xff0c;很多小伙伴不知道教师资格证报名…

考计算机二级能带帽子吗,教资报名要注意这几点,否则无法通过审核,考区问题最容易出错...

原标题&#xff1a;教资报名要注意这几点&#xff0c;否则无法通过审核&#xff0c;考区问题最容易出错 最近&#xff0c;又到了教师教师证报名的时期&#xff0c;不出意料&#xff0c;系统又面临短暂的崩溃。说到教资&#xff0c;资格证是除了高考以外&#xff0c;每年报考人数…

2021下半年教资信息技术学科知识与教育能力——主观题

二、简答题&#xff08;本大题共3小题&#xff0c;每小题10分&#xff0c;共30分&#xff09; 16.人工智能的应用给人类生活带来了巨大的变化&#xff0c;也带来了一些问题。请列举三个涉及个人隐私泄露问题的场景并进行简要说明。 (1)购物网站会推送一些自己近期提到的商品或类…

2020下半年教资信息技术学科知识与教育能力——主观题

二、简答题&#xff08;本大题共3小题&#xff0c;每小题10分&#xff0c;共30分&#xff09; 16.根据图14的内容判断其属于操作系统的哪种文件目录管理方式&#xff0c;并简述该方式的优点。 图中所有文件采取分级、分层的方式组织在一起&#xff0c;从而形成一个树型的层次结…

2019上半年教资信息技术学科知识与教育能力——主观题

二、简答题&#xff08;本大题共3小题&#xff0c;每小题10分&#xff0c;共30分&#xff09; 16.请简要回答计算机网络中DNS的含义及其作用。 DNS ( Domain Name System ) 即域名系统&#xff0c;是一个分布式数据库&#xff0c;它保存所有在Internet上注册的系统的域名和IP地…

两个笨贼的爆红之旅!!!

哈喽&#xff0c;你好呀&#xff0c;我是了不起&#xff0c;一个奔3的程序员~ 每周定时更新一些程序员相关的技术和文章~ 欢迎读者小伙伴们积极留言探讨呀~ 前两天&#xff0c;收拾房间的时候&#xff0c;翻到了一张10元“大钞”&#xff0c;为什么说是“大钞”&#xff1f;因为…

世界各个城市和国家经纬度查询-绝对好用

特别对于echarts或者3d地球查找世界各个地区的经纬度很好用 网站地址&#xff1a;https://www.latlong.net/

城市土地利用分布数据/城市功能区划分布数据/城市poi感兴趣点/植被类型分布

数据样例&#xff1a;百度云下载链接&#xff1a;https://pan.baidu.com/s/17ofPwpDM3OCHnE-LuhvUp 提取码&#xff1a;i0m4 城市功能分区是按功能要求将城市中各种物质要素&#xff0c;如工厂、仓库、住宅等进行分区布置&#xff0c;组成一个互相联系、布局合理的有机整体&am…

类似各种app内的城市选择

github 地址 &#xff1a;http://www.jianshu.com/p/b469c6f02754 依赖 &#xff1a; compile com.zaaach:citypicker:1.1 這个是效果图&#xff0c;最近在github 上看到的 实现他很简单&#xff0c;添加依赖和权限几行代码就可以实现這个功能 private static final int REQ…