前言
通过前几篇文章的介绍,大家对于大模型以及大模型框架有了初步的了解。
这篇文章将带领大家构建一个聊天机器人智能体
一、编写代码
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.运行结果