Python开发AI智能体(五)———构建聊天机器人智能体

前言

通过前几篇文章的介绍,大家对于大模型以及大模型框架有了初步的了解。

这篇文章将带领大家构建一个聊天机器人智能体


一、编写代码

1.大模型调用部分

#调用AI检测平台(LangSmith)
import os
import sys

#开启检测开关
os.environ["LANGCHAIN_TRACING_V2"] = 'true'
#调用检测平台API
os.environ["LANGCHAIN_API_KEY"] = 'xxxxxxxxxxxxx'
#创建检测项目名称
os.environ["LANGCHAIN_PROJECT"] = '智谱AI聊天机器人'
#调用智谱AI API
os.environ['ZHIPUAI_API_KEY'] = 'xxxxxxxxxxxx'

#调用第三方库
from langchain_community.chat_models import  ChatZhipuAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.output_parsers import StrOutputParser
from langchain_community.chat_message_histories import ChatMessageHistory
#调用大预言模型
model = ChatZhipuAI(model_name='glm-4-flash')
#创建返回的数据解析器
parser = StrOutputParser()
#定义提示模板
prompt_template = ChatPromptTemplate.from_messages([
    ('system','你是一个聊天机器人的助手。用{language}尽你所能回答所有问题'),
    MessagesPlaceholder(variable_name='my_msg')

])

# 得到链
chain = prompt_template | model

 通过观察上述代码发现,相比于之前的大模型调用,我们这里多出来一行代码

MessagesPlaceholder(variable_name='my_msg')
  • MessagesPlaceholder():在构建多轮对话系统时,可以使用MessagesPlaceholder来插入之前的对话历史,以便模型在生成响应时能够参考这些上下文信息。
  • variable_name:每次聊天插入的key

作为一个合格的聊天机器人智能体,必须需要有记忆功能。简单来说就是当我第一轮提出一个问题“我叫张三”大模型给出回答后,第二轮提出问题“我叫什么”的时候,大模型就可以根据上下文的聊天记录识别出你叫张三,从而给出你叫张三的答案。

2.保存聊天历史

from langchain_core.runnables import RunnableWithMessageHistory
store = {}
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' 
  • store = {}:所有用户的聊天记录都保存到store里面 key:sessionID value:历史聊天记录对象
  • get_session_history()函数:此函数预期将接受一个session_id并返回一个消息历史记录对象
  • RunnableWithMessageHistory():允许我们为某些类型的链添加消息历史。它包装另一个可运行对象,并管理其聊天消息历史。具体来说,它在将之前的消息传递给可运行对象之前加载对话中的先前消息,并在调用可运行对象后将生成的响应保存为消息。该类还通过使用 session_id 保存每个对话来支持多个对话 - 然后在调用可运行对象时期望在配置中传递 session_id,并使用它查找相关的对话历史。
  • input_messages_key:每次聊天时候发送msg的key

3.提问与回答

from langchain_core.messages import HumanMessage
def run():
  user = input('请输入你的问题')
  content = '"'+user+'"'
  for resp in do_message.stream(
          {
              'my_msg': [HumanMessage(content=content)],
              'language': '中文'

          },
          config={
              'configurable': {'session_id': '张123'}
          }
  ):
      print(resp.content,end='')
  num = int(input('是否结束对话  1.继续对话  2.结束对话'))
  if num == 1:
      run()
  else:
      sys.exit()

由于我们这里要采用流式输出的方式所以使用了for循环并且用了stream流式处理

  • my_msg:提出的问题
  • languange:限定语言
  • configurable:每次对话时发送的session_id

4.运行

if __name__ == "__main__":
    print('---------------------------------------------------------------')
    print('欢迎进入智能体1.0版本')
    run()

5.完整代码

#调用AI检测平台(LangSmith)
import os
import sys

#开启检测开关
os.environ["LANGCHAIN_TRACING_V2"] = 'true'
#调用检测平台API
os.environ["LANGCHAIN_API_KEY"] = 'XXXXXX'
#创建检测项目名称
os.environ["LANGCHAIN_PROJECT"] = '智谱AI聊天机器人'
#调用智谱AI API
os.environ['ZHIPUAI_API_KEY'] = 'xxxxxxxxxxxxx'

#调用第三方库
from langchain_core.messages import HumanMessage
from langchain_core.runnables import RunnableWithMessageHistory
from langchain_community.chat_models import  ChatZhipuAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.output_parsers import StrOutputParser
from langchain_community.chat_message_histories import ChatMessageHistory
#调用大预言模型
model = ChatZhipuAI(model_name='glm-4-flash')
#创建返回的数据解析器
parser = StrOutputParser()
#定义提示模板
prompt_template = ChatPromptTemplate.from_messages([
    ('system','你是一个聊天机器人的助手。用{language}尽你所能回答所有问题'),
    MessagesPlaceholder(variable_name='my_msg')

])

# 得到链
chain = prompt_template | model


store = {}  
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' 
)


def run():
  user = input('请输入你的问题')
  content = '"'+user+'"'
  for resp in do_message.stream(
          {
              'my_msg': [HumanMessage(content=content)],
              'language': '中文'

          },
          config={
              'configurable': {'session_id': '张123'}
          }
  ):
      print(resp.content,end='')
  num = int(input('是否结束对话  1.继续对话  2.结束对话'))
  if num == 1:
      run()
  else:
      sys.exit()

if __name__ == "__main__":
    print('---------------------------------------------------------------')
    print('欢迎进入智能体1.0版本')
    run()

6.运行结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

【本人】

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

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

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

打赏作者

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

抵扣说明:

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

余额充值