LangChain-AI应用开发框架(七)

目录

一.核心组件(Components)

二.消息(Messages)

1.LLM消息结构

2.LangChain消息

2.1BaseMessage抽象消息类

2.2对话模式

3.缓存历史消息

3.1多轮对话

[3.2 内存缓存](#3.2 内存缓存)

4.管理历史消息

[4.1 上下文窗口](#4.1 上下文窗口)

[4.2 Token](#4.2 Token)

4.3消息裁剪

4.4基于消息数的修剪

[4.5 消息过滤](#4.5 消息过滤)

4.6消息合并


一.核心组件(Components)

二.消息(Messages)

1.LLM消息结构

2.LangChain消息

2.1BaseMessage抽象消息类

2.2对话模式

3.缓存历史消息

3.1多轮对话

cpp 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

# 定义大模型
model = ChatOpenAI(model="gpt-4o-mini")

# 第一次对话
result = model.invoke([HumanMessage(content="Hi! I'm Bob")])
result.pretty_print()

# 第二次对话
result = model.invoke([HumanMessage(content="What's my name?")])
result.pretty_print()
cpp 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessage
# 定义⼤模型 
model = ChatOpenAI(model="gpt-4o-mini")
# 记录消息 
messages = [
 HumanMessage(content="Hi! I'm Bob"),
 AIMessage(content="Hello Bob! How can I assist you today?"),
 HumanMessage(content="What's my name?"),
]
model.invoke(messages).pretty_print()

3.2 内存缓存

cpp 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessage
from langchain_core.chat_history import BaseChatMessageHistory, InMemoryChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

# 定义大模型
model = ChatOpenAI(model="gpt-4o-mini")

store = {}

# 接受一个 session_id 并返回一个消息历史对象。
# 这个 session_id 用于区分不同的对话,并应作为配置的一部分在调用新链时传入
def get_session_history(session_id: str) -> BaseChatMessageHistory:
    if session_id not in store:
        # InMemoryChatMessageHistory() 将消息存储在内存列表中。
        store[session_id] = InMemoryChatMessageHistory()
    return store[session_id]

# 包装 model,管理聊天消息历史记录
with_message_history = RunnableWithMessageHistory(model, get_session_history)
config = {"configurable": {"session_id": "1"}}

with_message_history.invoke(
    [HumanMessage(content="Hi! I'm Bob")],
    config=config,
).pretty_print()

with_message_history.invoke(
    [HumanMessage(content="What's my name?")],
    config=config,
).pretty_print()

4.管理历史消息

4.1 上下文窗口

4.2 Token

4.3消息裁剪

cpp 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage, trim_messages

# 定义大模型
model = ChatOpenAI(model="gpt-4o-mini")
# 历史消息记录
messages = [
    SystemMessage(content="you're a good assistant"),
    HumanMessage(content="hi! I'm bob"),
    AIMessage(content="hi!"),
    HumanMessage(content="I like vanilla ice cream"),
    AIMessage(content="nice"),
    HumanMessage(content="whats 2 + 2"),
    AIMessage(content="4"),
    HumanMessage(content="thanks"),
    AIMessage(content="no problem!"),
    HumanMessage(content="having fun?"),
    AIMessage(content="yes!"),
    HumanMessage(content="What's my name?"),
]

print(model.invoke(messages))
cpp 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage, trim_messages

# 定义大模型
model = ChatOpenAI(model="gpt-4o-mini")

# 历史消息记录
messages = [
    SystemMessage(content="you're a good assistant"),
    HumanMessage(content="hi! I'm bob"),
    AIMessage(content="hi!"),
    HumanMessage(content="I like vanilla ice cream"),
    AIMessage(content="nice"),
    HumanMessage(content="whats 2 + 2"),
    AIMessage(content="4"),
    HumanMessage(content="thanks"),
    AIMessage(content="no problem!"),
    HumanMessage(content="having fun?"),
    AIMessage(content="yes!"),
    HumanMessage(content="What's my name?"),
]

# 使用 trim_messages 减少发送给模型的消息数量
trimmer = trim_messages(
    max_tokens=65,                     # 修剪消息的最大令牌数,根据你想要的谈话长度来调整
    strategy="last",                    # 修剪策略:
                                        # "last" (默认):保留最后的消息。
                                        # "first":保留最早的消息。
    token_counter=model,                # 传入一个函数或一个语言模型(因为语言模型有消息令牌计数方法)
    include_system=True,                # 如果想始终保留初始系统消息,可以指定
    allow_partial=False,                # 是否允许拆分消息的内容
    start_on="human"                    # 如果需要确保我们的第一条消息(不包括系统消息)始终是特定类型,可以指定 start_on
)

chain = trimmer | model
print(chain.invoke(messages))

4.4基于消息数的修剪

cpp 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage, trim_messages

# 定义大模型
model = ChatOpenAI(model="gpt-4o-mini")

# 历史消息记录
messages = [
    SystemMessage(content="you're a good assistant"),
    HumanMessage(content="hi! I'm bob"),
    AIMessage(content="hi!"),
    HumanMessage(content="I like vanilla ice cream"),
    AIMessage(content="nice"),
    HumanMessage(content="whats 2 + 2"),
    AIMessage(content="4"),
    HumanMessage(content="thanks"),
    AIMessage(content="no problem!"),
    HumanMessage(content="having fun?"),
    AIMessage(content="yes!"),
    HumanMessage(content="What's my name?"),
]

# 使用 trim_messages 减少发送给模型的消息数量
trimmer = trim_messages(
    max_tokens=11,          # 最大消息数
    strategy="last",        # 修剪策略:
                            # "last"(默认):保留最后的消息。可获取消息列表中的最后一个 max_tokens
                            # "first":保留最早的消息。
    token_counter=len,      # 根据消息数裁剪
    include_system=True,    # 如果想始终保留初始系统消息,可以指定
    allow_partial=False,    # 是否允许拆分消息的内容
    start_on="human",       # 如果需要确保我们的第一条消息(不包括系统消息)始终是特定类型,可以指定 start_on
)

print(trimmer.invoke(messages))

4.5 消息过滤

python 复制代码
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage, 
filter_messages
# 历史消息记录 
messages = [
 SystemMessage("你是⼀个聊天助⼿", id="1"),
 HumanMessage("⽰例输⼊", id="2"),
 AIMessage("⽰例输出", id="3"),
 HumanMessage("真实输⼊", id="4"),
 AIMessage("真实输出", id="5"),
]

4.6消息合并

python 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage, merge_message_runs

# 定义大模型
model = ChatOpenAI(model="gpt-4o-mini")

# 历史消息记录
messages = [
    SystemMessage("你是一个聊天助手。"),
    SystemMessage("你总是以笑话回应。"),
    HumanMessage("为什么要使用 LangChain?"),
    HumanMessage("为什么要使用 LangGraph?"),
    AIMessage("因为当你试图让你的代码更有条理时,LangGraph 会让你感到"节点"是个好主意!"),
    AIMessage("不过别担心,它不会"分散"你的注意力!"),
    HumanMessage("选择LangChain还是LangGraph?"),
]

merged = merge_message_runs(messages)
# 打印合并后的每个消息
print("\n".join([repr(x) for x in merged]))
相关推荐
冬奇Lab13 分钟前
Workflow 系列(06):安全——跨步骤注入传播与四层防御
人工智能·工作流引擎
冬奇Lab18 分钟前
每日一个开源项目(第149篇):RAG-Anything - 把图片、表格、公式当成一等公民的多模态 RAG 框架
人工智能·开源
米小虾37 分钟前
AI Agent 安全实战指南:当智能体开始"不听话",开发者该如何应对?
人工智能·安全·agent
IT_陈寒2 小时前
Vite的热更新突然不香了,排查三小时差点砸键盘
前端·人工智能·后端
用户8356290780513 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户8356290780514 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
阿里云大数据AI技术4 小时前
构建高转化海外电商搜索:阿里云OpenSearch行业算法版的全链路智能优化策略实战
人工智能·搜索引擎
Awu12274 小时前
⚡从零开发 Agent CLI(五)实现一个可治理、可扩展的工具系统
前端·人工智能·claude
字节跳动视频云技术团队4 小时前
让 Agent 成为音视频工作台:AI MediaKit CLI + Skill 发布
人工智能·音视频开发