LangChain核心组件-模型包装器

任何大模型应用程序的核心元素都是大模型,LangChain提供了与任何语言模型交互的构建块,包括组件:语言模型、提示模板、示例编译器、输出解析器等

语言模型

LangChain 提供通用接口(模型包装器)调用不同类型的语言模型,其支持的模型有三大类

1. 大语言模型LLM包装
2. 聊天模型Chat Model包装
3. 文本嵌入模型Enbedding Model:将文本作为输入并返回词向量

大语言模型LLM包装器(国内放弃)

  • 文本补全模型,接收文本字符串作为输入,并返回一个补全字符串作为输出
例如:
提示:今天天气如何?
答案: 今天天气很好
  • 其为一问一答,OpenAi的文本补全类型API 202307进行了最后一次更新,只能访问较旧的历史遗留模型

聊天模型(Chat Model)

主要代表ChatGPT系列模型。通常由语言模型支持,其API更加结构化

ChatOpenAI(聊天模型包装器)

  • 原理:ChatOpenAI将一系列的聊天信息或信息列表作为输入,并返回聊天信息
  • 解决问题:对于复杂对话场景支持多论对话。其每一则消息都包含了消息角色和消息内容,他们合在一起构成了一个完整的对话上下文。适合需要历史对话和生成带有对话上下文响应的任务
#实现一个翻译助手
msg = [
('system','请将以下的内容翻译成英文'),
('human','你好,你今天过得好吗?'),
]

缺点

随意选一个国内AI模型执行上述msg,不设置任何其它的内容,虽然能够交互,但是存在问题:

  1. 提示词固定,无法根据实际情况灵活变动
  2. 大模型原始答复复杂,有许多额外信息

提示词模板prompt template

是一个模块化的字符串,可以用来生成特定的提示(prompts),可以将变量插入模板中,创建出不同的提示

特点

  • 清晰易懂的提示:提高提示文本的可读性便于理解,尤其处理复杂或者多个变量的情况下
  • 增强可重用性:模板可以在多个地方重复使用,简化代码,不需要重复构建提示字符串
  • 简化维护:需要更改提示内容仅需要更改模板对应位置即可
  • 智能处理变量:模板自动处理变量的插入
  • 参数化生成: 根据不同参数生成不同提示,有助于个性化文本生成

常见提示词模板

  • LLM提示词模板 prompttemplate:String提示模板
#字符串提示词组合
# 在处理字符串提示词时,每个模板是连接在一起的。您可以直接使用提示词或字符串(列表中的第一个元素需要是一个提示词)。
from langchain_core.prompts import PromptTemplate
prompt = (
PromptTemplate.from_template("Tell me a joke about {topic}")
+ ", make it funny"
+ "\n\nand in {language}"
)
==>
PromptTemplate(input_variables=['language', 'topic'], template='Tell --> me a joke about {topic}, make it funny\n\nand in {language}')

prompt.format(topic="sports", language="spanish")
==>
'Tell me a joke about sports, make it funny\n\nand in spanish'

  • 聊天提示模板 ChatPromptRemplate:用于组合各种角色的消息模板,传入聊天模型
# 聊天提示词组成
#聊天提示词由一系列消息组成。与上面的示例类似,我们可以连接聊天提示词模板。
#每个新元素都是最终提示词中的一条新消息
# 用一个 SystemMessage 初始化一个 ChatPromptTemplate
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
prompt = SystemMessage(content="You are a nice pirate")
#您可以轻松创建一个管道,将其与其他消息 或 消息模板结合起来。 当没有变量需要格式化时使用 Message,当有变量需要格式化时使用 MessageTemplate。您也可以仅使用一个字符串(注意:这将自动推断为一个 HumanMessagePromptTemplate)
new_prompt = (
prompt + HumanMessage(content="hi") + AIMessage(content="what?") + "{input}"
)
# 在底层,这会创建一个 ChatPromptTemplate 类的实例,因此您可以像之前一样使用它!
new_prompt.format_messages(input="i said hi")
==>
[SystemMessage(content='You are a nice pirate'),
HumanMessage(content='hi'),
AIMessage(content='what?'),
HumanMessage(content='i said hi')]
  • 增强提示词模板: 少样本提示模板 FewShotPromptTemplate、提示模板部分格式化、管道提示模板PipLinePrompt等

输出解析器

输出解析器负责LLM的输出并将其转换为更合适的格式

分类

  • CSV解析器:CommaSeparatedListOutputParser,模型的输出以逗号分隔,以列表形式返回输出

  • 日期时间解析器:DatetimeOutputParser:将LLM输出解析为日期时间格式

  • JSON解析器:JsonOutputParser,确保输出符合特定JSON对象格式

  • XML解析器:XMLOutputParser,允许以流行的XML格式从LLM获取结果