搭建智能客服机器人:langgraph实现用户订单管理

image.png

大家好,今天我们将创建一个智能客服机器人,它能够记录用户的食物订单到真实数据库中,并允许用户查看他们的订单。这是一个相对高级的Langgraph项目,大家可以先看一下前面介绍的Langgraph的基础课程。

项目概述

我们要构建的系统是一个模拟登录的用户,可以创建订单或查看订单,其他功能则被屏蔽。首先我们会用一个虚拟令牌设置用户,并通过系统消息给机器人一个身份。然后我们会分类处理用户的意图:

  1. 离题意图:完全屏蔽。

  2. 获取所有订单:查询数据库,按用户过滤并返回订单。

  3. 创建订单:首先验证请求,缺失信息则提示用户补充。如果信息完整,将时间格式化为有效的时间戳,然后创建订单并写入数据库,最后给用户一个友好的响应。

这整个过程分步骤进行,下面我们详细介绍实现过程。

数据库设置

由于我们使用真实数据库,第一步是设置数据库。需要Docker支持。我们使用docker-compose文件设置一个PostgreSQL数据库,并在5433端口运行。运行docker-compose up命令启动数据库,可以通过docker ps确认数据库是否运行。

用户和产品表

我们用SQLAlchemy创建用户和订单表。首先加载API密钥,并安装SQLAlchemy:

pip install SQLAlchemy

我们创建一个基础类Base,并继承自declarative_base,然后创建用户表、订单表和食物项表。用户表和订单表通过关系关联。我们在食物项表中提供一些示例食物,如比萨等等。

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmakerBase = declarative_base()class Customer(Base):__tablename__ = 'customers'id = Column(Integer, primary_key=True)name = Column(String)orders = relationship("Order", back_populates="customer")class Order(Base):__tablename__ = 'orders'id = Column(Integer, primary_key=True)customer_id = Column(Integer, ForeignKey('customers.id'))food_item_id = Column(Integer, ForeignKey('food_items.id'))delivery_address = Column(String)order_date = Column(String)customer = relationship("Customer", back_populates="orders")food_item = relationship("FoodItem")class FoodItem(Base):__tablename__ = 'food_items'id = Column(Integer, primary_key=True)name = Column(String)

创建表后,我们插入一个示例用户和一些食物项。

engine = create_engine('postgresql+psycopg2://user:password@localhost:5433/mydatabase')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()# 创建示例用户和食物项
new_customer = Customer(name="John")
session.add(new_customer)
session.commit()pizza = FoodItem(name="Pizza")
salami = FoodItem(name="Salami")
session.add_all([pizza, salami])
session.commit()
代理状态和验证逻辑

为了在节点间传递数据,我们需要一个代理状态AgentState。这个状态包含用户问题、系统消息、用户消息、客户名、工具调用、生成的最终输出等信息。我们通过一系列函数对用户请求进行检查和处理。

class AgentState:def __init__(self):self.question = ""self.messages = []self.customer_name = ""self.tool_calls = []self.order_check = ""self.generation = ""self.system_message = ""

验证用户请求的示例如下:

def validate_order(question):# 假设这是一个调用LLM的函数,返回验证结果if "food items" not in question or "delivery address" not in question or "order date" not in question:return Falsereturn True
工具调用和函数

我们需要一些工具函数来处理数据库查询和订单创建。使用LangChain框架中的工具装饰器来定义这些函数。

@tool
def create_order(customer_name, food_items, delivery_address, order_date):session = Session()customer = session.query(Customer).filter_by(name=customer_name).first()if not customer:return "Customer not found"food_item = session.query(FoodItem).filter_by(name=food_items).first()if not food_item:return "Food item not found"new_order = Order(customer_id=customer.id, food_item_id=food_item.id, delivery_address=delivery_address, order_date=order_date)session.add(new_order)session.commit()return "Order placed successfully"@tool
def get_all_orders(customer_name):session = Session()customer = session.query(Customer).filter_by(name=customer_name).first()if not customer:return "Customer not found"orders = session.query(Order).filter_by(customer_id=customer.id).all()if not orders:return "No orders found"return [{"order_id": order.id, "food_item": order.food_item.name, "delivery_address": order.delivery_address, "order_date": order.order_date} for order in orders]
系统消息和用户消息

接下来我们需要创建系统消息和用户消息,并通过LangChain框架绑定工具。

