NLP(五十六)LangChain入门

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 PromptTemplatetemplate = "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, FewShotPromptTemplateexamples = [{"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 osos.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_contextos.environ["WOLFRAM_ALPHA_APPID"] = "xxx"from langchain.utilities.wolfram_alpha import WolframAlphaAPIWrapperwolfram = 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.rhkb.cn/news/10406.html

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

相关文章

大致聊聊ChatGPT的底层原理,实现方法

文目录 深度学习基础ChatGPT的本质ChatGPT原理详解 一、深度学习基础 — 深度学习是什么?如何理解神经网络结构? 关于生物神经网络结构如下: 神经网络介绍 人工神经网络( Artificial Neural Network, 简写为ANN)也…

互发短信之SmsManager

短信管理器 : SmsManager 1. 在 Android 2.0 以前 应该使用 android.telephony.gsm.SmsManager 之后应该用 android.telephony.SmsManager; 2. 获取系统默认的短信管理器 SmsManager smsManager = SmsManager.getDefault(); 3. 按照每条短信最大字数来拆分短信 List<S…

手机号短信验证码接口

1.1 注册账号 https://www.yuntongxun.com/user/login 1.2 登录即可看到开发者账号信息 1.3 添加测试账号 2.使用容联云发送代码测试 1. 安装容联云sdk pip install ronglian_sms_sdk # 免费测试文档地址:https://doc.yuntongxun.com/p/5a531a353b8496dd00dcdfe22. 短信发送…

sms收发手机短信

这几天在试VS2005里面的SerialPort 类,这个类主要功能是串口通信,以前没接触串口这方面的知识,一开始还比较吃力,还好现在清楚了大半利用这个类做了一个sms收发手机短信的demo,我又重新把这个类封装了下,里面增加了PDU编码和解码的方法,这样可以直接调用封装后的类发送和接收中…

Android SMS —— 读取短信 联系人

Android SMS&#xff08;一&#xff09; —— 读取短信 分类&#xff1a; Android 2012-03-07 12:49 9551人阅读 评论(9) 收藏 举报 sms android integer string date 数据库 Android SMS Read [java] view plain copy print ? package com.homer.sms; import java.…

Android 实现手机号短信验证码

使用mob第三方平台提供的免费短信验证码服务SMSSDK。 在Mob官网中注册登录并创建应用&#xff0c;获取相应的App key和App Secret。 在线安装&#xff0c;免下载SDK&#xff08;官网介绍&#xff09; 在根目录下的build.gradle文件中添加内容 在app目录下的build.gradle文件…

Android手机中获取手机号码和运营商信息

代码如下&#xff1a; package com.pei.activity;import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView;/*** class name&#xff1a…

Android Contacts(二)—— SMS 短信 与 Contacts 联系人关联

Android 的SMS读取短信&#xff0c;可以获取发信人/收信人的手机号码&#xff08;address&#xff09;&#xff0c;Contacts的联系人&#xff0c;可以过滤手机号码&#xff08;address&#xff09;&#xff0c;因此SMS可以通过手机号码&#xff08;address&#xff09;关联到Co…

在 Linux 终端上使用 ChatGPT, 轻松提高生产力

随着NFT和元宇宙的流行逐渐消退&#xff0c;人工智能已成为技术领域的新热词。ChatGPT及其替代品在互联网上蓬勃发展&#xff0c;帮助用户轻松完成日常任务。很多文章都介绍了如何开始制作类似ChatGPT的聊天机器人以及如何在任何浏览器中使用Bing AI等指南。但是&#xff0c;如…

大家查找医疗英文文献都去哪个网?

文献阅读是每一个医学科研人都逃脱不了且贯穿整个科研生涯的需求&#xff0c;尤其是英文文献的检索与阅读&#xff0c;我们不得不承认医疗类国际前沿与热点的文章都普遍为英文文献。那么拥有一个使用起来得心应手的文献检索网站就是非常必要的&#xff0c;毕竟巧妇难为无米之炊…

哪些平台可以查看医学类文献?

世上文献检索千千万&#xff0c;医学文献检索选哪站&#xff1f;下面我就为大家总结了8个检索医学类期刊的文献检索网站&#xff01; 目录 1. 中国知网全文数据库(CNKI) 2. 掌桥科研 3. SinoMed中国生物医学文献数据库(CBM) 4. 中华医学期刊全文数据库 5. JAMA Netw…

