《从0到1打造企业级AI售前机器人——实战指南五:处理用户意图的细节实现!》

欢迎大家来到企业级AI售前机器人实战系列文章: 从0到1完成一个企业级AI售前机器人的实战指南。

本篇是该系列的第五篇,核心内容是:针对用户的不同意图编写逻辑细节实现

上一篇我们实现了用户的意图分析,确定了针对不同的意图执行不同的工作流,本篇我们开始填充每个意图中的具体执行逻辑。

关于我

我是一个十年老程序员、React Contributor,三年前转型至AI在应用层的设计与落地。

目前转型成功,并担任多个AI项目负责人,已经完成了多款智能问答产品的上线、以及TOB产品的功能AI化升级。

本专栏将会基于我过去几年的经验,对各类AI应用落地的方案和思路积累了很多踩坑和迭代经验,进行全方位的AI产品的核心流程拆解!

我相信AI在未来将会是基础设施,而对于普通人而言,基础设施的机会不在基础设施本身,在应用层谋求发展可能是一个不错的出路。

加油!共勉!

回归正题:

路由实现细节

在整个流程中,我们要先用AI来识别用户当前是什么意图,然后根据AI的识别来决定使用哪个意图的逻辑,对应到流程图中的query进入后的第一部分:

意图分析

意图分析对我们来说就是使用提示词对用户的问题进行分析,然后获得要用哪个意图路由来解决这个问题:

容易踩坑的点:我们要尽量让提示词输出的响应简短,这样做能够让我们尽可能的在整个流程中节约时间。

比如这里我们会让大模型仅输出一个数字作为code。最终代码如下:

意图分析提示词:src/prompts/index.js

js 复制代码
export const analyse_prompt = ({ query, history }) => `
## 要求

根据用户的问题,分析用户在当前场景下最后一句话的内容符合以下哪种意图:
**1. 谈合同**
  预期场景:用户表达了非常强的购买意向
  示例问题:X产品怎么购买?、购买产品要签订什么协议?
  响应方式:此时需要具体分析用户的意图,进行下单链接的推荐或者合同、协议的推送

**2. 留资**
  预期场景:用户表达了需要换个方式沟通,或者对话过程中AI认为需要用户进行留资。
  示例问题:电话联系吧、微信聊可以么?
  响应方式: 此时需要存储用户的信息 + 与访客约定回访时间。

**3. 需要产品推荐**
  预期场景:用户需要我们为其推荐一些产品。
  示例问题:你们有适合XX场景的产品么?
  响应方式:此时需要给用户进行产品推荐(必要时,需要先反问收集必要信息,然后才进行产品推荐)

**4. 咨询某产品细节**
  预期场景:用户针对某产品细节进行沟通询问
  示例问题:套餐A和B的区别?、某产品可以做到XX事么?
  响应方式:根据对应的相关资料进行回复。没有资料时,将会触发留资场景。

**5. 需要产品介绍**
  预期场景:用户需要我们介绍产品信息
  示例问题:某产品怎么样?、某产品能做到XX么?
  响应方式: 对产品的基本信息、能力、规格、价格、套餐、活动价、案例等进行介绍

**6. 询问其他场景**
  预期场景:与售前无关,但是与企业内其他工作(售后、客户经理)相关的query
  示例问题:系统始终无法正确运行,怎么办?
  响应方式:针对不同场景进行个性化推荐

**7. 闲聊**
  预期场景:闲聊
  示例问题:你好、你是谁
  响应方式:保持售前人设的同时进行简单的回复,避免回复不必要的问题。


## 对话历史
${history.join('\n')}
{ "role": "user", "content": ${query}}

## 输出
只输出1-7之间的数字,不要输出分析过程。

`

意图分析函数

js 复制代码
import { analyse_prompt } from './prompts/index.js'

async function handleAction({ query, history }) {
  let result = await chatModel({
    message: [
      { role: 'user', content: analyse_prompt({ query, history }) },
    ],
    model: Models.db_32k_model, 
  })
  return result
}

chatModel的封装文件:src/models/index.js

js 复制代码
import OpenAI from 'openai';
import dotenv from "dotenv";

dotenv.config() // 加载环境变量

const openai = new OpenAI();

export async function chatModel({ message, stream = false, model, top_p = 0, temperature = 0.1 }) {
  const res = await openai.chat.completions.create({
    messages: message,
    temperature: temperature,
    top_p: top_p,
    model: model,
    stream,
  });
  if (stream) {
    return res
  } else {
    let str = res.choices[0]?.message?.content
    return str
  }
}

