AI大模型探索之路-应用篇2:Langchain框架ModelIO模块—数据交互的秘密武器
目录
前言
一、概述
二、Model
三、Prompt
五、Output Parsers
总结
前言
随着人工智能技术的不断进步,大模型的应用场景越来越广泛。LangChain框架作为一个创新的解决方案,专为处理大型语言模型的输入输出而设计。其中,Model IO(输入输出)模块扮演着至关重要的角色,负责构建和管理数据交互的通道。本文将深入剖析ModelIO模块的工作原理、功能特性,以及如何通过该模块提升数据处理效率,进而加速AI大模型应用的开发。
一、概述
Model IO模块是LangChain框架的数据交互中枢;它不仅负责准备和处理模型的输入数据,还管理模型产出的结果。主要包括一下3部分:
- 提示词格式化(Input):接收原始输入数据到将其转换为模型可理解的格式
- 大模型调用(Model ):调用大语言模型API获得返回结果
- 结果解析处理(Output):将大语言模型返回的结果进行解析处理。
二、Model
1、LLMs
LLMs是LangChain 的核心组件,但LangChain并不提供自己的LLMs,它主要允许开发者使用统一的方式与不同的大型语言模型进行交互。这包括与OpenAI、Cohere、Hugging Face等流行的LLMs服务进行接口对接。(类似于Completion,属于文本生成类模型API的支持)
from langchain_openai import OpenAIllm = OpenAI()llm.invoke("奥巴马当了几年总统?")
2、Chat Model
对于需要复杂对话管理能力的应用,LangChain框架提供了ChatModels模块。这个模块利用特殊的语言模型变体,优化了聊天场景下的信息交换和处理流程。(类似于Chat Completion,属于聊天会话类模型API的支持)
from langchain_openai import ChatOpenAIchat_model = ChatOpenAI(model="gpt-3.5-turbo-0125")from langchain_core.messages import (AIMessage,HumanMessage,SystemMessage
)# 设置模型角色,同时设置样例
messages = [SystemMessage(content="你是一个智能助手"),HumanMessage(content="第二十一届世界杯在哪儿举行的?"),AIMessage(content="在俄罗斯"),HumanMessage(content="冠军是哪个球队")]# chat_model.invoke(messages)chat_model.invoke(messages).content
三、Prompt
通过Prompts模块提供了灵活的提示词模板和处理机制,允许用户高效地定义和格式化这些提示,以便与LLMs进行有效的交互。
1、Prompt Template
用于创建动态的提示词模板,可以基于一定规则插入变量。例如:
## 可以动态传入参数
from langchain.prompts import PromptTemplate# 定义提示词模板
prompt_template = PromptTemplate.from_template("Tell me a {adjective} joke about {content}."
)
# 传入参数,格式化提示词模板
prompt_template.format(adjective="funny", content="chickens")## 也可以不传参数from langchain.prompts import PromptTemplateprompt_template = PromptTemplate.from_template("Tell me a joke")prompt_template.format()
2、ChatPromptTemplate
专门用于支持聊天场景,模拟多轮对话中的上下文交换。例如:
from langchain.prompts import ChatPromptTemplatechat_template = ChatPromptTemplate.from_messages([("system", "You are a helpful AI bot. Your name is {name}."),("human", "Hello, how are you doing?"),("ai", "I'm doing well, thanks!"),("human", "{user_input}"),]
)messages = chat_template.format_messages(name="Bob", user_input="What is your name?")chat_model.invoke(messages)
3、Few-shot prompt templates
利用有限示例来丰富大型语言模型(LLMs)的知识基础,并指导其推理过程。向模型提供针对性的样本集合,这些样本作为参考点,有效地提升模型在处理新颖问题时的逻辑推理能力和答案生成的精确度;同时还增强了模型在面对未知或复杂情境下的思维连贯性和适应性。
from langchain.prompts.few_shot import FewShotPromptTemplatefrom langchain.prompts.prompt import PromptTemplateexamples = [{"question": "富兰克林·德拉诺·罗斯福和亚伯拉罕·林肯中哪个担任总统的时间更长?","answer":"""这里需要后续问题吗:是。后续问题:富兰克林·德拉诺·罗斯福担任了几年总统?中间答案:富兰克林·德拉诺·罗斯福担任了12年的总统。后续问题:亚伯拉罕·林肯则担任了几年总统?中间答案:亚伯拉罕·林肯则担任了5年的总统。因此最终答案是:富兰克林·德拉诺·罗斯福"""},{"question": "百度的创始人是何时出生的?","answer":"""这里需要后续问题吗:是。后续问题:百度的创始人是谁?中间答案:百度的创始人是李彦宏。后续问题:李彦宏是什么时候出生的?中间答案:李彦宏于1968年11月17日出生。因此最终答案是:1968年11月17日"""},{"question": "特雷西·麦克格雷迪和姚明,谁在NBA打的赛季多?","answer":"""这里需要后续问题吗:是。后续问题:特雷西·麦克格雷迪在NBA打了几个赛季?中间答案:特雷西·麦克格雷迪在NBA打了9个赛季。后续问题:姚明在NBA打了几个赛季?中间答案:姚明在NBA打了8个赛季。因此最终答案是:特雷西·麦克格雷迪"""}]
1)使用一个样本
# 定义提示词模板
example_prompt = PromptTemplate(input_variables=["question", "answer"], template="Question: {question}\n{answer}")
# 使用第一个样例作为参数 并输出打印
print(example_prompt.format(**examples[0]))#输出结果
Question: 富兰克林·德拉诺·罗斯福和亚伯拉罕·林肯中哪个担任总统的时间更长?这里需要后续问题吗:是。
后续问题:富兰克林·德拉诺·罗斯福担任了几年总统?
中间答案:富兰克林·德拉诺·罗斯福担任了12年的总统。
后续问题:亚伯拉罕·林肯则担任了几年总统?
中间答案:亚伯拉罕·林肯则担任了5年的总统。
因此最终答案是:富兰克林·德拉诺·罗斯福
2)使用所有样本
# 使用所有的样例
prompt = FewShotPromptTemplate(examples=examples,example_prompt=example_prompt,suffix="Question: {input}",input_variables=["input"]
)print(prompt.format(input="马云比马化腾大几岁?"))
Question: 富兰克林·德拉诺·罗斯福和亚伯拉罕·林肯中哪个担任总统的时间更长?这里需要后续问题吗:是。
后续问题:富兰克林·德拉诺·罗斯福担任了几年总统?
中间答案:富兰克林·德拉诺·罗斯福担任了12年的总统。
后续问题:亚伯拉罕·林肯则担任了几年总统?
中间答案:亚伯拉罕·林肯则担任了5年的总统。
因此最终答案是:富兰克林·德拉诺·罗斯福Question: 百度的创始人是何时出生的?这里需要后续问题吗:是。
后续问题:百度的创始人是谁?
中间答案:百度的创始人是李彦宏。
后续问题:李彦宏是什么时候出生的?
中间答案:李彦宏于1968年11月17日出生。
因此最终答案是:1968年11月17日Question: 特雷西·麦克格雷迪和姚明,谁在NBA打的赛季多?这里需要后续问题吗:是。
后续问题:特雷西·麦克格雷迪在NBA打了几个赛季?
中间答案:特雷西·麦克格雷迪在NBA打了9个赛季。
后续问题:姚明在NBA打了几个赛季?
中间答案:姚明在NBA打了8个赛季。
因此最终答案是:特雷西·麦克格雷迪Question: 马云比马化腾大几岁?
3)调用测试
llm.invoke(prompt.format(input="特朗普的爸爸的女儿的兄弟是谁?"))
'
这里需要后续问题吗:是。
后续问题:特朗普的爸爸是谁?
中间答案:特朗普的爸爸是弗雷德·特朗普。
后续问题:弗雷德·特朗普的女儿是谁?
中间答案:弗雷德·特朗普的女儿是玛丽·安娜·特朗普。
后续问题:玛丽·安娜·特朗普的兄弟是谁?
中间答案:玛丽·安娜·特朗普的兄弟是唐纳德·特朗普。
因此最终答案是:唐纳德·特朗普'
五、Output Parsers
为了进一步处理和解析LLMs的输出结果,LangChain提供了一系列的Output Parsers。这些解析器能够将模型的文本输出转换为更加结构化的格式,便于后续的处理和使用。
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import PromptTemplate
from langchain_openai import OpenAImodel = OpenAI()# 将输出解析为逗号分隔的列表
parser = CommaSeparatedListOutputParser()
format_instructions = parser.get_format_instructions()prompt = PromptTemplate(template="List five {subject}.\n{format_instructions}",input_variables=["subject"],partial_variables={"format_instructions": format_instructions}
)## LCEL 链式表达式语言用法 (前一个的输入,作为后一个的输出)
chain = prompt | model | parser
chain.invoke({"subject": "ice cream flavors"})输出:
['chocolate','vanilla','strawberry','mint chocolate chip','cookies and cream']
总结
通过以上相关的功能模块,LangChain框架的Model IO模块为大型语言模型的数据交互提供了强大支持。其精心设计的接口和工具让开发者能够更加专注于模型的实际应用,同时简化了大模型调用数据流的管理细节。降低了大模型开发门槛,使得开发者可以便捷地实现高级的AI应用能力。
探索未知,分享所知;点击关注,码路同行,寻道人生!
相关文章:

