NLP(五十五)LangChain入门

news2024/12/27 13:56:41

LangChain简介

背景

  由于ChatGPT的发行,大模型(Large Language Model, LLM)已经变得非常流行了。也许你可能没有足够的资金和计算资源从头开始训练大模型,但你仍然可以使用大模型来做一些比较酷的事情,比如:

  • 个人助理:能基于你的数据与外部世界进行互动交流
  • 对话机器人:适合你个人使用偏好的对话机器人
  • 分析总结:对文档或代码进行分析和总结

  通过各式各样的API和提示工程(Prompt Engineering),大模型正在改变我们创建基于AI开发的产品的方式。这正是为什么在LLM背景下,现在到处都在出现新的开发者工具,这就有了一个新的专业术语:LLMOps(类似的专业术语为DevOps)。
  其中的一个新工具就是LangChain。

LangChain介绍

  LangChain是一个基于语言模型的应用开发框架。它在提升应用方面的作用为:

  • 数据感知:可以使用其它数据资源来连接一个语言模型
  • 代理式的:允许一个语言模型与它的环境进行互动

  LangChain的主要道具为:

  1. 分支(Components):对如何使用语言模型来进行工作的摘要,每个摘要都有一个执行操作的集合。分支是模块化的,容易使用的,不管你是否在使用LangChain框架的剩余部分。
  2. 现成的链(Chains):用于完成特定更高阶任务的分支的结构化组装

现成的链使得它容易上手。对于更复杂的应用和细致的使用案例,分支使得它容易去适应现有的链或创建新的链。

LangChain能做什么

  LangChain 提供了六个主要模块的支持,这些模块按照逐渐增加的复杂性排列如下:

  • 模型(models) : LangChain 支持的各种模型类型和模型集成。
  • 提示(prompts) : 包括提示管理、提示优化和提示序列化。
  • 内存(memory) : 内存是在链/代理调用之间保持状态的概念。LangChain 提供了一个标准的内存接口、一组内存实现及使用内存的链/代理示例。
  • 索引(indexes) : 与您自己的文本数据结合使用时,语言模型往往更加强大——此模块涵盖了执行此操作的最佳实践。
  • 链(chains) : 链不仅仅是单个 LLM 调用,还包括一系列调用(无论是调用 LLM 还是不同的使用工具)。LangChain 提供了一种标准的链接口、许多与其它工具的集成。LangChain 提供了用于常见应用程序的端到端的链调用。
  • 代理(agents) : 代理涉及 LLM 做出行动决策、执行该行动、查看一个观察结果,并重复该过程直到完成。LangChain 提供了一个标准的代理接口,一系列可供选择的代理,以及端到端代理的示例。

LangChain快速入门

  LangChain是一个由Harrison Chase开源的项目,Github访问网址为:https://github.com/hwchase17/langchain .

  LangChain提供了对应的Python第三方模块,在安装前,需确保你的Python版本大于等于3.8.1,小于4.0,安装方式如下:

pip install langchain

  本文使用的langchain的版本为0.0.201。在开始介绍LangChain的使用前,你还需要有相关大模型的API key,比如OpenAI key等。

模型支持

  LangChain提供了一系列大模型的支持,但首先你需要这些大模型的API key。LangChain支持的大模型如下图:

  • Proprietary models(私有模型):由拥有大型专业团队和大额AI预算的公司研发的闭源模型,它们通常会比开源模型更大,且表现更好,但API调用较为昂贵。私有模型的提供商有OpenAI, co:here, AI21 Labs, Anthropic等。
  • Open-source LLMS(开源模型):比私有模型尺寸更小,能力较差,但它们比私有模型更节省花费。开源模型的代表有BLOOM, LLaMA, Flan-T5, GPT-J等。许多开源模型已由Hugging Face提供了良好的支持。
  • Model Hub(模型仓库):模型储存的仓库,比如Hugging Face等。

下面为langchain加载不同模型的示例代码:

# Proprietary LLM from e.g. OpenAI
# pip install openai
from langchain.llms import OpenAI
llm = OpenAI(model_name="text-davinci-003")

# Alternatively, open-source LLM hosted on Hugging Face
# pip install huggingface_hub
from langchain import HuggingFaceHub
llm = HuggingFaceHub(repo_id="google/flan-t5-xl")

本文主要基于OpenAI进行演示,因此,如果你有OpenAI key,你将会有更好的使用langchain的体验。

Prompt管理

  大模型的表现取决于Prompt(提示),一个好的Prompt可以使大模型的表现良好,反之,大模型的表现可能会不如人意。
  langchain提供了PromptTemplates, 帮助你更好地为不同的分支创建合理的Prompt。比如创建一个普通的Prompt(零样本问题Prompt模板),Python代码如下:

