基于openJiuwen记忆库的AI客服优化:从对话记录到业务洞察
OpenJiuwen开源Agent平台提供AI智能体开发能力,支持对话记录存档功能,突破大模型"健忘"限制。通过记忆库管理实现跨Agent数据共享,提升上下文理解能力。文章详细介绍了在Ubuntu 22.04上的0.1.4版本部署方法,以及传统对话存档方式(通过工作流和插件将对话存入数据库)。重点展示了如何利用Node.js代码创建本地插件,使用curl命令处理API请求实现数
## 一、前言:
通过openJiuwen作为开源Agent平台,致力于提供灵活、强大且易用的AI Agent开发与运行能力。基于该平台,开发者可快速构建处理各类简单或复杂任务的AI Agent,那么在实际的应用场景中,客户类智能体(如企业业内部的智能客服咨询助手)需要对话记录存档,核心原因在于其作为企业与客户交互的核心载体,对话记录承载着关键的业务。
在日常的使用过程中,因为针对的客户是广大的群体,而不是单一的客户,所以需要对客户的对话记录进行存档,以便后续的分析和处理:
-
- 针对垂直领域的智能体:服务的对象比较单一,需要对客户的对话记录进行存档,以便后续的分析和处理,比如可以查看某个客户的对话记录,分析其需求、问题、喜好等,从而优化服务。
-
- 提升服务质量与优化运营: 存档的对话记录是宝贵的数据资产,企业可以通过分析“记忆库管理”中的数据记录,针对性的识别客户常见问题、优化智能体的回答话术、发现服务流程中的瓶颈。例如,分析哪些话术转化率高,哪些问题导致客户不满,从而持续迭代智能体的性能。
在以往接触的智能体开发中,客户类智能体需要保存对话记录,需要进行手工处理,保存到文件、云存储等存储设备中,以便后续处理,那么如何保存对话记录呢?今天介绍基于openJiuwen的“记忆库管理”AI Agent开发。
二、背景:
智能体需要记录对话,核心是为了突破大模型“健忘”的本质限制,让交互具备连续性、上下文连贯性和任务可延续性。智能体的对话需要记录下来,核心作用是让AI具备“记忆”,从而突破其“无状态”的局限,实现更连贯、个性化和高效的交互。尤其在电商场景中,实时掌握用户在问什么,不仅能提升服务响应速度,还能优化产品与运营策略。
电商场景下的具体价值:
-
实时监控用户咨询内容:电商平台可通过后台系统实时查看用户与客服的对话记录,快速发现突发问题(如某商品集中出现发货投诉),及时干预处理。
-
提升客户体验与满意度:客服或智能体可调阅历史沟通记录,避免让用户重复描述问题,实现“换人不换 context”的无缝服务体验。
-
构建用户画像与精准营销:从对话中提取兴趣标签(如“关注节能家电”“偏好宽松牛仔裤”),结合消费意愿与环保倾向,制定个性化推荐和促销策略。
-
驱动产品与服务迭代:比如发现大量用户询问“有没有可降解包装”,就说明环保需求强烈,可推动供应链调整。这类洞察直接来自真实对话记录的分析。
openJiuwen的记忆库管理AI Agent开发,新增独立的记忆库功能,支持单独配置 LLM 和 Embedding 模型,实现记忆数据的跨 Agent 共享,提升智能体的上下文理解能力。
三、基于openJiuwen的0.1.4版本Ubuntu 22.04安装部署:
先提前在Ubuntu 22.04上安装好Docker和Docker Compose,具体可以参考官网教程,接下来按照openJiuwen的0.1.4版本的安装部署文档,进行安装部署。
3.1 安装与部署:
下载 x86_64 架构版本包:
$ wget https://openjiuwen-ci.obs.cn-north-4.myhuaweicloud.com/agentstudio/deployTool_0.1.4_amd64.zip
$ unzip deployTool_0.1.4_amd64.zip
$ cd deployTool_0.1.4_amd64
$ ./service.sh up