AI大模型探索之路-应用篇2:Langchain框架ModelIO模块—数据交互的秘密武器
目录 前言 一、概述 二、Model 三、Prompt 五、Output Parsers 总结 前言 随着人工智能技术的不断进步,大模型的应用场景越来越广泛。LangChain框架作为一个创新的解决方案,专为处理大型语言模型的输入输出而设计。其中,Model IO&#…...
【SSH】群晖开启ssh访问
群晖开启ssh访问 假设 你需要设置群晖 账号 test-user 开启ssh访问 设置 你的 test-user 为管理员权限 否则你无法通过cmd 面板 连接访问 群晖你需要哪个账号 就使用哪个账号终端 cmd连接 否则需要考虑后续创建 rsa 公密钥文件的 所属权 问题账号密码连接登录终端 ssh -p 端…...

Vue 移动端(H5)项目怎么实现页面缓存(即列表页面进入详情返回后列表页面缓存且还原页面滚动条位置)keep-alive缓存及清除keep-alive缓存
一、需求 产品要求:Vue移动端项目进入列表页,列表页需要刷新,而从详情页返回列表页,列表页则需要缓存并且还原页面滚动条位置 二、实现思路 1、使用Vue中的keep-alive组件,keep-alive提供了路由缓存功能 2、因为我项…...