# -*- coding: utf-8 -*-
from langchain import PromptTemplate

template = "What is a good name for a company that makes {product}?"

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

print(prompt.format(product="colorful socks"))

输出结果如下:

What is a good name for a company that makes colorful socks?

同样地,langchain还提供了few-shot(少样本)文本的Prompt模板,Python示例代码如下:

# -*- coding: utf-8 -*-
from langchain import PromptTemplate, FewShotPromptTemplate

examples = [
    {"word": "happy", "antonym": "sad"},
    {"word": "tall", "antonym": "short"},
    {"word": "fat", "antonym": "thin"},
]

example_template = """
-> Word: {word}
-> Antonym: {antonym}
"""

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

few_shot_prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    prefix="Give the antonym of every input",
    suffix="\n->Word: {input}\n->Antonym:",
    input_variables=["input"],
    example_separator="\n",
)

print(few_shot_prompt.format(input="big"))

输出结果如下:

Give the antonym of every input

-> Word: happy
-> Antonym: sad


-> Word: tall
-> Antonym: short


-> Word: fat
-> Antonym: thin


->Word: big
->Antonym:

链(Chains)

  langchain中的链描述了将大模型与其它分支组合起来创建一个应用的过程。比如,LLMChain允许我们对创建的Prompt使用大模型,Python示例代码(需安装openai模块,使用pip install openai)如下:

# -*- coding: utf-8 -*-
from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain import PromptTemplate

# set api key
import os
os.environ["OPENAI_API_KEY"] = 'sk-xxx'

# install openai and choose model
llm = OpenAI(model_name='gpt-3.5-turbo')

# make prompt
template = "What is a good name for a company that makes {product}?"

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

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

# Run the chain only specifying the input variable.
print(chain.run("colorful socks"))

输出结果如下:

Rainbow Socks Co.

  对少样本提示,Python示例代码如下:

# -*- coding: utf-8 -*-
from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain import PromptTemplate, FewShotPromptTemplate

# set api key
import os
os.environ["OPENAI_API_KEY"] = 'sk-xxx'

# install openai and choose model
llm = OpenAI(model_name='gpt-3.5-turbo')

# make few-shot prompt
examples = [
    {"word": "happy", "antonym": "sad"},
    {"word": "tall", "antonym": "short"},
    {"word": "fat", "antonym": "thin"},
]

example_template = """
-> Word: {word}
-> Antonym: {antonym}
"""

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

few_shot_prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    prefix="Give the antonym of every input",
    suffix="\n->Word: {input}\n->Antonym:",
    input_variables=["input"],
    example_separator="\n",
)

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

# Run the chain only specifying the input variable.
print(chain.run("big"))

输出结果如下:

small

  如果我们想要使用之前的LLM的输出作为当前LLM的输入,我们可以使用SimpleSequentialChain,示例Python代码如下:

# -*- coding: utf-8 -*-
from langchain.llms import OpenAI
from langchain import PromptTemplate
from langchain.chains import LLMChain, SimpleSequentialChain

# set api key
import os
os.environ["OPENAI_API_KEY"] = 'sk-xxx'

# install openai and choose model
llm = OpenAI(model_name='gpt-3.5-turbo')

# Define the first chain as in the previous code example
template = "What is a good name for a company that makes {product}?"

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

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

# Create a second chain with a prompt template and an LLM
second_prompt = PromptTemplate(
    input_variables=["company_name"],
    template="Write a catchphrase for the following company: {company_name}",
)

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

# Combine the first and the second chain
overall_chain = SimpleSequentialChain(chains=[chain, chain_two], verbose=True)

# Run the chain specifying only the input variable for the first chain.
catchphrase = overall_chain.run("colorful socks")
print(catchphrase)

输出结果如下:

> Entering new  chain...
Rainbow Sox Co.
"Step up your sock game with Rainbow Sox Co."

> Finished chain.
"Step up your sock game with Rainbow Sox Co."

LangChain高阶使用

  langchain还支持更多有趣的高阶使用(通过插件实现),比如文档问答,天气查询,数学计算,基于WikaPedia的问答等等,详细的应用介绍的访问网址为:https://python.langchain.com/docs/modules/agents/tools。本文将介绍文档问答,天气查询,数学计算这三个插件应用。

文档问答

  众所周知,ChatGPT的知识库截至2021年9月,因此,ChatGPT无法回答这以后的问题,比如我们询问ChatGPT“2022年的诺贝尔文学奖获得者是谁?”,结果如下图:

