游戏问问游戏问问
  • 首页
  • 游戏产业观察
    游戏产业观察
    聚焦大厂财报、并购投资、版号下发解读及海外市场分析…
    Show More
    Top News
    建信金科低代码平台业务流程管理开发服务,招标结果公示
    3年 ago
    业务开发“银弹” – 低代码平台建设
    4年 ago
    OutSystems与UiPath达成合作,通过低代码加速RPA场景化落地
    3年 ago
    Latest News
    重磅!OpenAI开源首个Agent SDK,反击Manus
    1年 ago
    云计算巨头AI战略分化:谁将定义企业级AI的未来规则?
    1年 ago
    DeepSeek创造历史!登顶全球AI应用第2名,豆包排名第10
    1年 ago
    2025“赋能开发者”高峰论坛即将启幕,诚邀您报名参加!
    1年 ago
  • 研发与发行
  • 活动与社群
    活动与社群
    最新活动,包含线上研讨会、技术预测峰会、线下峰会、…
    Show More
    Top News
    《2022年中国隐私计算行业洞察报告》正式发布 | PCview隐私计算研究院
    3年 ago
    报名开启 | ISIG主峰会-2022低代码/零代码技术与应用发展峰会
    3年 ago
    第三届ISIG产业智能大会议程
    3年 ago
    Latest News
    2024第五届ISIG产业智能大会,四大科技峰会共掀数字化创新浪潮
    1年 ago
    参赛者必看 | 拯救者杯OPENAIGC开发者大赛最全攻略指南来啦~
    2年 ago
    2024第四届ISIG产业智能大会(RPA超级自动化、AIGC大模型、低代码/零代码、流程挖掘)
    2年 ago
    超自动化·智启高效运营|艺赛旗2023年春季产品发布会成功举办
    3年 ago
  • 数据报告
  • 关于游戏问问
Reading: 如何用低代码搭建一个专业知识库问答AI机器人
Share
Notification Show More
Latest News
30部佳作突围!2025 AI视听创作嘉年华晋级名单揭晓,总决赛11月25日启幕
市场洞察
《2025 AI 大模型开发生态白皮书》正式发布 | 算泥社区
未分类
“AI幻想·未来亦城”2025AI视听创作嘉年华作品征集来了!
未分类
120万奖池,寻找最具想象力的AI创意开发者!2025骁龙人工智能创新应用大赛正式启动!
未分类
2025-10-21
未分类
Aa
游戏问问游戏问问
Aa
  • 游戏产业观察
  • 活动与社群
  • 首页
  • 游戏产业观察
  • 数据报告
  • 活动与社群
  • 研发与发行
  • 关于游戏问问
Have an existing account? Sign In
  • LowCode低码时代
Copyright©2015-2022 北京企智未来科技有限公司 All Rights Reserved.
游戏问问 > Blog > 游戏产业观察 > 如何用低代码搭建一个专业知识库问答AI机器人
游戏产业观察

如何用低代码搭建一个专业知识库问答AI机器人

LowCode低码时代
Last updated: 2023/03/30 at 9:52 上午
LowCode低码时代 3年 ago
Share
SHARE


Contents
一、准备工作二、搭建聊天机器人界面三、配置后端逻辑1. 将知识库文档数据向量化2. 实现query的向量化搜索3. 将所涉及代码部署到微搭低代码的云函数中4. 完成开发联调,发布应用四、附录说明1 数据库PostgreSQL的初始化2 体验试用3 最后参考资料
来源:依然基于Stable-Diffusion模型生成

距离上篇文章《低代码xChatGPT,五步搭建AI聊天机器人》已经过去3个多月,收到了很多小伙伴的关注和反馈,也帮助很多朋友快速低成本搭建了ChatGPT聊天应用,未曾想这一段时间GPT热度只增不减,加上最近国内外各种LLM、文生图多模态模型密集发布,开发者们也有了更高的要求。比如如何训练一个自己的GPT应用,如何结合GPT和所在的专业领域知识来搭建AI应用,像心理咨询助手、个人知识库助手等,看目前网上这方面资料还不多,今天我们就来抛个砖试试。

