简介
最近随着 chatgpt 的衰亡,人工智能和大语言模型又再次进入了人们的视线,不同的是这一次像是来真的,各大公司都在拼命投入,心愿能在将来的 AI 赛道上占有一席之地。因为 AI 须要大规模的算力,尤其是对于大语言模型来说。大规模的算力就意味着须要大量金钱的投入。那么对于小公司或者集体来说是不是什么都做不了呢?
当然不是,尽管小公司或者集体不能开发底层的大语言模型,然而咱们能够在大语言模型之上进行利用开发,这应该就是咱们当初能做到的。
明天给大家介绍一个大语言模型的开发框架 langchain,有了它,在 AI 的世界,你能够锦上添花。
什么是 langchain
简略来说,langchain 是一个基于大语言模型只上的开发框架,有了他,咱们就能够轻松在各种大模型之上进行理论利用的开发。
langchain 的次要特点有两个,第一点就是组件化。langchain 提供了各种封装好的组件供咱们应用,大大缩短了咱们开发的工夫。
第二点就是提供了工具链,能够组装各种组件,从而实现更加简单的性能。
langchain 的装置
废话不多说,咱们来看下 langchain 是如何装置的。
AI 时代大家肯定要学一下 python,至于为什么要学习 python 呢?因为其余语言都不好使 ……
langchain 实际上是 python 的一个开发包,所以能够通过 pip 或者 conda 两种形式来装置:
pip 装置 :
pip install langchain
conda 装置 :
conda install langchain -c conda-forge
默认状况下下面的装置形式是最简略的装置,还有很多和 langchain 集成的 modules 并没有装置进来,如果你心愿装置 common LLM providers 的依赖模块,那么能够通过上面的命令:
pip install langchain[llms]
如果你想装置所有的模块,那么能够应用上面的命令:
pip install langchain[all]
因为 langchain 是开源软件,所以你也能够通过源代码来装置, 下载好源代码之后,通过上面的命令装置即可:
pip install -e .
langchain 疾速应用
上面咱们以几个具体的例子来解说一下 langchain 如何应用的。
因为 langchain 只是一个大语言模型上的开发框架,它的所有的能力都是依赖于大语言模型的,所以在应用 langchain 之前,咱们须要一个大语言模型,最简略同时也是最弱小的大语言模型就是 openai 的 chatgpt 了。
接下来咱们就以接入 openai 为例子进行解说。
当然 langchain 也能够接入其余的大语言模型框架,前面的系列教程中咱们会具体解说。
要应用 openai,必须先注册一个 openai 的账号,而后拿到 openai 的 api key。
具体的注册流程这里就不讲了。大家能够自行参考网络上的各种教程。
有了 api key 之后,咱们须要配置一下环境变量:
export OPENAI_API_KEY="..."
而后装置 openai 的包:
pip install openai
接下来就能够欢快的应用 openai 提供的各种性能了。
当然,如果你不想在环境变量中配置 openai 的 key,咱们也能够在 OpenAI 的构造函数中传入 openai_api_key:
from langchain.llms import OpenAI
llm = OpenAI(openai_api_key="...")
构建利用
有了下面的筹备工作,接下来咱们就能够开始应用 langchain 了。
当然,最最根底的一个利用就是跟大模型交互了,比方跟 openai 交互,咱们能够让 openai 给咱们写首诗:
>>> from langchain.llms import OpenAI
>>> llm = OpenAI(temperature=0.9)
>>> llm.predict("请以古龙的口气,写首对于春天诗")
春天来了,万物复苏,终于迎来了一个新的时刻,草儿花儿抬起头,喜迎新绿与壮丽的色彩。山林里,小草发芽,河畔边,花儿香烈,这让咱们感到赏心悦目,这真是一个美妙的世界。春天来了,列位敌人,请喜迎这样一个新时刻,不要埋怨什么,享受春的和煦与快慰。
尽管写进去了,然而我感觉写的一般般吧。
然而这不重要,咱们晓得了如何通过 langchain 来调用 openai 的大模型,这个才是最重要的。
聊天模式
下面咱们调用 LLM 应用用的是 ”text in, text out” 的模型。
尽管聊天模式也是基于 LLM,然而他更进了一步,因为他保留了会话的高低问题,所以在对话上更加智能化。
在代码上,传入的就不是文本了,而是 message 对象。
在 langchain 中,目前反对上面几种音讯类型:AIMessage, HumanMessage, SystemMessage 和 ChatMessage。
在绝大多数状况下,咱们只须要用到 AIMessage, HumanMessage, SystemMessage 即可。
上面是应用的代码例子:
from langchain.chat_models import ChatOpenAI
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage
)
chat = ChatOpenAI(temperature=0)
chat.predict_messages([HumanMessage(content="请以古龙的口气,写首对于春天诗")])
那么聊天模式和 LLM 模式有什么不一样呢?
大家能够看到,聊天模式调用的是 predict_messages 接口,而 LLM 模式调用的是 predict 接口。
事实上聊天模式底层还是应用的是 LLM,为了不便大家的应用,你也能够间接应用 chat.predict 办法来进行 LLM 形式的调用,如下所示:
chat.predict("请以古龙的口气,写首对于春天诗")
Prompt 的模板
开发过 LLM 利用的人都晓得,在 LLM 中 Prompt 是十分重要的,一个好的 Prompt 间接决定了这个利用的品质。
然而 Prompt 必定须要联合用户的输出和咱们本人做的一些限定来联合应用。
这时候就须要用到 Prompt 的模板性能了。咱们能够在零碎中设置好模板,用户只须要填充模板中的特定音讯即可。
在 LLM 模式中,能够应用 PromptTemplates,这样来写:
from langchain.prompts import PromptTemplate
prompt = PromptTemplate.from_template("请帮忙我详细描述一下这个物体,这个物体的名字是: {object}?")
prompt.format(object="猫")
最初生成的后果如下:
请帮忙我详细描述一下这个物体,这个物体的名字是: 猫
如果是在 chat models 中,代码会简单一点点,然而逻辑实际上是一样的。在 chat models 中,须要用到几种 MessagePromptTemplate,比方:ChatPromptTemplate,SystemMessagePromptTemplate 和 HumanMessagePromptTemplate。
咱们具体来看下如何应用:
from langchain.prompts.chat import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
template = "当初,你的角色是 {your_role}, 请依据你的角色答复后续的问题."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template = "{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
chat_prompt.format_messages(your_role="老师", text="世界上最远的中央是哪里?")
对应的输入如下:
[SystemMessage(content="当初,你的角色是老师, 请依据你的角色答复后续的问题.", additional_kwargs={}),
HumanMessage(content="世界上最远的中央是哪里?")
]
十分完满。
Chains
langchain 还有一个十分有用的性能就是 Chains,他能够把多种不同的性能联合起来。
比方下面咱们用到了 LLM,还用到了 Prompt 的模板,那么咱们能够用 Chains 把他们联合起来:
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt)
chain.run("猫")
当然,也能够联合 chat 应用:
from langchain import LLMChain
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
chat = ChatOpenAI(temperature=0)
template = "当初,你的角色是 {your_role}, 请依据你的角色答复后续的问题."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template = "{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
chain = LLMChain(llm=chat, prompt=chat_prompt)
chain.run(your_role="老师", text="世界上最远的中央是哪里?")
Agents
什么是 agents? 从字面意义上看,Agents 就是代理。
事实上 langchain 中的 Agents 就是代理的意思。
比方咱们当初须要向 openai 询问昨天的天气,然而 openai 自身只是一个大模型,它并不知道实时的信息。然而通过 agents 就能够先进行一次判断,看看这个问题是交给大模型解决适合,还是交给搜索引擎来查问比拟适合。
这就是 agents 的作用。
agents 利用 LLM 来判断须要怎么解决这个工作,并且以什么样的程序来解决这个工作。
然而应用 agents 是要有些条件的,首先你这个 LLM 模型必须反对 agent,这样能力进行后续的工作。
其次是须要筛选适合的工具来进行你想要做的事件,比方:Google Search, Database lookup, Python REPL 等等。
最初就是须要指定反对的 agent 的名字,这样 LLM 才晓得到底须要进行哪种 action。
上面是一个应用 SerpAPI 联合 openai 来进行搜寻的例子:
from langchain.agents import AgentType, initialize_agent, load_tools
from langchain.llms import OpenAI
# The language model we're going to use to control the agent.
llm = OpenAI(temperature=0)
# The tools we'll give the Agent access to. Note that the'llm-math' tool uses an LLM, so we need to pass that in.
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# Finally, let's initialize an agent with the tools, the language model, and the type of agent we want to use.
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
# Let's test it out!
agent.run("What was the high temperature in SF yesterday in Fahrenheit? What is that number raised to the .023 power?")
agent 比较复杂,性能也很弱小,后续咱们会具体解说。
Memory
最初要解说的 langchain 的一个性能就是 Memory。
因为很多时候,咱们的利用应该是一个有状态的,也就是说利用须要晓得你之前做了什么,这样才能够给用户提供更好的服务。
然而之前咱们将的 LLM 或者 chain 都是无状态的。
所以 langchain 提供了一个 Memory 的性能,能够把之前的输入输出保存起来,不便后续的应用。
总结
有了 langchain 的各种工具,当初你就能够疾速开发一个属于你本人的 LLM 利用啦。