Skip to content

LangChain

langchain的官网: https://langchain.com

基于RAG架构的开发

背景:

  1. 大模型的知识冻结
  2. 大模型幻觉

何为RAG?

Retrieval Augmented Generation (RAG) 是一种结合了检索增强生成的技术,旨在提高大型语言模型(LLM)的准确性和可靠性。在这种架构中,大模型首先从外部知识库或文档中进行检索,然后根据检索到的信息来生成回答或完成特定任务。

alt text

基于Agent架构的开发

充分利用LLM的推理决策能力,通过增加规划、记忆和工具调用的能力,构造一个能够独立思考,逐步完成给定目标的智能体。

alt text 一个数学公式来表示:
Agent = LLM + Memory + Tools + Planning + Action

大模型应用开发的4个场景

场景1: 纯Prompt

Prompt是操作大模型的核心,通过精心设计的Prompt可以引导大模型完成各种任务。

场景3: RAG

这个在智能客服上用的最广泛

场景4: Fine-tuning(精调/微调)

举例: 努力学习考试内容,长期记住,活学活用

特点: 成本最高;在前面的方式解决不了问题的情况下,再使用

如何选择?

面对一个需求,如何开始,如何选择技术方案?下面是个常用的思路: alt text

LainChain的核心组件

如果要组织一个AI应用,开发者一般需要什么?

  1. 提示词模板的构建,不仅仅只包含用户输入。
  2. 模型调用与返回,参数设置,返回内容的格式化输出。
  3. 知识库查询,这里会包含文档加载,切割,以及转化为词嵌入(Embedding)向量
  4. 其他第三方工具调用,一般包含天气查询,Google搜索、一些自定义的接口能力调用。
  5. 记忆获取,每一个对话都有上下文,在开启对话之前总得获取到之前得上下文把

1. 对话模型 & 非对话模型

2. 通过配置文件调用大模型

方式一

python
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)

方式二

python
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. 关于对话模型嗲用消息列表

python
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组件来实现。

python

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()阻塞式调用

python
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()流式调用

python
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. 批量调用

python
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

方式一: 使用构造方法的方式

python
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)

方式二:

python
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 部分提示词模板的使用(重点)

方式一

python
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)

方式二

python

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 组合提示词的使用(了解)

python

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类型 --- 推荐

python
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 结合大模型的使用

python

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())

方式一: 使用构造方法

python
# 创建实例
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()

python
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类型

python
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类型

python
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

python
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

python
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. 举例1 元组构成的列表(最常用、最基础、最简单)
python
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))
  1. 举例2 元组构成的列表(最常用、最基础、最简单)
python
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))
  1. 举例3: 字典类型
python
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))
  1. 举例4: 消息类型
python
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))
  1. 举例5: chat提示词模板类型
python
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))
  1. 举例6: 消息提示词模板类型
python
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. 结合大模型

python
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:

python
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:存储对话历史记录

python

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的使用

python
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. 文档加载器

  1. 不同的文档使用不同的文档加载器
    txt: TextLoader
    pdf: PyPDFLoader
    csv: CSVLoader
    json:JSONLoader
    html: UnstructuredHTMLLoader
    md: UnstructuredMarkdownLoader
    文件目录: DirectoryLoader

1. 加载Txt文档

python
# 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

python
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文档

python

pad_loader = CSVLoader(
    file_path= "./load/03-load.csv",
    source_column="content"
)

docs = pad_loader.load()
# print(docs)

for doc in docs:
    print(doc)