system_message = "You are an order bot. You can help users create and view food orders."def create_human_message(question):return {"role": "user", "content": question}def create_system_message():return {"role": "system", "content": system_message}
意图识别和路由

通过LangChain框架,我们可以识别用户意图,并根据意图进行相应的处理。

def identify_intent(question):if "order" in question:return "create_order"elif "view" in question or "see" in question:return "get_all_orders"else:return "off_topic"def route_intent(intent, state):if intent == "off_topic":return "I can only help you with creating or viewing orders."elif intent == "create_order":if validate_order(state.question):return create_order(state.customer_name, state.order_check["food_items"], state.order_check["delivery_address"], state.order_check["order_date"])else:return "Your order information is incomplete."elif intent == "get_all_orders":return get_all_orders(state.customer_name)
生成最终消息

最后一步是生成最终消息,告知用户订单创建的结果或显示用户的所有订单。

def generate_final_message(state):if state.intent == "create_order":if validate_order(state.question):return create_order(state.customer_name, state.order_check["food_items"], state.order_check["delivery_address"], state.order_check["order_date"])else:return "Your order information is incomplete."elif state.intent == "get_all_orders":return get_all_orders(state.customer_name)else:return "I can only help you with creating or viewing orders."
测试与运行

我们可以通过一系列测试来验证系统的功能是否正常。

state = AgentState()
state.customer_name = "John"
state.question = "我需要预定一个披萨,地址是北京路123号4栋506,时间为明天上午10点"# 更新系统消息和用户消息
state.messages.append(create_system_message())
state.messages.append(create_human_message(state.question))# 识别意图并路由
state.intent = identify_intent(state.question)
response = route_intent(state.intent, state)
print(response)

通过以上步骤,我们成功创建了一个智能客服机器人,它能够处理用户的食物订单请求并返回相应的结果。这是一个复杂而强大的系统,展示了现代科技在客户服务领域的巨大潜力。

关注我,每天带你开发一个AI应用,每周二四六直播,欢迎多多交流。

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/407986.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysqldump + python 定时备份数据库

场景: 需要对mysql进行定时备份,受限于硬盘空间的大小,需要对备份的数据需要定时清理 python代码实现: # -*- coding:UTF-8 -*- """ProjectName : HotelGo2DelonixPmxFileName : fix_missing_ratesDescripti…

《通义千问AI落地—下》:WebSocket详解

一、前言 文本源自 微博客 且已获授权,请尊重版权。 《通义千问AI落地——下篇》如约而至。Websocket在这一类引用中,起到前后端通信的作用。因此,本文将介绍websocket在这类应用场景下的配置、使用、注意事项以及ws连接升级为wss连接等;如下图,本站已经使用了wss连接…

python实用教程(一):安装配置anaconda(Win10)

下一篇:python实用教程(二):安装配置Pycharm及使用(Win10)-CSDN博客 1、简介及下载 Anaconda 是一个开源的 Python 和 R 语言的发行版,专为科学计算、数据分析、机器学习和大数据处理而设计。它包含了众多常用的数据…

【Python】列表和元组

文章目录 概念创建列表访问下标通过下标来修改列表元素获取列表长度下标可以写成负数 切片操作省略后边界省略前边界省略前后边界带有步长的切片 遍历列表元素使用 for 循环使用 for 循环访问下标的方式使用 while 循环 新增元素在末尾新增在任意位置新增 查找元素判定元素是否…

Python酷库之旅-第三方库Pandas(096)

目录 一、用法精讲 411、pandas.DataFrame.values属性 411-1、语法 411-2、参数 411-3、功能 411-4、返回值 411-5、说明 411-6、用法 411-6-1、数据准备 411-6-2、代码示例 411-6-3、结果输出 412、pandas.DataFrame.axes属性 412-1、语法 412-2、参数 412-3、…

背包问题【算法 07】

背包问题 背包问题是经典的计算机科学问题之一,涉及到如何在有限资源的约束下,选择最优的物品组合,以最大化收益。这个问题在现实中有广泛的应用,例如资源分配、物流调度和投资组合优化等。本文将详细介绍背包问题的定义、解决方法…

iphone问题笔记

拼音打字显示一些不相干的词 原因:开启了自动改正,傻逼iphone总以为你打错了。 计算器没有退格键? 解决方法:按住数字往右滑是退格。 关机重启必须去设置里? 连按五次锁屏可以选择关机。

