学习路程八 langchin核心组件 Models补充 I/O和 Redis Cache
前序
之前了解了Models,Prompt,但有些资料又把这块与输出合称为模型输入输出(Model I/O):这是与各种大语言模型进行交互的基本组件。它允许开发者管理提示(prompt),通过通用接口调用语言模型,并从模型输出中提取信息。简单来说,这个组件负责与大语言模型“对话”,将请求传递给模型,并接收回复。
这篇文章就补充一下这个O(output)的内容。
输出解释器
Output Parsers(输出解析器),是langchain中提供给我们对模型响应内容进行格式化输出的。LLM的输出为文本,但在程序中除了显示文本,如果希望获得更多不同的结构化数据时,就可以使用langchain提供的输出解析器(Output Parsers)来完成了。输出解析器(Output Parsers)实际上就是结构化语言模型提供的响应处理工具类,其提供了如下两个方法给开发者使用,也是这些响应类必须实现的两个方法:
get_format_instructions() -> str :返回一个包含语言模型如何格式化输出的指令字符串。
invoke()-> Any:接受一个结构化言模型的响应对象,并将其解析为指定格式
Str输出解析器
import os
from langchain_deepseek import ChatDeepSeek
from langchain.prompts import PromptTemplate# 初始化模型
os.environ['DEEPSEEK_API_KEY'] = "sk-e2xxx"
chat_model = ChatDeepSeek(model="deepseek-chat",temperature=0.4,max_tokens=None,timeout=None,max_retries=2,)# 创建提示模板
prompt_template = PromptTemplate(input_variables=["context"],template="基于给定的文案,以幽默诙谐的风格生成一段回答文本:{context}",
)# 使用模型生成文本
context = "成都今天出太阳了,天气真好,我们翘班出去玩吧。"
prompt = prompt_template.format(context=context)
result = chat_model.invoke(prompt)
print(result)
回答内容很长,但是我们需要的只有content那串。引入StrOutputParser
,把返回的结果,经过解析,就只有文本结果内容了
...
from langchain_core.output_parsers import StrOutputParser
res = StrOutputParser().invoke(input=result)
print(res)
List输出解析器
import os
from langchain_deepseek import ChatDeepSeek# 初始化模型
os.environ['DEEPSEEK_API_KEY'] = "sk-e24324xxx"
chat_model = ChatDeepSeek(model="deepseek-chat",temperature=0.4,max_tokens=None,timeout=None,max_retries=2,)
from langchain_core.output_parsers import CommaSeparatedListOutputParser
from langchain_core.prompts import PromptTemplateparser = CommaSeparatedListOutputParser()prompt = PromptTemplate.from_template(template="请列出5个{item}的不同叫法.\n{format_instructions}\n",partial_variables={"format_instructions": parser.get_format_instructions()},
)messages = prompt.invoke({'item': '土豆'})
print(messages)result = chat_model.invoke(messages)
res = parser.invoke(result)
print(res)"""
text='请列出5个土豆的不同叫法.\nYour response should be a list of comma separated values, eg: `foo, bar, baz` or `foo,bar,baz`\n'
['马铃薯', '洋芋', '土豆', '薯仔', '地蛋']
"""
Json输出解释器
其他内容大差不差,把 CommaSeparatedListOutputParser
换成JsonOutputParser
就行
from pydantic import BaseModel, Field
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplateclass JsonParser(BaseModel):question: str = Field(description='问题')answer: str = Field(description='答案')parser = JsonOutputParser(pydantic_object=JsonParser)prompt = PromptTemplate(template="回答问题.\n{format_instructions}\n{query}\n",input_variables=["query"],partial_variables={"format_instructions": parser.get_format_instructions()},
)# print(parser.get_format_instructions())messages = prompt.invoke({'query': '讲一个脑筋急转弯的问题和答案。'})
response = chat_model.invoke(messages)
content = parser.invoke(response)
print(content) """
{'question': '什么东西越洗越脏?', 'answer': '水'}
"""
stream输出解析器
如果输出内容很长,一直等处理完才返回结果也不大好,比如我们正常使用在线大模型,它都是几个字几个字往外吐的,不是最后直接给答案。
这里就需要用到stream输出解析器
import os
from langchain_deepseek import ChatDeepSeek# 初始化模型
os.environ['DEEPSEEK_API_KEY'] = "sk-e24xxx"
chat_model = ChatDeepSeek(model="deepseek-chat",temperature=0.4,max_tokens=None,timeout=None,max_retries=2,)from langchain_ollama.llms import OllamaLLM
from langchain_core.prompts import PromptTemplateprompt_template = PromptTemplate.from_template("你是一名名经验丰富的{role},{ability},{prompt}")
messages = prompt_template.invoke({"role": "修仙小说作家", "ability": "熟悉各种神话传说和修仙小说","prompt": "请你写一部与牧神记类似的小说,要求:全书至少600章,每一章字数在8000字以上,剧情紧凑,各个角色的个性分明"})
print(messages)for chunk in chat_model.stream(messages):print(chunk, end="", flush=True)
或者这样不好看,也可以用上面的字符串输出解释器来处理一下输出内容
from langchain_core.output_parsers import StrOutputParser# 修改一下输出这里
for chunk in chat_model.stream(messages):print(StrOutputParser().invoke(chunk), end="", flush=True)
到这里,就就开始慢慢帮我们写小说了。
Cache
如果每次问同样的,都调用大模型推理,那么会比较耗💰,可以把问题和答案记录下来,以后遇到同样的问题,则不必再使用大模型推理。
基于langchain提供的输出缓存,让LLM在遇到同一prompt时,直接调用缓存中的结果,也可以达到加速的效果。
# -*- coding: utf-8 -*-
# @Author : John
# @Time : 2025/02/27
# @File : langchain_cache.pyimport time
import redis
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
# from langchain_community.cache import InMemoryCache # 把输出缓存到内存中
from langchain_community.cache import RedisCache # 把输出缓存到Redis数据库中
from langchain.globals import set_llm_cacheimport os
from langchain_deepseek import ChatDeepSeek# 初始化模型
os.environ['DEEPSEEK_API_KEY'] = "sk-e243xxxf"
chat_model = ChatDeepSeek(model="deepseek-chat",temperature=0.4, # temperature 温度值,数值越趋向0,回答越谨慎,数值越趋向1,回答则越脑洞大开,主要控制大模型输出的创造力max_tokens=None,timeout=None,max_retries=2,)prompt_template = PromptTemplate.from_template("你是一个产品顾问。请给公司刚生产出来的 {production},取一个好听的名字和广告语。")
messages = prompt_template.invoke({"production": "充电宝"})# 开启缓存
redis = redis.Redis("localhost", port=6379, password="qwe123", db=2)
set_llm_cache(RedisCache(redis))timers = []
for _ in range(5):t1 = time.time()response = chat_model.invoke(messages)t2 = time.time()print(t2 - t1, response)timers.append(t2 - t1)print(timers)
可以看到输出结果都是一致的。只有第一次真正请求了deepseek,花了65s获得了结果,后面都是第一次结果保存到redis,从redis获取的。
相关文章:
学习路程八 langchin核心组件 Models补充 I/O和 Redis Cache
前序 之前了解了Models,Prompt,但有些资料又把这块与输出合称为模型输入输出(Model I/O):这是与各种大语言模型进行交互的基本组件。它允许开发者管理提示(prompt),通过通用接口调…...
Everything——你的文件搜索效率革命
Everything 是一款由 voidtools 开发的文件搜索工具,专为 Windows 系统设计。它以极快的速度和高效的搜索能力著称,能够基于文件名实时定位文件和目录。以下是其主要特点和功能概述: 1. 核心特点 快速搜索:Everything 使用 NTFS…...
【一起学Rust | Tauri2.0框架】单实例应用程序的深入解析:零漏洞实现与优化实战
文章目录 前言一、 单实例应用的意义二、 实现单实例应用的方法1 Windows下的实现1.1 创建命名Mutex1.2 在Tauri应用中集成Mutex检查 2 macOS下的实现2.1 获取Bundle Identifier2.2 检查是否已经有实例在运行 3 Linux下的实现3.1 获取进程列表3.2 检查是否已经有实例在运行 4 在…...
React + TypeScript 数据血缘分析实战
React TypeScript 数据血缘分析实战 目录 技术选型与架构设计核心概念解析基础场景实现 场景一:visx库基础血缘图实现场景二:React-Lineage-DAG企业级方案场景三:动态数据源与复杂交互 TypeScript类型系统深度优化性能优化与工程化实践开源…...
解决 ERROR 1130 (HY000): Host is not allowed to connect to this MySQL server
当使用 MySQL 时,您可能会遇到错误信息“ERROR 1130 (HY000): Host ‘hostname’is not allowed to connect to this MySQL server”这是 MySQL 用于防止未经授权的访问的标准安全特性。实际上,服务器还没有配置为接受来自相关主机的连接。 Common Caus…...
4. 示例:创建带约束的随机地址生成器(范围0x1000-0xFFFF)
文章目录 前言代码示例:运行方法:查看结果:关键功能说明:扩展功能建议: 前言 以下是一个完整的SystemVerilog测试平台示例,包含约束随机地址生成、日志输出和波形生成功能: 代码示例࿱…...
Dashboard-frps
通过浏览器查看 frp的状态以及代理统计信息展示。 注:Dashboard 尚未针对大量的 proxy 数据展示做优化,如果出现 Dashboard 访问较慢的情况,请不要启用此功能。 需要在 frps.ini中指定 dashboard服务使用的端口,即可开启此功能&…...
鸿蒙兼容Mapbox地图应用测试
鸿蒙Next已经发布一段时间了,很多之前的移动端地图应用,纷纷都要求适配鸿蒙Next。作为开发者都清楚,所谓的适配其实都是重新开发,鸿蒙的开发语言和纯前端的Javascript不同,也可以Android原始开发的语言不同。鸿蒙自带的…...
PyCharm 的使用 + PyCharm快捷键 + 切换中文界面
2025 - 02 - 27 - 第 62 篇 Author: 郑龙浩 / 仟濹 【PyCharm的使用】 文章目录 如何使用Pycharm1 新建工程,新建 .py 文件,运行2 常用快捷键3 其他快捷键 - DeepSeek 总结如下**代码编辑****导航与定位****查找与替换****运行与调试****代码重构****其…...
Ubuntu下QT安装和调试的常见问题(一)__could_not_dertermine_which_make
前言 Ubuntu下QT的安装会有一些奇怪的问题出现,并没有像Windows下Visual Studio的安装那么直接就可以使用那么方便,本文就“make”挂接的问题,给出一些小的感受。 1、问题的提出 很多问题的解答,AI无论是上文心一言,还…...
JAVA面试_进阶部分_Linux面试题
Linux概述 1. 什么是Linux Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix 的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工 具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网 络为核心的设…...
【深度学习】强化学习(RL)-A3C(Asynchronous Advantage Actor-Critic)
A3C(Asynchronous Advantage Actor-Critic)详解 A3C(Asynchronous Advantage Actor-Critic) 是 深度强化学习(Deep Reinforcement Learning, DRL) 领域的重要算法,由 DeepMind 在 2016 年提出。…...
DeepSeek-v1到DeepSeek-v3再到DeepSeek-R1的变迁和进化史,创新点,值得大家学习,DeepSeek系列干货
DeepSeek-v1 1.高质量的数据构建:2T tokens中英文数据集(数据去重、过滤和重混); 2. 模型架构参考LlaMa; 3.数据并行、张量并行、超参数设置等: 衍生:DeepSeek-Coder、deepseek MoE、DeepSe…...
基于多层感知机(MLP)实现MNIST手写体识别
实现步骤 下载数据集处理好数据集确定好模型(初始化模型参数等等)确定优化函数(损失函数也称为目标函数)和优化方法(一般选用随机梯度下降 SDG )进行模型的训练进行模型的评估 import torch import torch…...
windows下安装pyenv+virtualenv+virtualenvwrapper
1、下载pyenv 进入git官网,打包下载zip到本地 2、解压到安装目录 解压下载好的pyenv-win-master.zip到自己的安装目录,如D:\Program Files 3、配置环境变量 右击桌面 此电脑 --> 属性 --> 高端系统设置 --> 环境变量 --> 新建系统变量…...
C# 确保程序只有一个实例运行
常规需求 C#程序只能运行一次,不能多开: using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Threading; using System.Runtime.InteropServices; using System.Security.Principal; namespace BallLocation {sta…...
MySQL 的存储引擎有哪些?它们之间有什么区别?
MySQL 支持多种存储引擎,每种存储引擎都有其独特的特性和适用场景。以下是 MySQL 中常见的存储引擎及其主要区别: 1.常见存储引擎及其特点 (1)InnoDB • 事务支持:支持完整的 ACID 特性,适用于需要事务处理的场景。 • 锁机制&…...
大语言模型的评测
大语言模型评测是评估这些模型在各种任务和场景下的性能和能力的过程。 能力 1. 基准测试(Benchmarking) GLUE(General Language Understanding Evaluation):包含多个自然语言处理任务,如文本分类、情感分…...
《从零到全栈:Vue2入门宝典》
1. Vue 简介 1.1 什么是 Vue? Vue 是一套用于构建用户界面的渐进式框架。Vue 的核心库专注于视图层,易于与其他库或现有项目集成。Vue 的目标是通过尽可能简单的 API 实现数据双向绑定和组件化开发。 1.2 什么是“渐进式”? “渐进式”意味…...
next.js-学习3
next.js-学习3 6. 设置数据库1. 传代码到github https://github.com/2. github和Vercel链接,用Vercel预览和部署3. 创建数据库4. 初始化数据库 7.读取数据1. 在/app/lib/data.ts中这两行是连接postgres的2. 在/app/dashboard/page.tsx中使用3.在/app/dashboard/page…...
Hadoop第2课(伪分布式集群的搭建)
jdk和hadoop安装包: hadoop-2.9.2.t......等2个文件官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 1、用XFTP发送hadoop安装包和jdk到/home/hadoop/目录下(hadoop用户的主目录) 2、解压jdk安装包到~目录 卸载jdk的命令:r…...
Linux——进程池
前言:大佬写博客给别人看,菜鸟写博客给自己看,我是菜鸟。 1.实现思路 思路:通过创建匿名管道,来实现父子进程之间的通信 注1:父写,子读 注2:匿名管道只能用来进行具有血管关系的进程…...
JavaScript 简单类型与复杂类型-简单类型的内存分配
深入理解JavaScript中的简单类型(基本数据类型)和复杂类型(引用数据类型)如何在内存中存储对于编写高效、无误的代码至关重要。本文将专注于探讨简单类型的内存分配机制,即栈(Stack)内存&#x…...
深度生成模型(一)——具身智能综述与算法分类简介
具身智能对于机器人的控制可以分为端到端模型和非端到端模型: 端到端模型:具身模型(如 ACT 和 DP)将视觉感知(Vision)与动作生成(Action)整合为单一神经网络,直接实现从…...
Vue 中,使用模板(Template) 和 Render 函数编写组件的区别
在 Vue 2 中,模板(Template) 和 Render 函数 是两种不同的组件编写方式,它们各有特点和适用场景。以下是它们的核心区别和实际应用场景分析: 1. 基本区别 特性模板(Template)Render 函数语法形…...
【笔记】论文阅读方法(AI大模型)
1 为什么读论文 构建知识体系:通过Related Works快速了解该方向研究现状,追踪经典论文 紧跟前沿技术:了解领域内新技术及效果,快速借鉴到自身项目 培养科研逻辑:熟悉论文体系,了解如何创造新事物&#x…...
JWT+redis实现令牌刷新优化方案
令牌刷新优化方案的详细实现步骤: 1. 令牌服务层改造 1.1 JWT工具类增强 // JwtUtils.java 新增方法 public class JwtUtils {// 生成带动态过期时间的令牌public static String createToken(String subject, String userId, String username, long expirationMi…...
安全面试5
文章目录 sql的二次注入在linux下,现在有一个拥有大量ip地址的txt文本文档,但是里面有很多重复的,如何快速去重?在内网渗透中,通过钓鱼邮件获取到主机权限,但是发现内网拦截了tcp的出网流量,聊一…...
vim临时文件泄露
##解题思路 感觉ctfshow的题目都挺有意思的,大家可以去做做 首先题目提示vim临时文件泄露,一般在vim编辑的时候,会有个swp的中间文件生成,根据这个特性,从而可以猜测,我们可以通过访问一个swp文件路径&am…...
使用Docker将ros1自定义消息通过rosjava_bootstrap生成jar包
文章目录 预准备环境rosjava_bootstrap坏消息好消息 环境安装docker安装rosjava_bootstrap仓库rosjava_center仓库修改rosjava_bootstrap代码拉取docker镜像放置自己的自定义消息 启动docker编译 预准备环境 rosjava_bootstrap rosjava_bootstrap是将自定义的ROS消息生成java…...
本地快速搭建一套AI人脸识别技术研究学习的实验环境
如果你想在本地搭建一套学习和研究AI人脸识别技术的框架,建议使用开源工具和框架进行实验,因为它们通常提供了较为丰富的文档和社区支持,能够帮助你深入理解人脸识别的核心原理。以下是一套可行性强且综合性的方案,涵盖了人脸检测…...
SpringBoot项目连接Oracle视图报错整理
在若依框架中增加连接Oracle视图报错 工具测试连接 通过使用plsql连接数据库测试,连接成功 1. 相关配置内容 连接配置 url: jdbc:oracle:thin:192.168.0.210:1521:HIS username: portal_his password: XXXXXX driver-class-name: oracle.jdbc.driver.OracleDr…...
【我的 PWN 学习手札】House of Husk
House of Husk House of Husk是利用格式化输出函数如printf、vprintf在打印输出时,会解析格式化字符如%x、%lld从而调用不同的格式化打印方法(函数)。同时C语言还提供了注册自定义格式化字符的方法。注册自定义格式化字符串输出方法…...
面试-JVM:JVM的组成及作用
JVM包含两个子系统和两个组件: 两个子系统: 类加载子系统(ClassLoader Subsystem) 作用:根据给定的全限定类名(如:java.long.Object)来装载class文件至运行时数据区的方法区。 核心…...
Node.js项目启动流程以及各个模块执行顺序详解
Node.js项目启动流程以及各个模块执行顺序的问题。首先,我需要仔细阅读并理解我搜索到的资料,从中提取关键信息,然后综合这些信息组织成一个结构化的回答。 首先,根据我搜索到的资料都详细描述了Node.js的启动流程,涉及…...
obj离线加载(vue+threejs)+apk方式浏览
demo需求:移动端,实现obj本地离线浏览 结合需求,利用(vue2threejs173)进行obj的加载,然后采用apk方式(hbuilderX打包发布)移动端浏览; https://github.com/bianbian886/…...
【Python 语法】Python 数据结构
线性结构(Linear Structures)1. 顺序存储列表(List)元组(Tuple)字符串(String) 2. 线性存储栈(Stack)队列(Queue)双端队列(…...
Flutter - 布局Widget
Flutter的布局主要分为 单子组件 和 多子组件 两大类: Container、Padding、Align这些属于单子组件,而Row、Column、ListView这些则是多子组件。 单子组件 Align组件 Align 是一个用于控制子组件位置的单子布局组件。它通过指定对齐方式(…...
AD从原理图到PCB超详细教程
AD超详细教程 前言一、建立一个工程模板二、原理图1.设计原理图。2.使用AD自带库和网上开源原理图库3.画原理图库4.编译原理图三、PCB1.确定元器件尺寸大小2.绘制PCB Library①使用元器件向导绘制元件库②原理图与PCB的映射3.绘制PCB①更新PCB②调整元件位置③布线④漏线检查⑤…...
视频级虚拟试衣技术在淘宝的产品化实践
作为一种新的商品表现形态,内容几乎存在于手淘用户动线全流程,例如信息流种草内容、搜索消费决策内容、详情页种草内容等。通过低成本、高时效的AIGC内容生成能力,能够从供给端缓解内容生产成本高的问题,通过源源不断的低成本供给…...
Redis安装及其AnotherRedisDesktopManagera安装使用
一、Redis安装 1. 下载Redis安装包 通过网盘分享的文件:Redis 链接: https://pan.baidu.com/s/1elAT8mk3EIoYQQ3WoVVoNg?pwd7yrz 提取码: 7yrz 2. 解压Redis安装包 下载完成后,将Redis安装包解压到一个指定的目录,例如:C:\Re…...
2025系统架构师(一考就过):案例之四:架构复用、架构评估、特定架构(DSSA)、架构开发方法(ABSD)
二、软件架构复用 ◆软件产品线是指一组软件密集型系统,它们共享一个公共的、可管理的特性集,满足某个特定市场或任务的具体需要,是以规定的方式用公共的核心资产集成开发出来的。即围绕核心资产库进行管理复用、集成新的系统。 ◆软件架构…...
软件工程应试复习(考试折磨版)
针对学校软件工程考试,参考教材《软件工程导论(第6版)》1-8章 学习的艺术:不断地尝试,我一定会找到高效用的方法,让学习变成一门艺术,从应试备考中解救出我的时间同胞们。 好嘞!既然…...
Kafka可视化工具EFAK(Kafka-eagle)安装部署
Kafka Eagle是什么? Kafka Eagle是一款用于监控和管理Apache Kafka的开源系统,它提供了完善的管理页面,例如Broker详情、性能指标趋势、Topic集合、消费者信息等。 源代码地址:https://github.com/smartloli/kafka-eagle 前置条件…...
本地部署SenseVoice(包括离线设备操作)
Anaconda3 Anaconda Installers and Packages SenseVoice 魔搭社区 FFmpeg FFmpeg 安装Anaconda3(Windows) 下载完成后,自定义路径后安装。在开始菜单中出现Anaconda Prompt说明安装成功。 安装Anaconda3(Linuxÿ…...
sql server 复制从备份初始化数据
参考 : 从备份初始化订阅(事务) - SQL Server | Microsoft Learn sql server 复制默认是用快照初始化数据的,也支持从备份初始化数据,参考如上...
MySQL 复合索引
MySQL 复合索引详解 引言 在实际业务场景中,多条件组合查询是最常见的操作之一。例如,根据“用户ID 时间范围”查询订单,或根据“商品分类 价格区间”筛选商品。此时,单列索引可能无法满足性能需求,而**复合索引&am…...
蓝桥杯备赛(C/C++组)
README: 本笔记是自己的备考笔记,按照官网提纲进行复习!适合有基础,复习用。 一、总考点 试题考查选手解决实际问题的能力,对于结果填空题,选手可以使用手算、软件、编程等方法解决,对于编程大…...
人类驾驶的人脑两种判断模式(反射和预判)-->自动驾驶两种AI模式
一种模式是直觉模式,判断是基于条件反射,视觉感知 触发到 直接条件反射(从经历中沉淀形成的神经信息闭环),类似现在自动驾驶技术的传统AI模式。 另一种模式是物理时空图式推理模式,判断是基于预判预测&…...
C语言机试编程题
编写版本:vc2022 1.求最大/小值 #include<stdio.h> int main(){int a[50],n;int max, min;printf("请输入您要输入几个数");scanf_s("%d", &n);printf("请输入您要比较的%d个数\n",n);for (int i 0; i<n; i) {scanf_…...