第一类:调用知识库的意图

例如:谈合同、产品细节、产品推荐、产品介绍、售后意图

预期场景:用户表达了非常强的购买意向 示例问题:X产品怎么购买?购买产品要签订什么协议? 响应方式:此时需要具体分析用户的意图,进行下单链接的推荐或者合同、协议的推送

这类意图处理的核心逻辑就是调用指定tag的知识库 + isUseful判断答案相关性

例如:知识库中把与合同和下单相关的数据,都打上tag为"合同"。当进入合同意图的时候,仅检索这部分数据即可。

代码如下:

js 复制代码
async function handleHeTong({ query }) {
  // ! 调用谈合同知识库
  let [knowledgeData] = await searchKnowledge({ query, knowledgeTag: "合同", score: 0.45, limit: 1 })

  // ! 判断知识库与用户信息的相关性
  knowledgeDataIsUseful = isUseful({ data: knowledgeData, query })
  if (!knowledgeDataIsUseful) {
    knowledgeData = null
  }

  return knowledgeData
}

isUseful是我们封装用来判断知识库是否解决了用户的问题的一个护栏程序,提示词会返回N或者Y

内容如下:

js 复制代码
import { useful_prompt } from './prompts/index.js'
async function isUseful({ data, query }) {
  let result = await chatModel({
    message: [
      { role: 'user', content: useful_prompt({ query, data }) },
    ],
    model: Models.db_32k_model,
  })

  return result.indexOf("Y")
}

意图分析提示词:src/prompts/index.js

useful_prompt提示词用来判断当前的答案是否解决了问题

js 复制代码
export const useful_prompt = ({ data, query }) => `
## 业务知识
- 当用户提到Q3或者Q3 pro时,都是指我们的产品:小穹AI家教(型号Q3 Pro)


## 资料
${data}
## user的问题
${query}

## 要求
- 必要的知识放在【业务知识】中,查询业务知识的信息与user对齐概念。
- 判断资料是否能够有效的回复user的问题。
- 如果资料是有效的,返回'''Y''',否则返回'''N''',不要输出任何其他内容。

## 输出
`

searchKnowledge是我们封装的火山的知识库查询,只会返回分数超过我们设置的内容。

内容如下:

js 复制代码
import axios from 'axios';
import dotenv from "dotenv";
import { Signer } from '@volcengine/openapi';

dotenv.config() // 加载环境变量

// 配置参数
const collectionName = "shouqian";
const projectName = "default";
const ak = process.env.DB_AK;
const sk = process.env.DB_SK;
const knowledgeBaseDomain = "api-knowledgebase.ml_platform.cn-beijing.volces.com";


function signer({ pathname, method, body, region, params }) {
  const requestObj = {
    region,
    headers: {
      Accept: 'application/json',
      'Content-type': 'application/json'
    },
    method,
    body,
    pathname,
    params,
  }

  const signer = new Signer(requestObj, 'air')
  signer.addAuthorization({
    accessKeyId: ak,
    secretKey: sk,
  })
  return requestObj
}

export default async function searchKnowledge({ query, limit = 10, dense_weight = 0.7, score = 0.65 }) {
  const requestBody = {
    project: projectName,
    name: collectionName,
    query: query,
    limit: limit,
    pre_processing: {
      need_instruction: true,
      return_token_usage: true,
      messages: [
        { role: "user", content: query }
      ]
    },
    dense_weight: dense_weight,
    post_processing: {
      rerank_only_chunk: true
    }
  };

  const body = JSON.stringify(requestBody);

  let requestObj = signer({
    pathname: '/api/knowledge/collection/search_knowledge',
    method: 'POST',
    region: 'cn-beijing',
    body
  })

  const response = await axios({
    method: requestObj.method,
    url: `http://${knowledgeBaseDomain}${requestObj.pathname}`,
    headers: requestObj.headers,
    data: requestObj.body
  });
  let result = []
  console.log(response.data.data.result_list)
  response.data.data.result_list?.forEach(item => {
    if (item.score >= score) {
      result.push({ ...item })
    }
  })

  return result
}

第二类:调用API类型的意图

例如:留资意图

