【Langchain学习笔记(三)】基于 DeepSeek 构建聊天机器人

基于 DeepSeek 构建聊天机器人

前言

本文主要介绍如何基于 DeepSeek 来创建一个聊天机器人。首先介绍 PromptTemplate 提示模版t,它作为设计对话流的基础,能够极大提升用户体验。接着,深入 DeepSeek 环境准备及模型创建过程,包括获取API、创建和配置 API Key、设置 base_url 以及选择合适的模型等步骤。基于 Langchain 框架,将介绍如何通过 MessagesPlaceholder 处理复杂的多轮对话,构建 Chain 保存对话历史,并了解 RunnableWithMessageHistory 对象的实现流式输出,并通过示例代码演示整个流程的实际运行效果。

备注:本系列文章基于B站课程: 马士兵-AI大模型全套教程(学习路线+LLM大语言模型+RAG实战+Langchain+ChatGLM-4+Transformer+DeepSeek) 学习整理得到。

1、使用 PromptTemplate 提示模板

Langchain 给我们提供了一个提示词模板 ChatPromptTemplate,它用来帮助我们去构建提示词。可以先简单的理解为 python 的字符串拼接的模板

定义提示模版:

from langchain_core.prompts import ChatPromptTemplate

prompt_template = ChatPromptTemplate.from_messages(
    [("system", '请将以下的内容翻译成{language}'), ("user", "{text}")]
)

完整使用代码及运行结果:

import os
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

os.environ["OPENAI_API_KEY"] = "DEEPSEEK_API_KEY"
# 1、创建模型
model = ChatOpenAI(
    model='deepseek-chat',
    base_url="https://api.deepseek.com/v1"
)

# 2、定义提示模版
prompt_template = ChatPromptTemplate.from_messages(
    [("system", '请将以下的内容翻译成{language}'), ("user", "{text}")]
)
# 3、创建返回的数据解析器
parser = StrOutputParser()

# 4、创建链chain
chain = prompt_template | model | parser

# 5、直接使用chain进行调用
result = chain.invoke({"language": "English", "text": '我下午还有一节课,不能去打球了'})
print(result)

在这里插入图片描述

2、DeepSeek 环境准备及模型创建

2.1 获取 API

访问 DeepSeek 开放平台
在这里插入图片描述

2.2 创建 API Key

在左侧点击 API Keys,然后创建 API Key
在这里插入图片描述

2.3 配置 API KEY

os.environ["OPENAI_API_KEY"] = "your_key"

就是在上一步中创建的 Key

2.4 配置 base_url

model = ChatOpenAI(
    base_url="https://api.deepseek.com"
)

代理地址或中转地址,一律填写 "https://api.deepseek.com"
注意:出于与 OpenAi 兼容考虑,也可以将 base_url 设置为 "https://api.deepseek.com/v1";也就是说上一个用不了再试试这个。

2.5 配置 model

model = ChatOpenAI(
    model='deepseek-reasoner',
    base_url="https://api.deepseek.com/v1"
)

deepseek-reasoner 是 DeepSeek 最新推出的推理模型 DeepSeek-R1。通过指定 model='deepseek-reasoner' ,即可调用 DeepSeek-R1。
注意:通过指定 model='deepseek-chat' ,即可调用 DeepSeek-V3。

3、Langchain 构建聊天机器人

这个聊天机器人能够进行对话并记住之前的互动
需要安装:pip install langchain_community

  • Chat History:允许聊天机器人“记住”过去的互动,并在回应后续问题时考虑它们;
  • 流式输出

3.1 引入 MessagesPlaceholder 来处理多轮对话

  • MessagesPlaceholder:用于在 Prompt 中插入历史消息,支持多轮对话;
  • 动态的系统消息可以通过 {} 进行参数化。
# 定义提示模版
prompt_template = ChatPromptTemplate.from_messages([
    ('system', '你是一个乐于助人的助手。用{language}尽你所能回答所有问题。'),
    MessagesPlaceholder(variable_name='my_msg')
])

3.2 构建 Chain 和保存对话历史