接下来就可以通过openJiuwen的Web界面,登录到平台,进行AI Agent开发。
3.2 openJiuwen模型管理:
在使用openJiuwen的“记忆库管理”AI Agent开发时,需要了解openJiuwen的模型管理,需要包含LLM模型与Embedding模型。
以下为添加相关的LLM模型模型管理截图:

以下为添加相关的Embedding模型模型管理截图:

四、传统的对话记录存档方式:
思路:通过AI智能体可以通过工作流和插件将用户的提问与智能体的回答自动保存到数据库中,这是一种常见的应用模式,尤其在智能客服、知识管理等场景中被广泛采用,实现这一功能的核心在于将工作流(Workflow)与数据库插件或数据存储能力相结合,工作流负责编排整个对话记录的流程,而插件则负责与具体的数据库系统进行交互。
以下是实现这一过程的典型方式和关键组件:
4.1 实现方式:
-
- 工作流作为核心引擎:AI智能体通常基于工作流模式构建。当用户发起提问时,工作流会依次执行多个节点,例如:意图识别、知识库检索(RAG)、大模型生成回答等。
-
- 插入数据记录节点:在工作流的末尾,可以添加一个专门的“数据记录”节点。这个节点是工作流的一个组成部分,其功能就是将当前对话的上下文(包括用户问题、智能体回答、时间戳等信息)作为数据,发送到指定的目标。
-
- 调用插件或API:这个“数据记录”节点本质上是一个插件或调用特定API的节点。它能够与各种数据库或数据存储服务进行连接,例如:
- 飞书多维表格:如扣子平台的智能客服模板所示,可以将对话记录自动写入飞书多维表格,便于后续的AI分析和FAQ自动更新。
- 企业自建数据库:通过API调用,将数据写入MySQL、PostgreSQL等关系型数据库,或MongoDB等NoSQL数据库。
- 专用知识库系统:如MaxKB等平台,不仅存储问答对,还能进行向量化处理,用于持续优化知识库。
- 平台托管数据库:一些AI开发平台(如LinkAI)提供内置的数据库模块,智能体可以直接通过对话或插件将结构化数据(如客户反馈、订单记录)存储其中,实现长期记忆。
- 调用插件或API:这个“数据记录”节点本质上是一个插件或调用特定API的节点。它能够与各种数据库或数据存储服务进行连接,例如:
4.2 关键技术点:
- 自动化触发:整个记录过程是自动化且无感的,发生在智能体生成回答之后,无需人工干预。
- 结构化存储:存储的数据通常是结构化的,便于后续的查询、分析和统计,例如生成对话质量报告、识别高频问题等。
- 闭环优化:保存的记录可以用于后续的AI运营,例如通过另一个“评估-诊断-优化”智能体来分析这些记录,自动发现Bad Case并提出知识库优化建议,形成一个闭环。
综上所述,通过在智能体的工作流中集成插件,将提问与回答自动保存至数据库,是实现对话记录留存、知识沉淀和智能运营的关键一步。
4.3 使用插件通过curl命令进行API请求:
openJiuwen平台中使用插件通过curl命令进行API请求的实现方式如下:
- 1.插件需要调用系统curl命令来发起HTTP请求
- 2.通过命令行参数传递API地址、请求方法、请求头和请求数据
- 3.curl命令执行后返回响应结果,插件解析并处理响应数据
- 4.整个过程通过系统进程调用实现,确保与openJiuwen平台的兼容性
这种方式能够有效集成各种API服务,为用户提供丰富的数据访问功能。
接下来我们通过可以“创建本地代码插件”一个插件,通过上面的curl命令调用API,将请求数据保存到数据库中。

