欢迎大家来到企业级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工程落地之数据处理篇🧐