langchain基础(一)
模型又可分为语言模型(擅长文本补全,输入和输出都是字符串)和聊天模型(擅长对话,输入时消息列表,输出是一个消息)两大类。
以调用openai的聊天模型为例,先安装langchain_openai库
1、基础调用
初始化模型——构建消息列表——调用模型并输出结果
# 导入openai的聊天模型类
from langchain_openai import ChatOpenAI
# 初始化模型
model=ChatOpenAI(model="gpt-3.5-turbo",
base_url="https://api.gptsapi.net/v1",
temperature=1.2,
max_tokens=300,
model_kwargs={
"frequency_penalty":1.5
})
from langchain.schema.messages import (SystemMessage,HumanMessage)
#构建消息列表
messages=[
SystemMessage(content="请你作为我的物理课助教,用通俗易懂的语言解释物理概念。"),
HumanMessage(content="什么是波粒二象性?")
]
#调用模型并输出结果
response=model.invoke(messages)
print(response)
print(response.content)
model_kwargs
是一个用于向语言模型传递额外参数的字典,它的键是一些不常用的参数。它允许你在初始化模型(如ChatOpenAI
)时,对模型的行为进行更细致的控制。- 注意:model,base_url,openai_api_key,max_tokens或max_completion_tokens,temperature,stream这些参数通常独立于model_kwargs。(为什么?因为这些参数非常基础,几乎所有模型都有。为了方便设置,就把他们作为更明显的独立参数。把常用参数放进model_kwargs时就会有警告)
- 多种消息类型:
SystemMessage,HumanMessage,
AIMessage(表示模型生成的回复消息),FunctionCallMessage(
当模型决定调用某个函数来完成任务时,会生成一个FunctionCallMessage
消息,包含函数名和参数等信息)
invoke
:触发模型的响应,里面封装了和语言模型通信的复杂过程,包括构建请求、发送请求、处理响应等。print(response)
:打印整个响应对象,这个对象包含了模型返回的所有信息,如消息内容、元数据等。print(response.content)
:打印响应对象中的content
属性,即模型生成的文本内容
2、提示模板
可以动态构建给模型的消息,效率更高。
针对系统消息、人类消息和AI消息都有相应的模板类。
对于如何填充变量,有隐式识别变量和显式指定 input_variables
两种方式。
from langchain.schema import SystemMessage
from langchain.prompts import SystemMessagePromptTemplate
# 定义模板
template = "你是一名 {role},在 {scene} 中,需要 {task}。"
# 方法一:隐式识别变量
# 直接使用 from_template 并传入变量值
system_message_implicit = SystemMessage.from_template(
template,
role="消防员",
scene="火灾现场",
task="扑灭大火并营救被困人员"
)
print("隐式识别变量生成的系统消息:")
print(system_message_implicit.content)
# 方法二:显式指定 input_variables
# 创建 SystemMessagePromptTemplate 对象,显式指定 input_variables
system_message_prompt = SystemMessagePromptTemplate.from_template(
template,
input_variables=["role", "scene", "task"] #可省
)
# 根据模板和具体变量值生成 SystemMessage
system_message_explicit = system_message_prompt.format_messages(
role="消防员",
scene="火灾现场",
task="扑灭大火并营救被困人员"
)[0]
print("\n显式指定 input_variables 生成的系统消息:")
print(system_message_explicit.content)
显式解析:
先用模板类的from_template方法:从一个模板(template)字符串来创建提示模板对象。
后用提示模板对象的format_messages方法:对消息进行格式化处理,即将模板中的占位符填充为实际的值。
SystemMessagePromptTemplate类
的实例调用 format_messages
方法,传入具体的变量值,该方法会根据模板和变量值生成一个 SystemMessage
对象列表。(即调用者是提示模板对象,返回值是消息对象的列表)
返回消息列表的原因:
由于这里只有一个消息,所以取列表的第一个元素。
提示模板对象=提示模板类.from_template(模板字符串)
消息列表=提示模板对象.format_messages(变量赋值)
from langchain.schema import SystemMessage
from langchain.prompts import SystemMessagePromptTemplate
prompt_template="你是一名{role},在{scene}中,需要{task}。"
# 由模板字符串 构建模板实例
system_message_prompt_template=SystemMessagePromptTemplate.from_template(prompt_template)
# 填充模板实例 得到消息列表
system_messages=system_message_prompt_template.format_messages(
role="消防员",
scene="火灾现场",
task="扑灭大火并营救被困人员"
)
print(system_messages)
print(system_messages[0])
print(system_messages[0].content)
#[SystemMessage(content='你是一名消防员,在火灾现场中,需要扑灭大火并营救被困人员。', additional_kwargs={}, response_metadata={})]
#content='你是一名消防员,在火灾现场中,需要扑灭大火并营救被困人员。' additional_kwargs={} response_metadata={}
#你是一名消防员,在火灾现场中,需要扑灭大火并营救被困人员。
集成版本:
print(prompt_value)后可以发现,它是消息列表被包装后的形态。
它也可以直接作为参数传给模型。