LangChain 提供了 RunnableWithMessageHistoryChatMessageHistory 来支持多轮对话,并保存对话的历史记录。

  • ChatMessageHistory:用于保存和管理对话历史;
  • RunnableWithMessageHistory:将 Chain 和对话历史管理器结合,支持多轮对话。
store = {}  # 所有用户的聊天记录都保存到store。key:session_id,value:历史聊天记录

# 此函数预期将接受一个session_id,并返回与该session_id对应的聊天记录
def get_session_history(session_id: str):
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    return store[session_id]
do_message = RunnableWithMessageHistory(
    chain,
    get_session_history,
    input_messages_key='my_msg'  # 每次聊天时候发送msg的key
)

3.3 调用 RunnableWithMessageHistory 对象的 invoke() 方法

  • 每次调用 do_message.invoke() 时,都会根据当前会话的 sessionId 获取或创建对应的对话历史;
  • HumanMessage:表示用户发送的消息,是对话的一部分。
config = {'configurable': {'session_id': 'ls1234'}}  # 给当前会话定义一个sessionId

# 第一轮对话
resp1 = do_message.invoke(
    {
        'my_msg': [HumanMessage(content='你好啊! 我是孙悟空')],
        'language': '中文'
    },
    config=config
)
print(resp1.content)

# 第二轮对话
resp2 = do_message.invoke(
    {
        'my_msg': [HumanMessage(content='请问:我有其它的昵称吗')],
        'language': '中文'
    },
    config=config
)
print(resp2.content)

3.4 流式输出

LangChain 还支持流式响应,这对于处理长文本或实时交互非常有用;
调用 RunnableWithMessageHistory 对象的 stream() 方法,以流的形式返回响应,每次返回一个 token,适合实时显示响应内容。

# 第三轮对话 返回的数据是流式的
config = {'configurable': {'session_id': 'lishi987'}}  # 给当前会话定义一个sessionId
for resp in do_message.stream(
        {'my_msg': [HumanMessage(content='81难后,我该成仙还是成佛? 或者入魔?')],
         'language': '中文'},
        config=config):
    # 每一次resp都是一个token
    print(resp.content, end='-')

3.5 示例代码及运行效果

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

os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"
# 1、创建模型
model = ChatOpenAI(
    model='deepseek-chat',
    base_url="https://api.deepseek.com/v1"
)


# 2、 定义提示模版,引入MessagesPlaceholder来处理多轮对话
prompt_template = ChatPromptTemplate.from_messages([
    ('system', '你是一个乐于助人的助手。用{language}尽你所能回答所有问题。'),
    MessagesPlaceholder(variable_name='my_msg')
])

# 3、创建链chain
chain = prompt_template | model


# 4、定义函数保存和管理对话历史
store = {}  # 所有用户的聊天记录都保存到store。key:session_id,value:历史聊天记录

# 此函数预期将接受一个session_id,并返回与该session_id对应的聊天记录
def get_session_history(session_id: str):
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    return store[session_id]
    
# 5、将Chain和对话历史管理器对象结合
do_message = RunnableWithMessageHistory(
    chain,
    get_session_history,
    input_messages_key='my_msg'  # 每次聊天时候发送msg的key
)

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

# 6、调用对话历史管理器对象的invoke()及stream()方法,进行对话
# 第一轮对话
resp1 = do_message.invoke(
    {
        'my_msg': [HumanMessage(content='你好啊! 我是孙悟空')],
        'language': '中文'
    },
    config=config
)
print(resp1.content)

# 第二轮对话
resp2 = do_message.invoke(
    {
        'my_msg': [HumanMessage(content='请问:我有其它的昵称吗')],
        'language': '中文'
    },
    config=config
)
print(resp2.content)
# 第三轮对话 返回的数据是流式的
config = {'configurable': {'session_id': 'lishi987'}}  # 给当前会话定义一个sessionId
for resp in do_message.stream(
        {'my_msg': [HumanMessage(content='81难后,我该成仙还是成佛? 或者入魔?')],
         'language': '中文'},
        config=config):
    # 每一次resp都是一个token
    print(resp.content, end='-')

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

禾戊之昂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值