目前的预训练方式主要如下几种:

  • 基于OpenAI的官方LLM模型,进行fine-tune[1](费用高,耗时长)
  • 基于开源的Alpaca.cpp[2]本地模型(目前可在本地消费级显卡跑起来,对自己硬件有信心也可以试试)
  • 通过向量数据库上下文关联(轻量级,费用可控,速度快,包括昨天OPENAI官方昨天刚放出来的示例插件chatgpt-retrieval-plugin[3],也采用的这种方式)
低代码实现的AI问答机器人效果如下:

这次还是用腾讯云微搭低代码作为应用搭建平台,来介绍如何快速搭建一个垂直领域的知识库GPT问答机器人,今天的教程尽量避开了各种黑科技的封装库(没有Langchain/Supabase/PineconeSDK全家桶),尝试从最基本的实现原理来展开介绍,尽量让大家知其所以然。新手开发者也可以试试,与其看各种GPT热闹,不如Make your hands dirty。

一、准备工作

在开始搭建垂直知识库的问答机器人前,你需要做以下准备:

  • 微信小程序账号:如果您还没有微信小程序账号,可以在微信公众平台注册(如果没有小程序,也可以发布为移动端H5应用)

  • 开通腾讯云微搭低代码:微搭低代码是腾讯云官方推出的一款低代码开发工具,可以直接访问腾讯云微搭官网[4]免费开通注册

  • OpenAI账号:OpenAI账号注册也是免费的,不过OpenAI有地域限制,网上方法很多在此不赘述。注册成功后,可以登录OpenAI的个人中心[5]来获取API KEY

  • 一个支持向量匹配的数据库(本文以开源的PostgreSQL为例,你也可以使用Redis,或者NPM的HNSWlib包)

关于向量数据库,目前可选择的方式有好几种,可以使用PostgreSQL安装vector向量扩展,也可以使用Redis的Vector Similarity Search[6],还可以直接云函数使用HNSWLib库,甚至自行diy一个简单的基于文件系统的余弦相似度向量数据库,文末的 github/lowcode.ai 也有简单示例代码,仅做参考交流不建议在生产环境使用。

本教程适用人群和应用类型:

  • 适用人群:有前后端基础的开发者(有一定技术背景的非开发者也可以体验)
  • 应用类型:小程序 或 H5应用(基于微搭一码多端特性,可以发布为Web应用,点击原文链接可体验作者基于微搭搭建的文档GPT机器人[7])

二、搭建聊天机器人界面

如何使用低代码进行界面搭建的详细过程,在之前的文章中《低代码xChatGPT,五步搭建AI聊天机器人》已经有过详细的教程介绍,这里就不再继续展开。

另外,大家也可以使用微搭官方的聊天模板,这样的话界面这一步直接跳过,开箱即用,附微搭低代码GPT聊天应用模板地址[8]

完成界面配置之后,大家重点关注下图中页面设计模块的”发送“按钮的事件配置即可,在后续会提到。

三、配置后端逻辑

与之前机器人的实现直接调用远程API不同,这次由于需要针对专业的领域知识进行预处理以及向量化,重点会涉及3个部分:

  • 读取待训练的文档数据并进行向量化,之后存入向量数据库
  • 通过query的向量化结果与数据库向量进行相似度匹配,并返回关联文本结果
  • 结合返回的关联文本和query来构建上下文生成prompt

可以通过下图了解向量搜索实现GPT Context的大致原理:

由上图可见,主要是两个处理流程,一个文档数据的向量化预处理,一个是查询时的向量匹配和Context构造处理,这两个处理我们都可以使用腾讯云低代码的云函数来实现(当然第一步的预处理也可以在本地电脑完成)

1. 将知识库文档数据向量化

首先,将所需要的预处理的知识库内容放在某个目录下,遍历知识库目录下的所有文档文件(本文文件格式以markdown为例),将文本分块后结构化存储在本地json文件。

如果数据量小,分块后的结构化数据也可以直接放在内存中,本地化json主要便于在大量文本预处理时,遇到网络等异常时,能够在断点处重启预处理

关键代码如下:

本教程涉及的完整代码已放到https://github.com/enimo/lowcode.ai[9]中,可按需下载试验,也可直接上传到微搭低代码的云函数中运行)