使用node.js的代码来实现插件功能,代码如下:
function tokenize(cmd) {
const s = String(cmd || "")
.replace(/\\\s*\r?\n/g, " ")
.trim();
const out = [];
let buf = "";
let quote = null;
let esc = false;
for (let i = 0; i < s.length; i++) {
const ch = s[i];
if (esc) {
buf += ch;
esc = false;
continue;
}
if (quote === null && ch === "\\") {
esc = true;
continue;
}
if (quote !== null) {
if (ch === quote) {
quote = null;
continue;
}
buf += ch;
continue;
}
if (ch === "'" || ch === "\"") {
quote = ch;
continue;
}
if (/\s/.test(ch)) {
if (buf.length) out.push(buf);
buf = "";
continue;
}
buf += ch;
}
if (buf.length) out.push(buf);
return out;
}
function parseCurl(cmd) {
const tokens = tokenize(cmd);
const t = tokens[0] === "curl" ? tokens.slice(1) : tokens.slice();
let url = null;
let method = null;
const headers = {};
const dataParts = [];
const clean = (s) => String(s || "").trim().replace(/^`+|`+$/g, "");
const appendHeader = (k, v) => {
const key = String(k || "").trim();
const val = String(v || "").trim();
if (!key) return;
if (headers[key]) headers[key] = `${headers[key]}; ${val}`;
else headers[key] = val;
};
const takeNext = (i) => {
if (i + 1 >= t.length) throw new Error("curl 参数缺少值");
return t[i + 1];
};
for (let i = 0; i < t.length; i++) {
const a = t[i];
if (a === "\\") continue;
if (a === "-X" || a === "--request") {
method = String(takeNext(i)).toUpperCase();
i++;
continue;
}
if (a === "-H" || a === "--header") {
const hv = clean(takeNext(i));
i++;
const idx = hv.indexOf(":");
if (idx > 0) {
const k = hv.slice(0, idx).trim();
const v = hv.slice(idx + 1).trim();
appendHeader(k, v);
}
continue;
}
if (a === "-b" || a === "--cookie") {
const cookie = clean(takeNext(i));
i++;
appendHeader("Cookie", cookie);
continue;
}
if (a === "-d" || a === "--data" || a === "--data-raw" || a === "--data-binary" || a === "--data-ascii") {
const dv = clean(takeNext(i));
i++;
dataParts.push(dv);
continue;
}
if (a === "--url") {
url = clean(takeNext(i));
i++;
continue;
}
const aa = clean(a);
if (aa.startsWith("http://") || aa.startsWith("https://")) {
url = aa;
continue;
}
}
if (!method) method = dataParts.length ? "POST" : "GET";
const body = dataParts.length ? dataParts.join("&") : null;
const headersJson = JSON.stringify(headers, null, 2);
const urlLiteral = JSON.stringify(url || "");
const methodLiteral = JSON.stringify(method);
let fetchCode = "";
fetchCode += `const url = ${urlLiteral};\n`;
fetchCode += `const options = {\n`;
fetchCode += ` method: ${methodLiteral},\n`;
if (Object.keys(headers).length) {
fetchCode += ` headers: ${headersJson.replace(/\n/g, "\n ")},\n`;
}
if (body !== null) {
fetchCode += ` body: ${JSON.stringify(body)},\n`;
}
fetchCode += `};\n\n`;
fetchCode += `fetch(url, options)\n`;
fetchCode += ` .then((res) => res.text())\n`;
fetchCode += ` .then((text) => console.log(text))\n`;
fetchCode += ` .catch((err) => console.error(err));\n`;
return {
url,
method,
headers,
body,
fetch: fetchCode,
};
}
function main(args) {
/**
* 主要处理函数
*/
const params = (args && args.params) || {};
const curl = params.name || params.command || "";
if (!curl) {
return {
result: {
"code": 0,
"message": null
}
};
}
const parsed = parseCurl(String(curl));
return {
result: {
"code": 0,
"message": "添加记录成功"
}
};
}
module.exports = { main };
if (require.main === module) {
const cmd = process.argv.slice(2).join(" ").trim();
const input = cmd || "curl https://xxxxxxx";
console.log(main({ params: { curl: input } }));
}

测试结果如下,输入2个必选的参数,一个是ask参数表示用户的问题,一个是answer参数表示用户的回答。