如何着手写一篇医学综述?

各位医学研究生&#xff0c;研0的时候是不是导师都已经把综述布置下来作为你的第一份作业呀&#xff1f;对于医学生们来说&#xff0c;不管你是本科就已经开始接触科研还是研究生开始才接触科研&#xff0c;反正在你开始阅读文献的时候开始一篇综述总是逃不过的。鉴于有综述任务…

【学习】ChatGPT对问答社区产生了哪些影响?

引用 StackExchange 社区 CEO Prashanth Chandrasekar 的一篇博客标题 “Community is the future of AI”&#xff0c;引出本文的观点&#xff0c;即ChatGPT对问答社区产生了颠覆性影响&#xff0c;问答社区必须釜底抽薪、涅槃重生&#xff0c;但我们必须坚信“社区才是AI的未…

你想要的宏基因组-微生物组知识全在这(2023.5)

欢迎点击上方蓝色”宏基因组”关注我们&#xff01; 宏基因组/微生物组是当今世界科研最热门的研究领域之一&#xff0c;为加强宏基因组学技术和成果交流传播&#xff0c;推动全球华人微生物组领域发展&#xff0c;中科院青年科研人员创立“宏基因组”公众号&#xff0c;联合海…

2023年第二十届ChinaJoy新闻发布会 十大亮点解读

5月29日&#xff0c;2023年第二十届中国国际数码互动娱乐展览会&#xff08;ChinaJoy&#xff09;新闻发布会&#xff0c;在上海浦东嘉里大酒店召开&#xff0c;宣布本届ChinaJoy将于7月28日至7月31日&#xff0c;在上海新国际博览中心举办。 中国音像与数字出版协会第一副理事…

BFT 最前线 | 王小川:2033机器智慧将超人类;扎克伯格财富暴涨;哈工大:能跳跃的昆虫机器人;北京支持“1+4”机器人领域

原创 | 文 BFT机器人 名人动态 CELEBRITY NEWS 01 王小川&#xff1a;10年后机器智慧将超过人类 年底将推出对标GPT-3.5的模型 科技预言大师雷库兹韦尔说人工智能的奇点&#xff0c;机器智慧超过人类会发生在2045年&#xff0c;王小川的判断比这更激进&#xff0c;他认为这一…

开启单细胞及空间组学行业发展黄金时代!首届国际单细胞及空间组学大会在穗闭幕

2023年4月16日&#xff0c;首届TICSSO国际单细胞及空间组学大会圆满闭幕&#xff0c;本次大会吸引了2000余位来自产、学、研、资、医、政、媒等业界人士齐聚羊城&#xff0c;注册总人数5398人&#xff0c;网络播放总量达548245人次&#xff0c;网络观看覆盖美国、德国、日本、澳…

聚集十二罗汉,探索宇宙本质,马斯克神秘的xAI

作者 | 德新编辑 | 王博 马斯克组团入局通用人工智能。 7月12日&#xff0c;马斯克发推官宣成立新的公司xAI。据官网介绍&#xff0c;这是一家试图「探索理解宇宙本质」的公司。 新公司公布了12名首批成员&#xff0c;除了马斯克外&#xff0c;他们曾经在「AlphaStar、AlphaCod…

Transformer作者:指令型智能体的构建之法

来源 | The Robot Brains PodcastOneFlow编译翻译&#xff5c;徐佳渝、贾川、杨婷2017年&#xff0c;Google发布的《Attention Is All You Need》论文提出了Transformer架构&#xff0c;这成为过去十年神经网络领域最具影响力的技术创新之一&#xff0c;并被广泛应用于NLP、计算…

华为版AIGC或于7月7日发布;350名行业大佬警告AI可能给人类带来灭绝风险;钉钉斜杠“/” 面向企业用户定向邀测丨每日大事件...

‍ ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 企业动态 欧盟官员将于6月会见OpenAI CEO&#xff1a;讨论人工智能法规 5月30日&#xff0c;欧盟官员表示&#xff0c;欧盟产业主管埃里布雷顿将于下月在旧金山与美国人工智能研究公司OpenAI首席执行官山姆阿尔特曼会面&…