function splitDocuments(files, chunkSize) {
 let docSize = chunkSize || 1000;
 let textString = '';
 let index = 0;
 let documents = [];

 for(let i = 0, len = files.length; i < len; i++) {

  if(files[i] && files[i].content) {
   textString = files[i].content;
  }
  else {
   textString = fs.readFileSync(files[i], "utf8");
  }
  textString = textString.replace(/n|r/g, " ").replace(/<.*?>/g,"")

     let start = 0;
     while (start < textString.length) {
       const end = start + docSize;
       const chunk = textString.slice(start, end);
       documents.push({ docIndex: index++, fileIndex: files[i].fileIndex, filename: files[i].filename || files[i], content: chunk });
       start = end;
  }
   }
   fs.writeFileSync("./docstore.json", JSON.stringify(documents));

   return documents;
}

上述代码用途主要是在得到遍历后的文件路径数组files后,对文件进行切块处理,分块大小可按需调整,一般建议在1000~2000之间(切换主要为兼容GPT API的单次token限制及成本控制)

其次,对分块的文本进行向量化并存入向量数据库,关键代码如下:

async function initVector(sql, docs){
    const maxElements = docs.length || 500; // 最多处理500个
    for (let j = 0; j < maxElements; j++ ) {
        const input = docs[j].content;
        const filename = docs[j].filename;
        const fileIndex = docs[j].fileIndex
        const docIndex = docs[j].docIndex

        // 通过根据训练日志返回断点docIndex,调整 docIndex 的值,确保从断点继续向量化
        if(docIndex >= 0 &&  docIndex < 1000 ){
            log("start embedding fileIndex: ", fileIndex, 'docIndex: ', docIndex, "filename:", filename);
            const embedding = await embedding(input);
            const embeddingArr = "[" + embedding + "]";
            const metadata = { filename, "doclength": maxElements, index: j };

            const insertRet = await sql`
              INSERT INTO documents ( content, appcode, metadata, embedding )
              VALUES
              ( ${input}, 'wedadoc',  ${metadata}, ${embeddingArr} )`

            await delay(1000); // 如果embedding API并发请求限制,可设置随机数sleep
        }
        else {
          continue;
        }
    }
    return true;
}

上述文本向量化的存储过程中,涉及到调用OpenAI的embedding模型进行向量转化,这里使用text-embedding-ada-002模型(这个文本向量化过程也可以不使用OpenAI的官方模型,有部分开源模型可代替)

async function embedding (text) {
    const raw_text = text.replace(/n|r/g, " ");
    const embeddingResponse = await fetch(
        OPENAI_URL + "/v1/embeddings",
        {
          method: "POST",
          headers: {
            "Authorization": `Bearer ${OPENAI_API_KEY}`,
            "Content-Type": "application/json"
          },
          body: JSON.stringify({
            input: raw_text,
            model: "text-embedding-ada-002"
          })
        }
    );
    const embeddingData = await embeddingResponse.json();    
    const [{ embedding }] = embeddingData.data;
    log({embedding});
    return embedding;
}

以上,一个文档知识库的向量化预处理就基本完成了,接下来看看怎么实现基于query的搜索逻辑。

2. 实现query的向量化搜索

我们在上一步中已经完成了文本数据的向量化存储。接下来,可以基于用户提交的query来进行相似度搜索,关键代码如下:

async function searchKnn(question, k, sql){
    const embedding = await embedding(question);
    const embeddingArr = "[" + embedding + "]";
    const result = await sql`SELECT * FROM match_documents(${embeddingArr},'wedadoc', 0.1, ${k})`
    return result;
}

上述代码将query同样转化为向量后,再去上一步向量化后的数据库中进行相似搜索,得到最终与query最匹配的上下文,其中有一个预定义的SQL函数match_documents,主要用作文本向量的匹配搜索,具体会在后面介绍,在 github/lowcode.ai 中也有详细的定义和说明。

最后,我们工具拿到的搜索返回值,来构造GPT 3.5接口的prompt上下文,关键代码如下:

async function getChatGPT (query, documents){
    let contextText = "";
    if (documents) {
        for (let i = 0; i < documents.length; i++) {
            const document = documents[i];
            const content = document.content;  
            const url = encodeURI(document.metadata['filename']);
            contextText += `${content.trim()}n SOURCE: ${url}n---n`;
        }
    }
    const systemContent = `You are a helpful assistant. When given CONTEXT you answer questions using only that information,and you always format your output in markdown. `;
    const userMessage = `CONTEXT:
      ${contextText}
      USER QUESTION: 
      ${query}`
;
    const messages = [
        {
          role: "system",
          content: systemContent
        },
        {
          role: "user",
          content: userMessage
        }
    ];
  
    const chatResponse = await fetch(
        OPENAI_URL + "/v1/chat/completions",
        {
            method: "POST",
            headers: {
                "Authorization": `Bearer ${OPENAI_API_KEY}`,
                "Content-Type": "application/json"
            },
            body: JSON.stringify({
                "model": "gpt-3.5-turbo", 
                "messages": messages,
                "temperature": 0.3, 
                "max_tokens": 2000,
            })
        }
    );
    return await chatResponse.json();
}

上述代码中核心是上下文的构造,由于GPT3.5之后的接口,支持指定role,可以将相关系统角色的prompt放在了systemContent中,至于/v1/chat/completions接口入参说明由于之前的文章中有过介绍,这里也不赘述,有任何疑问大家也可以到「漫话开发者」公众号留言询问。

以上,query的搜索部分完成了,到此所有后端接口的核心逻辑也都完成了,可以看到几个关键流程的实现是不是很简单呢。

3. 将所涉及代码部署到微搭低代码的云函数中

完成后端代码开发后,接下来就是把相应的运行代码部署到微搭低代码的云函数中,综上可知,主要是两部分的后端代码,一部分文档的向量化并入库(这部分本地Node环境运行亦可),另一部分就是实现搜索词匹配构建prompt后调用GPT接口查询了。

微搭低代码的云函数入口,可以在数据源->APIs->云函数中找到,如下图所示:

如果第一次使用云函数,需要点击图中链接跳转到云开发云函数中进行云函数的新建,如下图所示:

新建完成后,点击进入云函数详情页,选择”函数代码“Tab,然后在下面的提交方法下拉框中选择”本地上传ZIP包“即可上传前面完成的后端逻辑代码,也可以直接下载 github/lowcode.ai 打包后上传。上传成功后,第一次保存别忘了点击”保存并安装依赖“来安装对应的npm包。

在完成云函数新建和代码上传后,回到上一步的微搭数据源APIs界面中刷新页面,即可看到刚刚新建好的云函数openai,选中该云函数,并按要求正确填写对应的出入参结构,测试方法效果并保存后,即可在第一章的前端界面”发送“按钮中绑定调用数据源事件进行调用了。

4. 完成开发联调,发布应用

完成上述后端逻辑以及云函数配置后,可以切到编辑器的页面设计模块,回到第一章的界面设计来进行事件的配置,完成后点击编辑器右上角的“发布”按钮,可以选择发布到你已绑定的小程序,也可以直接发布Web端H5/PC应用。

至此,一个垂直知识库的AI问答机器人应用基本就搭建完成了。

四、附录说明

1 数据库PostgreSQL的初始化

本文中采用的PostgreSQL作为向量数据库,其中涉及到的建表结构定义参考如下:

create table documents (
  id bigserial primary key,
  content text, -- corresponds to Document.pageContent
  metadata json, -- corresponds to Document.metadata
  embedding vector(1536) -- 1536 works for OpenAI embeddings, change if needed
);

涉及的SQL函数match_documents的定义参考如下,其中query_embedding表示query关键词的向量值,similarity_threshold表示相似度,一般情况下要求不低于0.1,数值越低相似度也越低,match_count表示匹配后的返回条数,一般情况下2条左右,取决于前文的分块chunk定义大小。

create or replace function match_documents (
  query_embedding vector(1536),
  similarity_threshold float,
  match_count int
)
returns table (
  id bigint,
  content text,
  metadata json,
  similarity float
)
language plpgsql
as $$
begin
  return query
  select
    documents.id,
    documents.content,
    documents.metadata,
    1 - (documents.embedding <=> query_embedding) as similarity
  from documents
  where 1 - (documents.embedding <=> query_embedding) > similarity_threshold  
  order by documents.embedding <=> query_embedding
  limit match_count;
end;
$$;

所有上述的内容数据库SQL schema以及部分训练备用文本数据都已经放到github,大家可以关注定期更新,按需采用: github/lowcode.ai

2 体验试用