如何选择适合自己的开放式耳机?五款实力出众爆款安利!

开放式耳机以其不侵入耳道的设计,为耳朵提供了更轻的负担,同时保护了耳道健康,这与传统的头戴式或入耳式耳机相比,在长时间佩戴时更能减少不适感。市场上的开放式耳机种类繁多,要找到一款真正满意的产品可能有些困难。…

文件—python

一、文件编码 对于同一份文件,人的视角和计算机的视角是不相同的,人看到的是文字,计算机看到的0和1组成的编码。因为计算机只能识别0和1,无法直接识别文字,那我们是如何在电脑上看到文字的呢? 计算机按照一…

【逐行注释】MATLAB下的IMM-EKF代码

IMM-EKF 基于EKF的多模型交互。以CV和CT两个模型进行交互,这里对代码进行逐行注释。 注释较多,个人理解的时候如果有误,欢迎指正。 每一行都有注释: 模型概况 二维平面上的运动模型,由CV和CT构成,基于…

C++:vector篇

前言: 本篇仅介绍vector中常用的函数接口,如果需要详细的请到官网查看。 vector是一种动态数组,能够自动调整大小。与数组类似,vector使用连续内存来存储元素,允许高效访问,但可以动态增加容量。为了应对容…

达梦数据库的系统视图v$tablespace

达梦数据库的系统视图v$tablespace 在达梦数据库(DM Database)中,V$TABLESPACE 提供了有关数据库中的表空间(Tablespace)信息。这些信息对于管理数据库存储和优化性能非常关键。表空间是数据库逻辑存储结构的一个层次…

12、stm32通过dht11读取温湿度

一、配置 二、代码 dht11.c /** dht11.c** Created on: Aug 19, 2024* Author: Administrator*/#include "main.h" #include "tim.h" #include "usart.h" #include "gpio.h" /**TIM3定时器实现us级延时*/ void Delay_us(uint16…

Midjourney提示词-动物系列-65

A super cute little anthropomorphic,sheep of the Chinese Zodiac, wearing berets ,in a Hanfu in red style,standing, eyes,cute tail,super realistic,super detail,luxurious,elegant,Unreal Engine,octane render, 8K,VRAY super realistic Pixar Style, Tiny cute…

[matlab]MATLAB实现MLP多层感知机minist手写识别预测

【测试环境】 matlab2023a 【源码文件截图】 【实现部分代码】 mlp_test.m %% MLP 2-layer to test XOR clear; clc;Mode MNIST %Mode XORif (strcmp(Mode,MNIST))% Load the digits into workspace (MNIST Test, from% http://yann.lecun.com/exdb/mnist/)num_train 100…

为什么要构建自己的 AI 代理库

上个月,我开始深入研究 AI 代理的世界。在探索这个领域时,我突然有了灵感:从现在开始我要研究 AI 代理。 最近,我一直在思考第二点。既然有很多可用的选项,为什么还要开发自己的 AI 代理库呢? 经过一番思…

SCI论文系统各阶段状态含义,一文带你全面掌握!告别投稿小白!

知识小站 SCI(Science Citation Index,科学引文索引)是由美国科学信息研究所(Institute for Scientific Information, ISI)创建的一个引文数据库。它收录了全球各学科领域中最具影响力的学术期刊,涵盖自然…

PyTorch深度学习模型训练流程的python实现:回归

回归的流程与分类基本一致,只需要把评估指标改动一下就行。回归输出的是损失曲线、R^2曲线、训练集预测值与真实值折线图、测试集预测值散点图与真实值折线图。输出效果如下: 注意:预测值与真实值图像处理为按真实值排序,图中呈现…

OCR识别行驶证(阿里云和百度云)

OCR识别行驶证(阿里云和百度云) 一、使用场景 1、通过识别行驶证,获取相关汽车信息,替代手输 二、效果图 三、代码部分: 1、阿里云OCR 1.1、控制层 PostMapping("/ocrCard") public JSONObject ocrCard(RequestPart("fi…

快速入门:使用Python构建学生成绩管理应用

前言 诸位观众,本学期我有幸学习了Python编程课程。随着课程的结束,授课教师布置了一项任务,要求我们开发一个学生信息管理系统。基于老师的要求,我个人独立完成了这项任务。今天,我希望将这个简易的程序分享给大家&a…