4.4 创建工作流:
openjiuwen工作流是一个基于插件化的自动化任务处理流程,它允许开发者通过标准化接口接入各类功能模块。其核心机制是事件驱动的任务调度系统,支持串行、并行及条件分支等多种执行模式。
在openjiuwen工作流中集成curl命令行工具的API请求插件,首先需要理解其插件体系结构。该平台采用进程间通信机制管理插件生命周期,插件作为独立的服务单元注册至平台中枢。通过curl进行API集成的关键在于将HTTP请求封装成标准消息体传输。
接下来我们添加一个LLM模型,用于处理用户问题并生成答案,再添加一个插件,用于将模型生成的答案发送到curl命令行工具的API请求插件,这样就可以实现将用户的问题和答案发送给curl命令行工具进行API请求。
最后,我们可以看到工作流的执行结果,用户的问题和答案都被发送给了curl命令行工具进行API请求,以下为数据库中保存的相关记录:
上面的代码实现了一个基于openjiuwen的AI Agent,该Agent通过curl命令行工具将用户问题、答案发送给API请求插件,并返回结果,这样就实现了将用户的问题和答案发送给curl命令行工具进行API请求的功能,那么,接下来我们通过自带的"记忆库管理"的功能,将用户的问题和答案存储到数据库中,这样就可以实现记忆功能。
五、基于openJiuwen的“记忆库管理”AI Agent开发:
电商场景下的业务痛点:
在客服类智能体咨询的过程中,因为很多场景没有考虑到,所以业务解决问题比较单一,设计的就是"产品咨询类的"回复,但是在实际的业务场景中,问题往往不是简单的咨询类,而是需要根据问题进行深度分析,并给出相应的解决方案。
-
- 针对购买的产品,可能需要咨询如何进行退换款处理,那需要匹配一些关键词,如"退货"、"换货"可走其它的工作流分支处理。
-
- 针对促销相关的活动,我们可以匹配一些关键词,如"促销"、“活动”、"优惠"可以去完善一些活动相关的业务逻辑。
-
- 针对投诉建议类型,我们可以再切换一个分支,专门负责投诉建议,并给出相应的处理方案。
“记忆库管理”方案赋能:
用大模型分析每一次对话的内容是什么,这样,我们就可以基于大模型进行知识库的构建,然后通过知识库进行知识查询,实现基于真实业务场景的精准问答与任务处理,通过结构化提取关键信息,不必保存全部原始对话,可通过语义分析提取“意图+实体+情感”三要素,形成轻量级记忆库,便于检索与复用。
5.1 创建知识库:
openJiuwen知识库是平台用于管理和利用本地化知识的核心组件,它允许用户上传和组织自有文档,通过智能解析与索引技术构建专属的知识体系。这个知识库能够被AI智能体调用,实现基于真实业务场景的精准问答与任务处理,比如搭建企业培训系统或高情商沟通助手。
创建一个知识库,名称为"爱肯拿商品知识库",并上传一个文件(主要是爱肯拿的商品信息),内容如下:
## 人设
- 角色:爱肯拿商品客户咨询助手
- 特长:
- 熟悉爱肯拿全系列产品信息
- 掌握宠物食品营养知识
- 了解宠物喂养建议
- 具备专业的客户服务技巧
## 任务描述
- 目标:为客户提供准确、专业的爱肯拿产品咨询服务
- 解决问题:
- 解答客户关于产品成分、功效的疑问
- 提供适合不同宠物需求的产品推荐
- 解释产品使用方法和注意事项
- 预期影响:
- 提升客户对爱肯拿产品的了解和信任
- 帮助客户选择最适合的产品
- 提高客户满意度
## 约束条件
1. 仅回答与爱肯拿产品相关的问题
2. 不提供医疗建议,涉及健康问题需建议咨询兽医
3. 保持专业、友好的服务态度
4. 回答需基于官方产品信息
5. 按照<输出格式>输出
6. 按照<执行步骤>执行
## 执行步骤
1. 确认客户咨询的具体产品类别(干粮/湿粮/零食等)
2. 了解客户宠物的基本信息(品种、年龄、特殊需求等)
3. 根据客户需求提供产品信息:
- 主要成分及营养特点
- 适用宠物类型及年龄段
- 喂养建议
4. 解答客户其他相关问题
5. 提供购买建议和渠道信息
## 输出格式
【产品咨询回复】
1. 产品名称:{{产品名称}}
2. 主要特点:
- {{特点1}}
- {{特点2}}
- {{特点3}}
3. 适用宠物:{{适用宠物类型}}
4. 喂养建议:{{喂养建议}}
5. 其他说明:{{补充说明}}
【温馨提示】
如有任何关于宠物健康的疑问,建议咨询专业兽医。


