LangChain入门学习笔记(四)—— Model I/O之LLMs

news/2024/9/25 23:24:39/

Prompts输入大模型应用后,下一个重要的处理组件就是LLM或者Chat Model,在这里大模型根据提示语产生相应内容,本章主要介绍LLM

LangChain不定义自己的LLMs,但是它提供标准接口。由其他的LLM提供商(比如OpenAI、Cohere、Hugging Face等)实现底层细节,LangChain设计的一系列标准化接口用于上层对这些LLM的调用和交互。

LLM的基本使用

LLM各个版本都是BaseLLM的子类,后者又是Runnable的后代,所以各个LLMs都是Runnable接口的实现。这既意味着各LLMs实现支持invoke/ainvoke,stream/astream,batch/abatch等调用(具体支持Runnable接口哪些方法可以查看这里的表格内容),也说明它可以使用LCEL语法。下面看简单示例:

python">from langchain_community.llms import Ollamallm = Ollama(model="llama3", temperature=0)print(llm.invoke("tell me a joke about bear."))

打印LLM的返回:

自定义LLM

当我们需要封装自己的LLM类时,或者将LangChain支持的LLM进行其他不同的行为封装,这时候我们可以自定义LLM,以便使用自己的LLM的同时享受LangChain框架带来的便利。

实现自己的LLM,以下2个方法必须实现:

  • _llm_type: 返回属性字符串,可以用在记录日志。
  • _call: 供invoke方法使用,底层大模型的封装。接受的参数有:
    • prompt:用于生成内容的提示。
    • stop:生成时的停用词。模型的输出在首次出现停用子字符串时被截断,如果不支持停用词,建议抛出异常NotImplementedError。
    • run_manager:回调管理器。
    • **kwargs: 任意额外的关键字参数。这些通常传递给模型提供商的API调用。
python">from typing import Any, List, Optionalfrom langchain_core.callbacks.manager import CallbackManagerForLLMRun
from langchain_core.language_models.llms import LLMclass CustomLLM(LLM):def _call(self,prompt: str,stop: Optional[List[str]] = None,run_manager: Optional[CallbackManagerForLLMRun] = None,**kwargs: Any,) -> str:if stop is not None:raise NotImplementedError("stop kwargs are not permitted.")return "Yeh! I know everything, but I don't want to tell you!"@propertydef _llm_type(self) -> str:return "my-custom-llm"llm = CustomLLM()
print(llm.invoke("Tell me a joke about bear"))

然后执行脚本,发现这是个很拽的LLM ^_^!

一些可选的实现接口方法:

  • _acall:与_call类似,异步版,供ainvoke调用。
  • _stream:逐个token地流式输出。
  • _astream:stream的异步版。
  • _identifying_params:@property修饰的属性,用于帮助识别模型并打印LLM,应返回一个字典。

缓存(Caching)

缓存技术应用广泛,其主要目的是提升响应速度。缓存了已知结果的数据,当下一次再查询时直接返回缓存里的内容,不经可以提升用户体验,还能节省api调用和token流量费用。

通过langchain.globals中的set_llm_cache方法将InMemoryCache对象实例保存在langchain的全局LLM缓存中。当每次通过LLM发送请求时langchain会查询全局缓存是否已有对应输入的缓存结果。如有,则将缓存的结果返回;否则调用LLM接口,并将结果缓存(LangChain代码看这里)。

python">import timefrom langchain.globals import set_llm_cache
from langchain_community.llms import Ollama
from langchain_community.cache import InMemoryCachellm = Ollama(model="llama3", temperature=0)# 设置缓存
set_llm_cache(InMemoryCache())start1 = time.time()
print(llm.invoke("Tell me a joke"))
print("elapsed time: ", time.time()-start1)start2 = time.time()
print(llm.invoke("Tell me a joke"))
print("elapsed time: ", time.time()-start2)

上面代码中set_llm_cache(InMemoryCache())即完成了缓存设置。运行结果如下,可以看出第二次使用了缓存结果,时间大大缩短:

如果注释掉上面代码中的这句:set_llm_cache(InMemoryCache()),则可以发现两次调用时间相当:

如果不用内存Cache,而是使用SQLite作为后台缓存,只要将前面的set_llm_cache(InMemoryCache())改为即可:

python">set_llm_cache(SQLiteCache(database_path=".langchain.db"))

http://www.ppmy.cn/news/1470185.html

相关文章

oracle后台调用Java包的配置和例子

在Oracle后台调用Java包,通常涉及几个关键步骤,包括设置环境、加载Java代码或JAR包、创建Oracle存储的Java源或外部过程,以及最后从Oracle中调用这些Java方法。以下是一个简化的步骤和示例,用于说明这个过程: 1. 设置…

Linux ARM64(飞腾)/X86_64系统(麒麟 统信UOS)上实现摄像头、屏幕和麦克风采集并输出RTSP/RTMP流

之前做了linux x86_64上的摄像头采集、屏幕采集和麦克风等采集,并把采集到的音视频数据实时编码输出为RTMP/RTSP流, 现在国产arm64位设备越来越多,最近对linux arm64也做了相应的支持. Linux上摄像头采集使用V4L2相关接口,查看摄像头设备文件…

Blazor 中基于角色的授权

介绍 Blazor用于使用 .NET 代码库创建交互式客户端 Web UI。Microsoft 默认在 Blazor 应用程序中提供了一个用于身份验证和授权的身份框架。请注意,他们目前使用 MVC Core Razor 页面作为身份验证 UI。使用“Microsoft.AspNetCore.Identity.UI”包库来实现这一点。…

.net 调用海康SDK以及常见的坑解释

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 在工控领域,很多时候需要…

一个轻量级的TTS模型实现

1.环境 python 版本 3.9 2.训练数据集 本次采用LJSpeech数据集,百度网盘下载地址 链接:https://pan.baidu.com/s/1DDFmPpHQrTR_NvjAfwX-QA 提取码:1234 3.安装依赖 pip install TTS 4.工程结构 5代码部分 decoder.py import torch f…

5-异常-NumberFormatException

5-异常-NumberFormatException 更多内容欢迎关注我(持续更新中,欢迎Star✨) Github:CodeZeng1998/Java-Developer-Work-Note 技术公众号:CodeZeng1998(纯纯技术文) 生活公众号:好…

【Linux】进程间通信之命名管道

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 如果文章对…

嵌入式中间件_2.嵌入式中间件的分类

1.中间件的分类 中间件的范围十分广泛,针对不同的应用需求涌现出了多种各具特色的中间件产品。因此,在不同的角度或不同的层次上,对中间件的分类也会有所不同。 根据IDC在1998年对中间件进行的分类,把中间件分为终端仿真/屏幕转换…