当前位置: 首页 > news >正文

搭建智能客服机器人: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

相关文章:

  • 尝试给OpenHarmony4.0增加可以在动态库中使用的日志模块
  • 图像处理 -- ISP 之 tone mapping功能的实现原理
  • systemback制作Ubuntu自己的系统镜像
  • 观察者模式解析:实现对象间的舞蹈同步!
  • 怎么生成一个springboot的项目
  • Python中的random模块及相关模块详解
  • Application实际在云原生中的应用
  • 在ubuntu16.04下使用词典工具GoldenDict
  • thrift:拦截器ThriftEventHandler获取调用参数
  • SpringBoot项目启动后自动执行方法
  • 广州自闭症全托管学校-正规儿童康复中心
  • 利用深度学习技术来实现街景图像的语义分割(街景图像语义分割)
  • 基于WonderJourney生成电影级连续的3D场景视频
  • Java学习Day33:HTML 第四章:大战虎先锋(js)
  • 6个免费字体网站,无需担心版权问题~
  • 分享的文章《人生如棋》
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • extjs4学习之配置
  • IP路由与转发
  • JavaScript对象详解
  • Markdown 语法简单说明
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前嗅ForeSpider教程:创建模板
  • 巧用 TypeScript (一)
  • 实战|智能家居行业移动应用性能分析
  • 小程序测试方案初探
  • HanLP分词命名实体提取详解
  • ​ubuntu下安装kvm虚拟机
  • ​业务双活的数据切换思路设计(下)
  • #QT项目实战(天气预报)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • ***监测系统的构建(chkrootkit )
  • ***详解账号泄露:全球约1亿用户已泄露
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET成年了,然后呢?
  • .Net程序帮助文档制作
  • .NET分布式缓存Memcached从入门到实战
  • .Net环境下的缓存技术介绍
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @Builder用法
  • @RequestMapping-占位符映射
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @SuppressWarnings注解
  • @Transactional 详解
  • [ C++ ] 类和对象( 下 )
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现