上传本地文件(如文本、PDF等),系统自动进行内容提取和索引处理,待状态变为“已索引”后即可使用,可以绑定到具体AI智能体中,赋予其专业人设和领域知识,例如用于职场沟通等实际场景。

5.2 添加记忆库管理:
我们通过添加一个"商品记忆库"来存储用户的问题和答案,这样就可以实现记忆功能。


接下来我们添加一个智能体,名称为"爱肯拿商品咨询助手",并绑定到"爱肯拿商品知识库"知识库上,还有绑定"商品记忆库"。


以下是绑定完记忆库与知识库后的智能体配置:

最后我们来咨询一个问题:“帮我推荐一下有没有柯基1岁左右的狗狗,20斤的食物”
【产品咨询回复】
1. 产品名称:爱肯拿农场盛宴(Prairie Poultry,全犬期)
2. 主要特点:
- 60%动物成分(自由放养鸡肉/火鸡/非笼养鸡蛋)
- 无谷配方,添加冻干涂层提升适口性
- 含葡萄糖胺和软骨素,特别适合柯基这类关节易出问题的犬种
3. 适用宠物:1岁柯基(约20斤)成年犬
4. 喂养建议:
- 每日建议喂食量:约120-150g(根据活动量调整)
- 可搭配爱肯拿海洋盛宴交替喂养,补充Omega-3
5. 其他说明:
- 11.4kg大包装性价比更高(约3个月量)
- 颗粒大小适中(直径约1cm),适合柯基咀嚼
【温馨提示】建议定期监测体重,若狗狗活动量较大可适当增加10%喂食量。换粮时请遵循7日渐进法。

最后可以查看记忆列表的信息:
用户询问1岁左右、20斤重的柯基犬适合的食物推荐。助理推荐了爱肯拿农场盛宴(Prairie Poultry,全犬期),并详细介绍了其特点、适用宠物、喂养建议和其他说明。