langchain的文档阅读允许我们将大模型与外部文档结合起来,对文档内容进行回答。我们在网上寻找有关于2022年的诺贝尔文学奖获得者的信息,比如网址:https://www.theguardian.com/books/2022/oct/06/annie-ernaux-wins-the-2022-nobel-prize-in-literature , 保存为Annie Ernaux.txt,作为ChatGPT的外部输入文档。

  langchain使用文档加载器将数据加载为Document. 一个Document是一系列文本片段和相关的元数据。加载文件后有三个主要步骤:

  1. 将文档分割成块
  2. 为每个文档创建嵌入向量
  3. 在向量库中存储文档和嵌入向量

默认情况下,LangChain 使用 Chroma 作为向量存储来索引和搜索嵌入。因此我们需要先安装chromadb,命令为:`pip install chromadb`.

  基于此,我们可以对外部文档进行问答,Python示例代码:

# -*- coding: utf-8 -*-
from langchain.llms import OpenAI
from langchain.document_loaders import TextLoader
from langchain.indexes import VectorstoreIndexCreator

# set api key
import os
os.environ["OPENAI_API_KEY"] = 'sk-xxx'

# install openai and choose model
llm = OpenAI(model_name='gpt-3.5-turbo')

# prompt with no answer
prompt = "Who is the winner of 2022 Noble Prize in literature?"
completion = llm(prompt)
print(completion)

# load other source data
loader = TextLoader('Annie Ernaux.txt')
index = VectorstoreIndexCreator().from_loaders([loader])
print('index the document.')

# prompt with answer
query = "Who is the winner of 2022 Noble Prize in literature?"
print(index.query_with_sources(query))

输出结果如下:

As an AI language model, I do not have the ability to predict future events or outcomes such as the winner of the 2022 Nobel Prize in Literature. Only the Nobel Committee can make such announcements.
index the document.
{'question': 'Who is the winner of 2022 Noble Prize in literature?', 'answer': ' Annie Ernaux is the winner of the 2022 Nobel Prize in Literature.\n', 'sources': 'Annie Ernaux.txt'}

可以看到,原始的ChatGPT对于问题“Who is the winner of 2022 Noble Prize in literature?”无法给出准确答案,而加入了外部数据后,再使用文档问答,可以准确地回答出该问题。

天气查询

  ChatGPT无法查询实时信息,比如天气、股票信息等,以下为ChatGPT回答“上海今天天气如何?”的示例,如下图:

  因此,我们需要用到代理(Agents)工具OpenWeatherMap API来获取天气信息。OpenWeatherMap可以获取全世界各地的天气信息,但首先你需要在它的官网上注册并获取OPENWEATHERMAP_API_KEY。以下为使用代理工具OpenWeatherMap API来回答天气的Python示例代码:

# -*- coding: utf-8 -*-
from langchain.llms import OpenAI
from langchain.agents import load_tools, initialize_agent, AgentType
from langchain.utilities import OpenWeatherMapAPIWrapper
import os

os.environ["OPENWEATHERMAP_API_KEY"] = "xxx"
os.environ["OPENAI_API_KEY"] = "sk-xxx"

# direct get weather info
weather = OpenWeatherMapAPIWrapper()
weather_data = weather.run("shanghai")
print(weather_data)

# use LLM to do NLU
llm = OpenAI(temperature=0)
tools = load_tools(["openweathermap-api"], llm)

agent_chain = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)

# get weather info by natural language
print(agent_chain.run("今天上海天气如何?"))

输出结果如下:

In shanghai, the current weather is as follows:
Detailed status: light rain
Wind speed: 5 m/s, direction: 300°
Humidity: 77%
Temperature: 
  - Current: 28.6°C
  - High: 29.92°C
  - Low: 27.71°C
  - Feels like: 33.09°C
Rain: {'1h': 0.69}
Heat index: None
Cloud cover: 75%


> Entering new  chain...
 我需要查询上海的天气信息。
Action: OpenWeatherMap
Action Input: Shanghai,CN
Observation: In Shanghai,CN, the current weather is as follows:
Detailed status: light rain
Wind speed: 5 m/s, direction: 300°
Humidity: 77%
Temperature: 
  - Current: 28.6°C
  - High: 29.92°C
  - Low: 27.71°C
  - Feels like: 33.09°C
Rain: {'1h': 0.65}
Heat index: None
Cloud cover: 75%
Thought: 根据上海的天气信息,我可以得出结论。
Final Answer: 今天上海有轻度降雨,风速为5米/秒,湿度为77%,温度为28.6°C,最高温度为29.92°C,最低温度为27.71°C,体感温度为33.09°C,降雨量为0.65毫米,云量为75%。

