Langchain-聊天机器人

聊天机器人需要 对话+上下文记忆

pip install langchain_community

初始化

导入库;创建模型;定义Prompt_template;构建chain

#MessagesPlaceholder (variable_name='my_msg') #占位,不限严格格式,此处用于传入历史记录

python 复制代码
import os

from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.messages import HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from langserve import add_routes

os.environ['http_proxy'] = '127.0.0.1:7890'
os.environ['https_proxy'] = '127.0.0.1:7890'

os.environ["LANGCHAIN_TRACING_V2"] = "true"
# 定义Langchain项目归属
os.environ["LANGCHAIN_PROJECT"] = "LangchainDemo"
os.environ["LANGCHAIN_API_KEY"] = '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'

# 聊天机器人案例
# 创建模型
model = ChatOpenAI(model='gpt-4-turbo')

# 定义提示模板
prompt_template = ChatPromptTemplate.from_messages([
    ('system', '你是一个乐于助人的助手。用{language}尽你所能回答所有问题。'),
    MessagesPlaceholder(variable_name='my_msg') #占位,不限严格格式,
])

# 得到链
chain = prompt_template | model

保存聊天历史

所有用户的聊天记录都保存到store{ key: sessionId,value: 历史聊天记录对象}

##**ChatMessageHistory()**保存历史聊天的

RunnableWithMessageHistory ,每次运行携带历史聊天记录,参数:chain、session_id、历史Message的Key(在Prompt_Template中定义)

python 复制代码
# 保存聊天的历史记录
store = {}  # 所有用户的聊天记录都保存到store。key: sessionId,value: 历史聊天记录对象


# 此函数预期将接收一个session_id并返回一个消息历史记录对象。
def get_session_history(session_id: str):
    if session_id not in store:
# from langchain_community.chat_message_histories import ChatMessageHistory
        store[session_id] = ChatMessageHistory()

    return store[session_id]

## from langchain_core.runnables import RunnableWithMessageHistory
do_message = RunnableWithMessageHistory(
    chain,
    get_session_history,
    input_messages_key='my_msg'  # 每次聊天时候发送msg的key
)

# 给当前会话定义一个sessionId
config = {'configurable': {'session_id': 'zs1234'}}  

多轮会话:

invoke 中要有 Message、包含sessionId的config

python 复制代码
# 第一轮
resp1 = do_message.invoke(
    {
        'my_msg': [HumanMessage(content='你好啊! 我是LaoXiao')],
        'language': '中文'
    },
    config=config
)

print(resp1.content)

# 第二轮
resp2 = do_message.invoke(
    {
        'my_msg': [HumanMessage(content='请问:我的名字是什么?')],
        'language': '中文'
    },
    config=config
)

print(resp2.content)

第三轮 流式输出:

RunnableWithMessageHistory.stream流式输出;就是逐个token输出。

因此!这里输出,就需要 for循环 .stream

python 复制代码
# 第3轮: 返回的数据是流式的
# 这里如果重新给config赋值,会清空原来旧的config历史
#config = {'configurable': {'session_id': 'lis2323'}}  # 给当前会话定义一个sessionId
for resp in do_message.stream(
    {
    'my_msg': [HumanMessage(content='请给我讲一个笑话?')]
    , 'language': 'English'},
    config=config):
    # 每一次resp都是一个token
    print(resp.content, end='-')
相关推荐
喵王叭32 分钟前
【大模型实战】向量数据库实战 - Chroma & Milvus
数据库·人工智能·langchain
码上Ai2 小时前
Langchain中的chain_type介绍
langchain
大志说编程4 小时前
LangChain框架入门09:什么是RAG?
人工智能·langchain
NocoBase5 小时前
GitHub 上 Star 数量前 20 的开源 AI 项目
langchain·开源·openai
都叫我大帅哥6 小时前
🧩 深入浅出LangChain RunnableLambda:让AI流水线像乐高一样好玩
python·langchain
王国强20091 天前
LangChain 设计原理分析⁷ | Agent 架构设计详解:决策循环与 ReAct
langchain
王国强20091 天前
LangChain 设计原理分析⁶ | Memory 系统设计:如何构建上下文感知的链
langchain
掘我的金1 天前
04_LangChain服务部署与链路监控
langchain