简介

最近随着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运用啦。