可以通过Web端体验作者搭建的Web版文档机器人,同时得益于微搭低代码的一码多端,同步发布了一个小程序版本,大家可以扫码体验。

低代码文档AI小程序

由于目前自建向量库的性能局限以及有限的预处理文档数据,响应可能比较慢,准确性偶尔也会差强人意,还请各位看官谅解,抽时间再持续优化了,本文还是以技术方案的探讨交流为主。

3 最后

通过本教程的介绍,你已经基本熟悉了如何使用微搭低代码快速搭建垂直知识库的AI问答机器人了,有任何疑问也欢迎关注「漫话开发者」公众号留言。

用低代码创建一个GPT的聊天应用很简单,实现一个垂直领域的AI问答应用也不难。未来不管被AI替代也好,新的开发者时代来了,先动手试试,make your hands dirty first, enjoy~

参考资料

[1]

OpenAI fine-tune: https://platform.openai.com/docs/guides/fine-tuning

[2]

Alpaca.cpp: https://github.com/antimatter15/alpaca.cpp

[3]

chatgpt-retrieval-plugin: https://github.com/openai/chatgpt-retrieval-plugin

[4]

腾讯云微搭低代码官网: https://weda.cloud.tencent.com/

[5]

OpenAI个人中心: https://beta.openai.com/account/api-keys

[6]

Vector Similarity Search: https://redis.com/blog/build-intelligent-apps-redis-vector-similarity-search/

[7]

低代码文档AI机器人: https://lowcode-9glm6apqf0d84b43-1251733425.tcloudbaseapp.com/app-DVLVplgN/production/wedadoc?code=wedadoc

[8]

微搭GPT聊天应用模板: https://console.cloud.tencent.com/lowcode/create/index?envId=lowcode-9glm6apqf0d84b43&templateId=tpl-1peulFtVPaFgMI

[9]

github/lowcode.ai: https://github.com/enimo/lowcode.ai


– END –


 报告下载 





大佬观点


西门子低代码-王炯 | 西门子低代码-阮铭 | 微软-李威 | 微软-徐玉涛 | 葡萄城-李佳佳 | 葡萄城-宁伟 | SAP-陈泽平 | 华为-周明旺 | 华为云-董鑫武 | 钉钉宜搭-邵磊 | 轻流-严琦东 | 腾讯云微搭-骆勤 | 网易数帆-陈谔、严跃杰
用友-刘鑫 |  数睿数据-张超 |  奥哲-朱鹏喜 | 炎黄盈动-汤武 | 普元信息-孟庆余 | 得帆-李健达 | 瀚码技术-钟惟渊 | iVX-孟智平
Treelab-何浚炫 | 阿里-汪凤震 | 明道云-薛晨 | 上海斯歌-傅正斌





公众号后台回复【加群】
可受邀进入【无代码&低代码技术应用研讨群】
欢迎各位从业者/应用者/关注者加入

You Might Also Like

重磅!OpenAI开源首个Agent SDK,反击Manus

云计算巨头AI战略分化:谁将定义企业级AI的未来规则?

DeepSeek创造历史!登顶全球AI应用第2名,豆包排名第10

2025“赋能开发者”高峰论坛即将启幕,诚邀您报名参加!

LowCode低码时代 2023-03-30
Previous Article 厂商征集 | 2023年中国低代码/零代码行业研究报告正式启动
Next Article IDG资本领投,低代码开发平台码匠获数百万美元天使轮融资
Leave a comment

发表回复 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

about us

关注中国低代码(LowCode)无代码/零代码领域,包括行业研究、市场报告、技术选型和媒体报道,推进低代码的技术普及、生态建设发展和产业应用,重塑IT开发和自动化的未来。

  • 游戏产业观察
  • 活动与社群
  • 联系我们
  • RPA中国
  • 数字金融网
  • 信创中国
  • Xverse元宇宙

最新专家访谈

游戏问问游戏问问

Copyright©2015-2022 北京小漫书科技有限公司 All Rights Reserved.
京ICP备19023145号-8

  • LowCode低码时代
订阅最新动态!

订阅最新游戏研发、发行等市场报告、研究咨询、分析师趋势以及市场活动

Zero spam,可随时取消订阅.

Removed from reading list

Undo
欢迎回来!

登录你的账号

Lost your password?