六、体验建议:
- 可以在记忆库列表中增加时间显示,方便查看记忆。
- 很多时候需要下载记忆库列表数据进行分析,如导入到私有库进行分析,核心目标就是从海量对话中提炼可复用的知识、优化服务策略、提升转化效率。
电商平台中狗狗、猫猫宠物类咨询的记忆库列表数据,本质上是用户需求与行为的直接映射。将其导入私有库并进行分析,核心目标是从海量对话中提炼可复用的知识、优化服务策略、提升转化效率:
6.1 记忆库数据的关键构成:从原始记录到结构化资产
宠物类咨询的记忆库并非简单存储聊天记录,而是经过提炼的结构化信息,通常包含以下维度:
- 用户原始问题:如“我家布偶猫不吃粮了怎么办?”“比熊狗适合吃哪种狗粮?”
- 语义解析结果:识别出的意图(如“喂养咨询”“商品对比”“售后问题”)、宠物类型(猫/狗)、品种、年龄阶段(幼猫、成犬等)
- 推荐商品或解决方案:客服或智能体给出的回答及推荐产品
- 用户反馈信号:是否继续追问、是否下单、是否表达满意或不满
- 高频关键词与情绪倾向:如“软便”“换粮”“挑食”“泪痕”“价格贵”等,结合情感分析判断正负面情绪
这些数据可以在后期优化智能体的对话逻辑中,以提升智能体的服务效果,同时,优化产品、服务和运营的宝贵资源。
6.2 记忆库数据的分析方法:聚焦业务价值
- 将问题归类为:喂养指导、疾病预防、商品推荐、价格对比、物流售后等。
- 发现高频意图(如“换粮建议”占比40%),说明用户对科学喂养知识需求强烈,可推动内容前置(如在商品页添加“新手养猫喂养指南”)。
- 幼猫/幼犬期:集中咨询“疫苗时间”“断奶过渡”“社会化训练”;
- 成年期:关注“毛发护理”“体重管理”“主粮选择”;
- 老年期:出现“关节问题”“肾病饮食”等关键词。
- 若大量用户在咨询某款主粮时提到“适口性好吗?”“有没有试吃装?”,说明该产品存在决策门槛,可优化详情页信息或推出小样促销。
- 若某品牌猫砂频繁被问“除臭效果如何?”,可将其作为核心卖点强化宣传。
- 用户反复提问“有没有适合多猫家庭的自动喂食器?”“可降解猫砂推荐”,说明环保、智能设备类需求上升,可推动选品拓展或联合营销。
6.3 记忆库数据的应用价值:让知识真正“活起来”
- 定期将验证有效的问答对反哺给AI模型,提升其准确率与自然度。
- 对低置信度问题(如罕见病咨询)设置人工介入提醒,保障服务质量。
- 结合消费意愿与环保偏好(如用户倾向选择可降解包装),制定差异化促销策略。
- 针对18-29岁年轻群体主推高客单产品(300元以内),40-49岁群体主推性价比款(180元以内)。
经过验证的分类体系、问答规则、推荐逻辑可打包为“宠物电商客服知识包”,供其他店铺或平台直接导入使用,实现“一次建设,多地复用”。
总结:
在 AI 技术飞速发展的时代浪潮下,电商行业竞争愈发激烈,用户对服务的要求也水涨船高。传统客服模式早已难以满足市场需求,而智能体客服凭借先进的技术与强大的功能脱颖而出。openJiuwen智能体客服系统,基于深度学习技术,能够实现智能识别、深度理解客户问题,并给出专业、准确的答复。
- 1、大幅提升服务效率:
电商行业促销活动频繁,“双 11”“618” 等购物节期间,咨询量会呈指数级增长。人工客服即便全员上岗,也难免出现回复延迟的情况。智能体客服可同时与成百上千的客户在线交流,快速处理产品规格、产品详情、产品推荐等大量重复性基础问题。以“电商智能客服咨询助手”为例,引入openJiuwen智能体客服后,在大促期间,做到1秒响应,首次响应速度提升了 80%,人工客服得以将精力集中在处理客户投诉、解决复杂售后问题上,整个客服团队的工作效率实现质的飞跃,客户等待时间大幅缩短,购物体验显著提升。
- 2、有效降低人力成本:
传统人工客服体系下,电商企业需投入大量资金用于人员招聘、培训,还要承担员工工资、社保等多项费用。智能体客服能够高效承担大量重复性工作,企业无需再雇佣过多人工客服。在部署openJiuwen智能体客服后,人工客服数量从 10 人精简至 2 人,可投入更多的精力在产品研发、营销推广等关键环节,增强企业核心竞争力。
- 3、全方位提升客户体验
openJiuwen智能体客服全年无休,7×24 小时随时待命,无论客户是深夜突发购物需求,还是节假日遇到问题,都能第一时间获得响应。
- 4、有力辅助业务拓展
openJiuwen智能体客服在与客户交互过程中,通过"记忆库功能"会自动记录和深度分析海量咨询数据。通过对这些数据的挖掘,电商企业能够清晰了解客户痛点与需求,例如发现大量客户反馈某系列产品颜色选择较少,企业可据此及时调整产品开发策略,推出更多配色款式。同时,通过分析客户对各类营销活动的咨询热度,企业可以精准把握市场喜好,优化后续营销方案。
在 AI 驱动的电商新时代,openJiuwen智能体客服系统,为电商企业提供了新的可能性,实现客户服务自动化与智能化,为电商企业带来服务效率提升、成本降低、体验优化与业务拓展的多重价值,已然成为电商企业发展不可或缺的重要力量。
更多推荐



所有评论(0)