> Finished chain.
今天上海有轻度降雨,风速为5米/秒,湿度为77%,温度为28.6°C,最高温度为29.92°C,最低温度为27.71°C,体感温度为33.09°C,降雨量为0.65毫米,云量为75%。

数学计算

  langchain提供了代理工具Wolfram Alpha来更好地进行数学计算,首先你需要在Wolfram Alpha官网上注册并获取WOLFRAM_ALPHA_APPID,然后安装wolframalpha模块,命令为:pip install wolframalpha.示例Python代码如下:

# -*- coding: utf-8 -*-
import os
import ssl
ssl._create_default_https_context = ssl._create_unverified_context

os.environ["WOLFRAM_ALPHA_APPID"] = "xxx"

from langchain.utilities.wolfram_alpha import WolframAlphaAPIWrapper

wolfram = WolframAlphaAPIWrapper()

# 一元一次方程
print(wolfram.run("What is 2x+5 = -3x+7?"))

# 一元二次方程
print(wolfram.run("What is x^2-5x+4=0?"))

# 多项式展开
print(wolfram.run("Expand (x+y)^3?"))

输出结果如下:

Assumption: 2 x + 5 = -3 x + 7 
Answer: x = 2/5
Assumption: x^2 - 5 x + 4 = 0 
Answer: x = 1
Assumption: expand | (x + y)^3 
Answer: x^3 + 3 x^2 y + 3 x y^2 + y^3

总结

  本文主要介绍了LangChain,以及LangChain的模型支持、Prompt管理、链,并在此基础上介绍了三个有趣的工具使用。
  后续笔者将会进一步介绍LangChain的使用,欢迎大家的关注~

参考文献

  1. Getting Started with LangChain: A Beginner’s Guide to Building LLM-Powered Applications: https://towardsdatascience.com/getting-started-with-langchain-a-beginners-guide-to-building-llm-powered-applications-95fc8898732c
  2. LangChain Document in Python: https://python.langchain.com/docs/get_started/introduction.html
  3. LangChain Agents: https://python.langchain.com/docs/modules/agents/

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

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

相关文章

大数据开发薪资怎么样

想必想入行的小伙伴在正式开始学习之前,都会考虑薪资这个可观因素。有不少小伙伴是看中了大数据的薪资选择加入这个行业的,想知道以后能找什么工作以及工作薪水,那不妨让我们以数据的方式来展示一下~ 猎聘大数据研究院发布了《2022未来人才就…

制造执行系统(MES)的核心功能是什么?

制造执行系统(MES)的核心功能是什么? 01 什么是MES 制造执行系统(MES)是一种用于监控、控制和优化制造过程的软件系统。它通过与企业资源计划(ERP)系统和自动化系统的集成,实现对生产过程的管…

小红书品牌营销策略分析!品牌方必看

小红书在品牌营销方面的策略非常成功,特别是在口碑营销、内容营销和小红书素人达人种草营销方面的运用。以下是伯乐网络传媒对这些策略的详细分析,想要做小红书营销推广的商家必看! 一、口碑营销 对于小红书APP来说,口碑营销的传播主体就是小…

Android build.gradle文件

一、ABI(Application Binary Interface)应用程序二进制接口 其实ABI可以不设置,这样编译时,就会将项目里所有依赖资源包里的so库都打到最终的apk里。 但是,ABI支持多的话,apk也会大,所以一般只支…

MySQL数据库——存储引擎

MySQL数据库——存储引擎 一、MySQL存储引擎1.存储引擎的概念2.常用存储引擎3.存储引擎的分类4.企业选择存储引擎依据 二、MyISAM 存储引擎1 MyISAM的相关了解2 MyISAM的特点3 MyISAM表支持3种不同的存储格式4.MyISAM适用的生产场景 三、InnoDB 存储引擎1 InnoDB的相关了解2 In…

探索NDK和逆向工程在Android开发中的力量

NDK是什么? NDK(Native Development Kit)是一组工具集,用于在Android平台上开发和构建使用C或其他本地语言编写的应用程序。NDK提供了一些库和工具,使开发人员能够在应用中使用本地代码,并实现与Java代码的…

ant+svn项目打包部署错误记录

安装ant可以参考下这个 http://t.csdn.cn/kx1ZX 第一个错误,原因是缺少ant-contrib.jar导致,将对应jar包放入ant的lib下即可 [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found. B…

低/无代码平台:公民开发和公民自动化,让人人成为软件开发者

