langchain 中的 LLM 模型使用介绍
简介
构建在大语言模型基础上的应用通常有两种,第一种叫做 text completion,也就是一问一答的模式,输入是 text,输出也是 text。这种模型下应用并不会记忆之前的问题内容,每一个问题都是最新的。通常用来做知识库。
还有一种是类似聊天机器人这种会话模式,也叫 Chat models。这种模式下输入是一个 Chat Messages 的列表。从而可以保存上下文信息,让模型的回复更加真实。
实际上 Chat models 的底层还是 LLMs,只不过在调用方式上有些变化。
简单使用 LLMs
什么是 LLMs 呢?LLMs 是 Large Language Models 的简称,也就是我们常说的大语言模型。
对于 langchain 来说,它本身并不提供大语言模型,它只是一个中间的粘合层,提供了统一的接口,方便我们对接底层的各种 LLMs 模型。
langchain 除了可以对接 OpenAI 之外,还可以对接 Cohere, Hugging Face 等其他的大语言模型。
比如下面是 openAI 的使用:
接下来就可以调用 llm 的方法来进行 text completion 了。
一般来说有两种方式。第一种方式就是直接输出:
还有一种方式调用他的 generate 方法:
这种方式可以传入一个数组,用来生成比较复杂的结果。
langchain 支持的 LLM
现在大语言模型可谓是蓬勃发展,一不留神就可能出一个新的大语言模型。
就目前而言,基本的国外主流模型 langchain 都是支持的。
比如:openai,azure openai,AmazonAPI,Hugging Face Hub 等等。数目繁多,功能齐全,你想要的他全都有,你没想到的他也有。
那么有小伙伴可能要问题了,langchain 支不支持国产的大语言模型呢?
答案是肯定的,但并不是直接的。
如果你发现 langchain 并没有你想要的 llm,那么你可以尝试进行自定义。
langchain 为我们提供了一个类叫做 LLM,我们只需要继承这个 LLM 即可:
其中,唯一一个必须要实现的方法就是_call,这个方法传入一个字符串和一些可选的 stop word,然后返回 LLM 的输出即可。
另外还可以实现一个_identifying_params 方法,用来输出自定义 LLM 的一些参数信息。
大家可以自行尝试和接入不同的 LLM 模型。
一些特殊的 LLM
很多时候调用 LLM 是需要收费的,如果我们在开发的过程中也要不断的消耗 token 肯定是得不偿失。
所以 langchain 为了给我们省钱,提供了一个 FakeLLM 来使用。
顾名思义,FakeLLM 就是可以手动来 mock 一些 LLM 的回答,方便测试。
上面的输出结果如下:
langchain 中还有一个和 FakeLLM 类似的叫做 HumanInputLLM。
这个 LLM 可以打印出给用户的 prompt,并且将用户的输入作为输出返回给用户,大家可以自行体验。
LLM 的高级用法
除了正常的 LLM 调用之外,langchain 还提供了一些 LLM 的高级用法。
异步调用
比如异步调用 LLM。当然目前只支持 OpenAI, PromptLayerOpenAI, ChatOpenAI 和 Anthropic 这几个 LLM。其他的对 LLM 的支持貌似正在开发中。
异步方法也很简单,主要是调用 llm 的 agenerate 方法,比如下面这样:
缓存功能
另外,对于一些重复的请求来说,langchain 还提供了缓存功能,这样可以重复的请求就不需要再发送到 LLM 去了,给我们节约了时间和金钱,非常好用。
langchain 提供的 cache 也有很多种,比如 InMemoryCache,FullLLMCache,SQLAlchemyCache,SQLiteCache 和 RedisCache 等等。
我们以 InMemoryCache 为例,看看是怎么使用的:
使用起来很简单,只需要添加一行 llm_cache 即可。
如果你使用其他的 cache,除了构造函数不同之外,其他的都是类似的。
保存 LLM 配置
有时候我们配置好了 LLM 之外,还可以把 LLM 相关的参数以文本的形式存储起来。
保存 llm 到文件:
加载 llm:
流式处理
LLM 的速度是一个硬伤,由于返回整个响应的速度太慢了,所以推出了流式响应。只要有 response 返回,就传输给用户。并不需要等待所有内容都获得之后再处理。这样对用户的体验是最好的。
目前 langchain 只支持 OpenAI,ChatOpenAI 和 ChatAnthropic。
要实现这个流式处理, langchain 提供了 BaseCallbackHandler,我们只需要继承这个类,实现 on_llm_new_token 这个方法即可。
当然 langchain 已经给我们提供了一个实现好的类叫做:StreamingStdOutCallbackHandler。下面是他的实现:
使用的时候,只需要在构建 llm 的是传入对应的 callback 即可:
统计 token 数目
这个统计 token 使用数目的功能目前只能在 openai 使用。
总结
LLM 是大语言模型最基础的模式,chat 模式的底层就是基于 LLM 实现的。后续我们会详细介绍 chat 模式,尽请期待。
版权声明: 本文为 InfoQ 作者【程序那些事】的原创文章。
原文链接:【http://xie.infoq.cn/article/3c53b3cfd84e2bf81c3172000】。文章转载请联系作者。
评论