LangChain
langchain的官网: https://langchain.com
基于RAG架构的开发
背景:
- 大模型的知识冻结
- 大模型幻觉
何为RAG?
Retrieval Augmented Generation (RAG) 是一种结合了检索增强生成的技术,旨在提高大型语言模型(LLM)的准确性和可靠性。在这种架构中,大模型首先从外部知识库或文档中进行检索,然后根据检索到的信息来生成回答或完成特定任务。

基于Agent架构的开发
充分利用LLM的推理决策能力,通过增加规划、记忆和工具调用的能力,构造一个能够独立思考,逐步完成给定目标的智能体。
一个数学公式来表示:
Agent = LLM + Memory + Tools + Planning + Action
大模型应用开发的4个场景
场景1: 纯Prompt
Prompt是操作大模型的核心,通过精心设计的Prompt可以引导大模型完成各种任务。
场景3: RAG
这个在智能客服上用的最广泛
场景4: Fine-tuning(精调/微调)
举例: 努力学习考试内容,长期记住,活学活用
特点: 成本最高;在前面的方式解决不了问题的情况下,再使用
如何选择?
面对一个需求,如何开始,如何选择技术方案?下面是个常用的思路: 
LainChain的核心组件
如果要组织一个AI应用,开发者一般需要什么?
- 提示词模板的构建,不仅仅只包含用户输入。
- 模型调用与返回,参数设置,返回内容的格式化输出。
- 知识库查询,这里会包含文档加载,切割,以及转化为词嵌入(Embedding)向量
- 其他第三方工具调用,一般包含天气查询,Google搜索、一些自定义的接口能力调用。
- 记忆获取,每一个对话都有上下文,在开启对话之前总得获取到之前得上下文把
1. 对话模型 & 非对话模型
2. 通过配置文件调用大模型
方式一
from langchain_openai import ChatOpenAI
import os
import dotenv
# 加载配置文件
dotenv.load_dotenv()
# os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
# os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
# 调用对话模型
chat_model = ChatOpenAI(
# 必须要设置的3个参数
model_name="gpt-4o-mini", # 默认使用的是gpt-3.5-
base_url=os.environ["OPENAI_BASE_URL"],
api_key=os.environ["OPENAI_API_KEY"],
)
# 调用模型
response = chat_model.invoke("什么是langchain?")
# 查看响应的文本
print(response.content)方式二
from langchain_openai import ChatOpenAI
import os
import dotenv
# 加载配置文件
dotenv.load_dotenv()
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
# 调用对话模型
chat_model = ChatOpenAI(
# 必须要设置的3个参数
model_name="gpt-4o-mini" # 默认使用的是gpt-3.5-
)
# 调用模型
response = chat_model.invoke("什么是langchain?")
# 查看响应的文本
print(response.content)3. 关于对话模型嗲用消息列表
import os
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAI
import dotenv
# 加载环境变量
dotenv.load_dotenv()
"""
invoke()的输入可以是多种类型,典型的类型有: ① 字符串类型 ② 消息列表
invoke*(的输出类型: BaseMessage的字类: AIMessage
LangChain有一些内置的消息类型:
SystemMessage: 设定AI行为规则或背景信息。比如
HumanMessage:
AIMessage:
"""
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
chat_model = ChatOpenAI(
model_name='gpt-4o-mini'
)
# 调用模型
system_message = SystemMessage(content="你是一个英语教学方向的专家")
human_message = HumanMessage(content="帮我指定一个英语六级学习的计划")
messages = [system_message, human_message]
response = chat_model.invoke(messages)
print(response.content)
print(type(response))5. 关于多轮对话与上下文记忆
大模型本身是没有记忆能力的,但是我们可以借助LangChain的Memory组件来实现。
import os
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAI
import dotenv
# 加载环境变量
dotenv.load_dotenv()
"""
invoke()的输入可以是多种类型,典型的类型有: ① 字符串类型 ② 消息列表
invoke*(的输出类型: BaseMessage的字类: AIMessage
LangChain有一些内置的消息类型:
SystemMessage: 设定AI行为规则或背景信息。比如设定AI的初始状态、行为模型和对话的总体目标。比如作为一个代码专家,或者返回json格式。通常作为输入消息序列中的第一个传递
HumanMessage: 表示来自用户输入。比如实现一个快速排序方法
AIMessage: 存储AI恢复的内容,这可以是文本,也可以是调用工具的请求
"""
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
chat_model = ChatOpenAI(
model_name='gpt-4o-mini'
)
# 调用模型
system_message = SystemMessage(content="我是一个人工智能的助手,我的名字叫小智")
human_message = HumanMessage(content="猫王是一只猫吗?")
system_message1 = SystemMessage(content="我可以做很多事情,有需要就找我吧")
human_message1 = HumanMessage(content="你叫什么名字?")
messages = [system_message, human_message,system_message1,human_message1]
response = chat_model.invoke(messages)
print(response.content)6. 阻塞式invoke()和流式stream的调用
invoke()阻塞式调用
import os
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
import dotenv
# 关于模型调用的方法的说明
# invoke() / stream()
# batch(): 批量的调用
# ainvoke() / astream() / abatch() 异步方法的调用
#
# invoke()阻塞式调用
#
# 加载环境变量
dotenv.load_dotenv()
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
# 调用大模型
chat_model = ChatOpenAI(
model_name="gpt-4o-mini"
)
# 创建消息
messages = [HumanMessage(content="你好,请介绍一下自己")]
response = chat_model.invoke(messages)
print(response)stream()流式调用
import os
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
import dotenv
# 加载环境变量
dotenv.load_dotenv()
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
# 调用大模型
chat_model = ChatOpenAI(
model_name="gpt-4o-mini"
)
# 创建消息
messages = [HumanMessage(content="你好,请介绍一下自己")]
response = chat_model.stream(messages)
print("开始流式输出")
for chunk in response:
print(chunk.content,end='',flush=True)7. 批量调用
import os
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAI
import dotenv
# 加载环境变量
dotenv.load_dotenv()
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
chat_model = ChatOpenAI(
model="gpt-4o-mini"
)
message1 = [
SystemMessage(content="你是一位乐于助人的智能小助手"),
HumanMessage(content="请帮我介绍一下什么是机器学习?")
]
message2 = [
SystemMessage(content="你是一位乐于助人的智能小助手"),
HumanMessage(content="请帮我介绍一下什么是langchain?")
]
message3 = [
SystemMessage(content="你是一位乐于助人的智能小助手"),
HumanMessage(content="请帮我介绍一下什么是神经网络?")
]
messages = [message1,message2,message3]
responses = chat_model.batch(messages)
for response in responses:
print(response.content)8. 提示词模板
【PromptTemplate】: LLM提示模板,用于生成字符串提示。它使用Python的字符串来模板提示。
【ChartPromptTemplate】: 聊天提示模板,用于组合各种角色的消息模板,传入聊天模型
XxxMessagePromptTemplate: 消息模板词模板,包括: SysteMessagePromptTemplate, HumanMessagePromptTemplate,AImessagPromptTemplate、ChatMessagePromptTemplate等
【FewShotPromptTemplate】: 样本提示词模板,通过示例来教模型如何回答。
PipeLine: 管道,用于将多个提示模板串联起来。
自定义模板: 自定义模板,用于生成自定义的提示词。
1. PrompTemplate
方式一: 使用构造方法的方式
import os
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
import dotenv
# 加载环境变量
dotenv.load_dotenv()
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
# 调用模型
chat_model = ChatOpenAI(
model="gpt-4o-mini"
)
# PromptTemplate的使用
# 1. PromptTemplate如何获取实例
# 方式一: 使用构造方法的方式
# 创建promptTemplate实例
# 参数中必须要指明: input_variables、template
prompt_template = PromptTemplate(
template="你是一个{role},你的名字叫{name}",
input_variables=["role", "name"],
)
# print(prompt_template)
# 填充实例中的变量,暂且使用format()
prompt = prompt_template.format(role="人工智能专家",name="小智")
print(prompt)方式二:
import os
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
import dotenv
# 加载环境变量
dotenv.load_dotenv()
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
# 调用模型
chat_model = ChatOpenAI(
model="gpt-4o-mini"
)
# PromptTemplate的使用
# 1. PromptTemplate如何获取实例
# 方式一: 使用构造方法的方式
# 创建promptTemplate实例
# 参数中必须要指明: input_variables、template
prompt_template = PromptTemplate.from_template(template="你是一个{role},你的名字叫{name}")
# 填充实例中的变量,暂且使用format()
prompt = prompt_template.format(role="人工智能专家",name="小智")
print(prompt)如果提示词模板中不包含变量,可以直接使用from_template(),prompt = prompt_template.format
2. 两种特殊结构的使用
2.1 部分提示词模板的使用(重点)
方式一
import os
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
import dotenv
# 加载环境变量
dotenv.load_dotenv()
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
# 调用模型
chat_model = ChatOpenAI(
model="gpt-4o-mini"
)
# PromptTemplate的使用
# 1. PromptTemplate如何获取实例
# 方式一: 使用构造方法的方式
# 创建promptTemplate实例
# 参数中必须要指明: input_variables、template
template = PromptTemplate.from_template(
template="请评价{product}的优缺点,包括{aspect1}和{aspect2}",
partial_variables={"aspect1": '电池续航'}
)
# 使用模板生成提示词
prompt_1 = template.format(product="智能手机",aspect2="拍照质量")
print(prompt_1)方式二
import os
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
import dotenv
# 加载环境变量
dotenv.load_dotenv()
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
# 调用模型
chat_model = ChatOpenAI(
model="gpt-4o-mini"
)
# PromptTemplate的使用
# 1. PromptTemplate如何获取实例
# 方式一: 使用构造方法的方式
# 创建promptTemplate实例
# 参数中必须要指明: input_variables、template
template = PromptTemplate.from_template(
template="请评价{product}的优缺点,包括{aspect1}和{aspect2}")
template1 = template.partial(aspect1="电池续航",aspect2="拍照质量")
# 使用模板生成提示词
prompt_1 = template1.format(product="智能手机")
print(prompt_1)2.2 组合提示词的使用(了解)
import os
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
import dotenv
# 加载环境变量
dotenv.load_dotenv()
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
# 调用模型
chat_model = ChatOpenAI(
model="gpt-4o-mini"
)
# PromptTemplate的使用
# 1. PromptTemplate如何获取实例
# 创建promptTemplate实例
# 参数中必须要指明: input_variables、template
template = PromptTemplate.from_template(
template="Tell me a joke about {topic}"
) + ",make it funny" + " nand in {language}"
# 使用模板生成提示词
prompt = template.format(topic="sports",language="spanish")
print(prompt)2.3 给变量赋值的两种方式: format()和invoke()
format(): 参数部分:给变量赋值; 返回值: str类型
invoke(): 参数部分:使用的是字典; 返回值: StringPromptValue类型 --- 推荐
import os
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
import dotenv
# 加载环境变量
dotenv.load_dotenv()
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
# 调用模型
chat_model = ChatOpenAI(
model="gpt-4o-mini"
)
# PromptTemplate的使用
# 1. PromptTemplate如何获取实例
# 创建promptTemplate实例
# 参数中必须要指明: input_variables、template
template = PromptTemplate.from_template(
template="请评价{product}的优缺点,包括{aspect1}和{aspect2}"
)
# 使用模板生成提示词
prompt = template.invoke(input={"product":"智能手机","aspect1":"电池续航","aspect2":"拍照质量"})
print(prompt.text)
print(type(prompt))2.4 结合大模型的使用
import os
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
import dotenv
# 加载环境变量
dotenv.load_dotenv()
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
## 结合大模型的使用
# 调用模型
chat_model = ChatOpenAI(
model="gpt-4o-mini"
)
# 生成提示词模板
template = PromptTemplate.from_template(
template="请评价{product}的优缺点,包括{aspect1}和{aspect2}"
)
prompt = template.invoke(input={"product": "智能手机","aspect1": "电池续航","aspect2": "拍照质量"})
# 调用大模型,将提示词传入
response = chat_model.invoke(prompt)
print(response)
print(type(response))9. 提示词模板之ChatPromptTemplate的使用
1.实例化的方式(两种方式: 使用构造方法、from_messages())
方式一: 使用构造方法
# 创建实例
chat_prompt_template = ChatPromptTemplate(
messages = [
("system","你是一个AI助手,你的名字叫{name}"),
("human","我的问题是{question}"),
],
# input_variables = ["name","question"]
)
response = chat_prompt_template.invoke(input={"name": "小智","question": "1 + 2 * 3 = ?"})
print(response)
print(type(response))方式二: 调用from_messages()
chat_prompt_template = ChatPromptTemplate.from_messages(
messages = [
("system","你是一个AI助手,你的名字叫{name}"),
("human","我的问题是{question}"),
],
# input_variables = ["name","question"]
)
response = chat_prompt_template.invoke(input={"name": "小智","question": "1 + 2 * 3 = ?"})
print(response)
print(type(response))2. 调用提示词模板的几种方法
invoke() \ format() \ format_message() \ format_prompt
invoke(): 传入的是字典,返回ChatPromptValue类型
chat_prompt_template = ChatPromptTemplate.from_messages(
messages = [
("system","你是一个AI助手,你的名字叫{name}"),
("human","我的问题是{question}"),
],
# input_variables = ["name","question"]
)
response = chat_prompt_template.invoke(input={"name": "小智","question": "1 + 2 * 3 = ?"})
print(response)
print(type(response))format(): 传入的是变量的值,返回str类型
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
import dotenv
# 加载配置文件
dotenv.load_dotenv()
# 调用大模型
chat = ChatOpenAI(
model="gpt-4o-mini",
)
chat_prompt_template = ChatPromptTemplate.from_messages(
messages = [
("system","你是一个AI助手,你的名字叫{name}"),
("human","我的问题是{question}"),
],
# input_variables = ["name","question"]
)
response = chat_prompt_template.format(name= "小智",question= "1 + 2 * 3 = ?")
print(response)
print(type(response))format_message(): 传入的是变量的值,返回消息构成的list
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
import dotenv
# 加载配置文件
dotenv.load_dotenv()
# 调用大模型
chat = ChatOpenAI(
model="gpt-4o-mini",
)
chat_prompt_template = ChatPromptTemplate.from_messages(
messages = [
("system","你是一个AI助手,你的名字叫{name}"),
("human","我的问题是{question}"),
],
# input_variables = ["name","question"]
)
response = chat_prompt_template.format_messages(name= "小智",question= "1 + 2 * 3 = ?")
print(response)
print(type(response))format_prompt(): 传入的是参数值,返回ChatPromptValue
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
import dotenv
# 加载配置文件
dotenv.load_dotenv()
# 调用大模型
chat = ChatOpenAI(
model="gpt-4o-mini",
)
chat_prompt_template = ChatPromptTemplate.from_messages(
messages = [
("system","你是一个AI助手,你的名字叫{name}"),
("human","我的问题是{question}"),
],
# input_variables = ["name","question"]
)
response = chat_prompt_template.format_prompt(name= "小智",question= "1 + 2 * 3 = ?")
print(response)
print(type(response))如何实现ChatPromptValue与List[messages]、字符串之间的转换
to_messages() 将ChaPromptTemplate转换为消息构成的list
to_string() 将ChatPromptTemplate转换为字符串
3. 更丰富的参数实例化类型
本质: 不管使用构造方法、还是使用from_message()来创建ChatPromptTemplate的实例,本质上来讲,传入的都是消息构成的列表
从调用上来讲,我们看到,构造方法还是使用from_message(),messages参数的类型都是列表,但是列表的元素的类型是多样的。可以是:
字符串类型、字典类型、消息类型、元组构成的列表(最常用、最基础、最简单)、提示词模板类型、消息提示词模板类型
- 举例1 元组构成的列表(最常用、最基础、最简单)
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
import dotenv
# 加载配置文件
dotenv.load_dotenv()
# 调用大模型
chat = ChatOpenAI(
model="gpt-4o-mini",
)
# 举例一
chat_prompt_template = ChatPromptTemplate.from_messages(
messages = [
("system","你是一个AI助手,你的名字叫{name}"),
("human","我的问题是{question}"),
],
# input_variables = ["name","question"]
)
response = chat_prompt_template.invoke({"name": "小智","question" :"1 + 2 * 3 = ?"})
print(response)
print(type(response))- 举例2 元组构成的列表(最常用、最基础、最简单)
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
import dotenv
# 加载配置文件
dotenv.load_dotenv()
# 调用大模型
chat = ChatOpenAI(
model="gpt-4o-mini",
)
# 举例一
chat_prompt_template = ChatPromptTemplate.from_messages(
messages = [
"human","我的问题是{question}"
],
# input_variables = ["name","question"]
)
response = chat_prompt_template.invoke({"question" :"1 + 2 * 3 = ?"})
print(response)
print(type(response))- 举例3: 字典类型
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
import dotenv
# 加载配置文件
dotenv.load_dotenv()
# 调用大模型
chat = ChatOpenAI(
model="gpt-4o-mini",
)
# 举例一
chat_prompt_template = ChatPromptTemplate.from_messages(
messages = [
{"role": "system","content": "我是一个人工智能助手,我的名字叫{name}"},
{"role": "human","content": "我的问题是{question}"}
],
# input_variables = ["name","question"]
)
response = chat_prompt_template.invoke({"name": "小智","question" :"1 + 2 * 3 = ?"})
print(response)
print(type(response))- 举例4: 消息类型
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
import dotenv
# 加载配置文件
dotenv.load_dotenv()
# 调用大模型
chat = ChatOpenAI(
model="gpt-4o-mini",
)
# 举例一
chat_prompt_template = ChatPromptTemplate.from_messages(
messages = [
SystemMessage(content="我是一个人工智能助手,我的名字叫{name}"),
HumanMessage(content="我的问题是{question}")
],
# input_variables = ["name","question"]
)
response = chat_prompt_template.invoke({"name": "小智","question" :"1 + 2 * 3 = ?"})
print(response)
print(type(response))- 举例5: chat提示词模板类型
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
import dotenv
# 加载配置文件
dotenv.load_dotenv()
# 调用大模型
chat = ChatOpenAI(
model="gpt-4o-mini",
)
# 举例一
nested_prompt_template = ChatPromptTemplate.from_messages([
('system','我是一个人工智能助手,我的名字叫{name}')
])
nested_prompt_template2 = ChatPromptTemplate.from_messages([
('human','很高兴认识你,我的问题是{question}')
])
chat_prompt_template = ChatPromptTemplate.from_messages(
messages = [
nested_prompt_template,
nested_prompt_template2
],
# input_variables = ["name","question"]
)
response = chat_prompt_template.invoke({"name": "小智","question" :"1 + 2 * 3 = ?"})
print(response)
print(type(response))- 举例6: 消息提示词模板类型
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
from langchain_openai import ChatOpenAI
import dotenv
# 加载配置文件
dotenv.load_dotenv()
# 调用大模型
chat = ChatOpenAI(
model="gpt-4o-mini",
)
# 举例一
system_template = '你是一个专家{role}'
system_message_prompt = SystemMessagePromptTemplate.from_template(system_template)
human_template = '给我解释{concept},用浅显易懂的语言'
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt_template = ChatPromptTemplate.from_messages(
messages = [
system_message_prompt,
human_message_prompt
],
# input_variables = ["name","question"]
)
response = chat_prompt_template.format_messages(role="物理学家",concept="相对论")
print(response)
print(type(response))4. 结合大模型
import os
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
import dotenv
# 加载环境变量
dotenv.load_dotenv()
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
chat_model = ChatOpenAI(
model="gpt-4o-mini",
)
chat_prompt_template = ChatPromptTemplate.from_messages([
('system','你是一个AI助手,你的名字叫{name}'),
('human','我的问题是{question}')
])
prompt = chat_prompt_template.invoke(input={"name":"小智","question": "1 + 2 * 3 = ?"})
print(prompt)
response = chat_model.invoke(prompt)
print(response)5. 插入消息列表 MessagesPlaceholder
当你不确定消息提示模板使用什么角色,或者希望在格式化过程中插入消息列表时,该怎么办?这就需要使用MessagesPlaceholder,负责在特定位置添加消息列表。
使用场景: 当ChatPromptTemplate模板中的消息类型和个数不确定的时候,我们就可以使用MessagePlaceholder。
举例1:
import os
from langchain_core.messages import HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI
import dotenv
# 加载环境变量
dotenv.load_dotenv()
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
chat_model = ChatOpenAI(
model="gpt-4o-mini",
)
chat_prompt_template = ChatPromptTemplate.from_messages([
('system','你是一个AI助手,你的名字叫{name}'),
MessagesPlaceholder(variable_name="msgs")
])
prompt = chat_prompt_template.invoke(input={"name":"小智","msgs": [HumanMessage(content="我的问题是: 1 + 2 * 3 = ?")]})
response = chat_model.invoke(prompt)
print(response)举例2:存储对话历史记录
import os
from langchain_core.messages import HumanMessage, AIMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI
import dotenv
# 加载环境变量
dotenv.load_dotenv()
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
chat_model = ChatOpenAI(
model="gpt-4o-mini",
)
chat_prompt_template = ChatPromptTemplate.from_messages([
('system','You are a helpful assistant'),
MessagesPlaceholder("history"),
('human',"我刚才的问题是什么?")
])
prompt = chat_prompt_template.format_messages(name="小智",history = [HumanMessage(content="我的问题是: 1 + 2 * 3 = ?"),AIMessage(content="1 + 2 * 3 = 7")])
response = chat_model.invoke(prompt)
print(response.content)10. 少量样本示例的提示词模板
在构建prompt时,可以通过构建一个少量示例列表去进一步格式化prompt,这是一种简单但强大的知道生成的方式,在某些情况下可以显著提高模型性能。
1. FewShotPromptTemplate的使用
import os
from langchain_core.messages import HumanMessage, AIMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI
import dotenv
# 加载环境变量
dotenv.load_dotenv()
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
chat_model = ChatOpenAI(
model="gpt-4o-mini",
temperature=0.4
)
res = chat_model.invoke("2 🐂 9是多少?")
print(res)11. Agent
1. Agent、AgentExecutor的创建
12. 文档加载器
- 不同的文档使用不同的文档加载器
txt: TextLoader
pdf: PyPDFLoader
csv: CSVLoader
json:JSONLoader
html: UnstructuredHTMLLoader
md: UnstructuredMarkdownLoader
文件目录: DirectoryLoader
1. 加载Txt文档
# 1.加载Txt文档
# 指明txt文档路径
file_path = './text.txt'
# 创建一个TextLoader的实例
text_loader = TextLoader(
file_path=file_path,
encoding='utf-8' # 此时使用的解码一定与当初编码的字符集相同
)
# 调用load(),返回一个List[Document]
document = text_loader.load()
print(document[0].page_content)2. 加载PDF文档
pip install PyPDF
pad_loader = PyPDFLoader(
file_path="https://wangyuxiang.vip/file/Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%E9%BB%84%E5%B1%B1%E7%89%88.pdf"
)
docs = pad_loader.load()
print(docs)
print(docs[0].metadata)
print(docs[1].page_content)2. 加载CSV文档
pad_loader = CSVLoader(
file_path= "./load/03-load.csv",
source_column="content"
)
docs = pad_loader.load()
# print(docs)
for doc in docs:
print(doc)