【MVCC】深入浅出彻底理解MVCC
MVCC概述 MVCC(Multi-Version Concurrency Control)即多版本并发控制。主要是为了提高数据库的并发性能而提供的,采用了不加锁的方式处理读-写并发冲突,确保了任何时刻的读操作都是非阻塞的。只需要很小的开销,就可以…...

【问题解决】ubuntu安装新版vscode报code-insiders相关错误
问题 目前 vscode官网 最新的包为 insiders_1.89.0-1712297812_amd64.deb ,双击或者使用sudo dpkg -i code-insiders_1.89.0-1712297812_amd64.deb安装后报错,执行其他命令也报错。 安装环境:ubuntu18.04 dpkg: 处理软件包 code-insiders (…...

【Python】面向对象(专版提升2)
面向对象 1. 概述1.1面向过程1.2 面向对象 2. 类和对象2.1 语法2.1.1 定义类2.1.2 实例化对象 2.2 实例成员2.2.1 实例变量2.2.2 实例方法2.2.3 跨类调用 3. 三大特征3.1 封装3.1.1 数据角度3.1.2 行为角度3.1.3 案例:信息管理系统3.1.3.1 需求3.1.3.2 分析3.1.3.3 设计 3.2 继…...

Vscode设置滚轮进行字体大小的调节
Vscode设置滚轮进行字体大小的调节 正常的话按 ctrl 或者 ctrl - 进行字体的大小调节 1.打开Vscode,找打设置的图标,在点击设置,或者直接使用快捷键,【ctrl ,】 2. 在搜索框搜索Font Ligatures 3.双击进入settings.json ,找到如…...

【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件
【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件 往期回顾 【QT入门】Qt自定义控件与样式设计之QProgressBar用法及qss-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QSlider用法及qss-CSDN博客 【QT入门】Qt自定义控件与样式设计之qss的加载方式-CSDN博客 一、最终…...

Spring Validation解决后端表单校验
NotNull:从前台传递过来的参数不能为null,如果为空,会在控制台日志中把message打印出来 Range:范围,最大多少,最小多少 Patten,标注的字段值必须符合定义的正则表达式(按照业务规则࿰…...

Harmony鸿蒙南向驱动开发-UART接口使用
功能简介 UART指异步收发传输器(Universal Asynchronous Receiver/Transmitter),是通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输。 两个UART设备的连接示意图如下,UART与其他模块一…...
【示例】MySQL-事务控制示例:账户转账-savepoint关键字
前言 本文讲述MySQL中的事务,以账户转账为例,体会事务的概念,并讲解事务相关的一个关键字用法:savepoint 示例 数据准备 drop table if exists account;create table account(id int primary key AUTO_INCREMENT comment ID,n…...
STM32使用标准版RT-Thread,移植bsp中的板文件后,想使用I/O设备模型,使用串口3或者串口4收发时,发现串口3或者串口4没反应
STM32移植RT-Thread出现的问题及解决办法 问题原因解决方法 问题 使用标准版RT-Thread,移植bsp中的板文件后,想使用I/O设备模型,使用串口3或者串口4收发时,发现串口3或者串口4没反应。出现问题:程序一直跑在 while (__HAL_UART_…...

MVCC(解决MySql中的并发事务的隔离性)
MVCC 如何保证事务的隔离性? 1.排他锁:如一个事务获取了一个数据行的排他锁,其他事务就不能再获取改行的其他锁。 2.MVCC:多版本并发控制。 MVCC: 1.隐藏字段 1.DB_TRX_ID:最近修改事务的id。默认值从0开…...
第四十八章 为 Web 应用程序实现 HTTP 身份验证 - 在处理请求之前在 CSP 中进行身份验证
文章目录 第四十八章 为 Web 应用程序实现 HTTP 身份验证 - 在处理请求之前在 CSP 中进行身份验证在处理请求之前在 CSP 中进行身份验证。 第四十八章 为 Web 应用程序实现 HTTP 身份验证 - 在处理请求之前在 CSP 中进行身份验证 在处理请求之前在 CSP 中进行身份验证。 这是…...

家庭网络防御系统搭建-siem之security onion 安装配置过程详解
本文介绍一下security onion的安装流程,将使用该工具集中管理终端EDR和网络NDR sensor产生的日志。 充当SIEM的平台有很多,比如可以直接使用原生的elastic以及splunk等,security onion的优势在于该平台能够方便的集成网络侧(比如…...

【MATLAB源码-第23期】基于matlab的短时傅里叶STFT信号变换仿真,得到信号的时频曲线图。
1、算法描述 短时傅里叶变换(Short-Time Fourier Transform,STFT)是傅里叶变换的一种扩展,用于分析信号在时域和频域上的变化。描述如下: 1. **时域与频域分析**: - 信号通常以时域的形式表示…...
链表中倒数最后k个结点【c语言】
#include <stdio.h> #include <stdlib.h>typedef struct Node {int data;struct Node* next; } Node, *LinkedList;// 创建一个新节点 Node* createNode(int data) {Node* newNode (Node*)malloc(sizeof(Node));if (newNode NULL) {printf("Error! Unable t…...

在一台恢复测试机器上验证oracle备份有效性
一 目的 定期将生产环境oracle数据库恢复到一台测试环境数据库服务器上,以验证备份是否有效,是否能正常恢复。 二 环境 这里以恢复orcl1库为例,计划在orcl这个实例上进行恢复测试。 三 实验步骤 3.1 在目标端创建和源端一样的备份目录 ①…...

Harmony鸿蒙南向驱动开发-MIPI CSI
CSI(Camera Serial Interface)是由MIPI联盟下Camera工作组指定的接口标准。CSI-2是MIPI CSI第二版,主要由应用层、协议层、物理层组成,最大支持4通道数据传输、单线传输速度高达1Gb/s。 物理层支持HS(High Speed&…...

最优算法100例之43-包含min函数的栈
专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min,push及pop的时间复杂…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势
一、WebRTC与智能硬件整合趋势 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...