在企业数字化转型领域,公民自动化是一个备受关注的概念。虽然这个词汇可能有些“陌生又熟悉”,但在公民开发运动中已经引起了不小的轰动。那么,什么是公民自动化?它与公民开发之间又有哪些不同? 公民开发是什么&#x…

ATTCK 红日靶场(三)-简记

Step 1-》信息收集 端口 nmap -p -A -sV 192.168.1.110 目录 dirsearch -u 192.168.1.110 --exelude-status 400,401,403,404,501,503 访问 ip/1.php -->根目录、禁用函数 ip/robots.txt !!!------- IP/administrator-->>joomla-cms IP/configuration.php~--&…

利用uniapp创建移动端项目

目录 申请微信开发者账号 一、特殊声明 二、申请微信开发者账号 创建小程序项目 一、引言 二、创建小程序工程 三、uni-app框架简介 初识uniapp项目 一、uni-app工程目录结构 二、创建练习页面 创建登录页面 一、拷贝所有素材文件 二、创建登陆页面 创建注册页面 …

【机器学习与遥感】sklearn与rasterio实现遥感影像监督分类

在学习遥感的过程中,我们都了解到了监督分类与非监督分类,二者是遥感解译的基础。之前更多的是使用Erdas与ENVI来进行这两种分类。这里使用python语言,基于机器学习库sklearn与遥感影像处理库rasterio,使用kmeans动态聚类方法实现…

实施计划:项目成功执行的关键

为了增加成功的机会,特别是当涉及到大型或复杂的项目时,团队可能需要关于项目执行过程的额外指导。实施计划可以用于这一目的。 简而言之,项目实施计划是一份文件,作为项目如何执行的路线图。它规定了项目完成过程中的步骤&#…

<C++> C++11右值引用

C11右值引用 1.左值引用和右值引用 传统的C语法中就有引用的语法,而C11中新增了的右值引用语法特性,所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。 什么是左值?什么是左值引用…

sonar-scanner-Windows本地Python代码检查使用方法【免费下载sonar-scanner验证有效】

背景介绍: sonar作为开源的代码扫描工具,sonar-scanner是windows扫描器。SonarQube是一个开源的代码质量管理平台,可以将 sonar-scanner扫描的结果进行分析。 公司有搭建SonarQube质量管理平台,支持本地扫描和gitlab集成扫描。现…

locust学习教程(7) - docker运行单个locust脚本

目录 1、安装 docker 2、下载镜像 3、运行脚本 4、开始压测 🎁更多干货 1、安装 docker widnows安装docker客户端blog.csdn.net/weixin_4545… 实施步骤: 第一步、启动docker客户端 2、下载镜像 cmd窗口下载locust镜像文件:docker pul…

隐私链或成监管和虚拟货币犯罪打击新挑战?

匿名币、混币器等是大家在当前案件侦办中常遇到的资金追踪“拦路虎”,而在区块链中还有一些隐私保护方案(隐藏交易相关信息),可能大家较少涉猎,在当前的区块链相关案件中也还没有明显的表现,我们也希望通过…

深度解析:分布式事务解决方案大盘点,助你轻松应对复杂业务场景

随着互联网的发展,分布式系统已经成为了现代软件开发的主流。在分布式系统中,多个节点之间需要协同工作,以完成一些复杂的任务。然而,由于节点之间的网络延迟、故障等问题,这些节点之间可能会出现数据不一致的情况&…

华为OD机试真题 JavaScript 实现【最多获得的短信条数】【2023Q1 100分】,附详细解题思路

一、题目描述 某云短信厂商,为庆祝国庆,推出充值优惠活动。现在给出客户预算,和优惠售价序列,求最多可获得的短信总条数。 二、输入描述 第一行客户预算M,其中 0 ≤ M ≤ 10^6第二行给出售价表, P1, P2,…

一切美好如夏而至,中国人民大学与加拿大女王大学金融硕士项目陪你逐梦硕士

流光半夏,美好日长。愿所有春天里的酝酿,都在夏天热烈绽放。你春天酝酿的读研梦有实现吗?在这个最长的白昼,让我们与中国人民大学与加拿大女王大学金融硕士项目邂逅,一起在盛夏里追寻诗与远方。 都说有梦想&#xff0…

【07】STM32·HAL库开发-新建寄存器版本MDK工程 |下载STM32Cube固件包 | 新建MDK工程步骤

目录 1.新建工程前的准备工作(了解)1.1下载相关STM32Cube 官方固件包(F1/F4/F7/H7) 2.新建寄存器版本MDK工程步骤(熟悉)2.1新建工程文件夹2.1.1Drivers文件夹2.1.2Middlewares文件夹2.1.3Output文件夹2.1.4Projects文件…