预期场景:用户表达了需要换个方式沟通,或者对话过程中AI认为需要用户进行留资。 示例问题:电话联系吧微信聊可以么? 响应方式: 此时需要存储用户的信息 + 与访客约定回访时间。

使用getInfo从用户的聊天记录中获取用户的留资,然后收集起来,最后使用留资的提示词要求用户留资以及预约最后的访谈时间

js 复制代码
import { liuzi_prompt } from './prompts/index.js'
async function handleLiuZi({ query }) {

  // ! 调用大模型进行留资对话,提示词需要做两个判断,1 用户是否提供了联系方式, 2 如果没有提供则与用户沟通联系方式。 最后与用户预约回访时间
   let info = getInfo({  history, query })

  // 如果有info, 就把info收集起来
   if(info){
      sendInfo(info) // 自己的接口,收集info信息
   }

  let actionData = await chatModel({
    message: [
      { role: 'user', content: liuzi_prompt({ query }) },
    ],
    model: Models.db_32k_model,
  })

  return actionData
}

第三类:闲聊

预期场景:闲聊 示例问题:你好你是谁 响应方式:保持售前人设的同时进行简单的回复,避免回复不必要的问题。

这一类意图的回复就很简单了,直接使用大模型配合人设提示词进行回复就OK了

需要注意的地方是:这里要做一下回复限制,防止大模型随意回复,说一些不该说的。

最常用的方法就是在提示词中限制角色的回复范围,例如:

md 复制代码
你是一名专业售前客服机器人,仅回复与[XX产品]相关的业务咨询。
你的核心职责是解答客户关于产品功能、服务方案、价格政策、技术参数等售前问题。
若用户提出无关请求,必须礼貌拒绝并引导回业务主题。

结语

本篇我们写了具体意图的分类处理方式,但是在落地前,还有几个细节上的优化点,主要包括三点:

  • 问题拆分:解决用户一个问题询问多个问题
  • 意图分提示词:每个意图都有特点的提示词要点
  • 提示词安全优化:防止提示词泄露、并做出对应的响应

这几个优化,我们既要考虑回复速度也要考虑回复质量。

下一篇我们会把项目中的提示词编写原则,和细节优化的这一部分完成。

后续我会不断把新的内容搬到这个专栏,希望这个系列能够打造成帮助大家落地AI产品时的实战手册!

加油,共勉!

提前订阅不迷路:售前AI机器人掘金专栏地址

☺️你好,我是华洛,如果你对程序员转型AI产品负责人感兴趣,请给我点个赞。

你可以在这里联系我👉www.yuque.com/hualuo-fztn...

已入驻公众号【华洛AI转型纪实】,欢迎大家围观,后续会分享大量最近三年来的经验和踩过的坑。

专栏文章

# 从0到1打造企业级AI售前机器人------实战指南四:用户意图分析(路由解决方案)

# 从0到1打造企业级AI售前机器人------实战指南三:RAG工程的超级优化

# 从0到1打造企业级AI售前机器人------实战指南二:RAG工程落地之数据处理篇🧐

# 从0到1打造企业级AI售前机器人------实战指南一:根据产品需求和定位进行agent流程设计🧐

# 聊一下MCP,希望能让各位清醒一点吧🧐

# 实战派!百万PV的AI产品如何搭建RAG系统?

# 团队落地AI产品的全流程

# 5000字长文,AI时代下程序员的巨大优势!

相关推荐
BUG收容所所长7 分钟前
揭秘 To-Do List:一个前端小玩具的“幕后玩家”
javascript·css
自学前端_又又10 分钟前
3年Vue3,借Trae之力,实现转React的有缝连接
前端·javascript·trae
橙某人10 分钟前
✂️图片裁剪进阶篇 - 固定比例与裁剪模式
前端·javascript·vue.js
Mintopia2 小时前
Three.js 3D 图表与数据可视化:在数字宇宙中绘制数据星河
前端·javascript·three.js
JohnYan2 小时前
Bun技术评估 - 11 Websocket
javascript·后端·bun
盛夏绽放2 小时前
Node.js 路由请求方式大全解:深度剖析与工程实践
node.js·有问必答
全干engineer2 小时前
Web3-Web3.js核心操作:Metamask、合约调用、事件订阅全指南
开发语言·javascript·web3·区块链·智能合约
Leyla2 小时前
你不知道的 parseInt 方法
javascript·面试
困困的果果头2 小时前
【vue + element】el-table支持多层级合并列
前端·javascript·vue.js·elementui