RAG 技术究竟是什么?
在当今人工智能飞速发展的时代,新的技术概念如潮水般不断涌现,RAG 便是其中备受瞩目的一员。RAG,全称检索增强生成(Retrieval Augmented Generation),它巧妙地将外部知识检索与大语言模型(LLM)的生成能力融合在一起
传统的大语言模型在回答问题时,主要依赖其训练数据中的知识储备。这就好比一个学生,知识仅限于课本所学,一旦遇到课本之外的新知识,便可能陷入迷茫,难以给出准确答案。而 RAG 技术的出现,打破了这一局限。它允许模型在回答问题时,从外部知识库中快速检索相关信息,为回答注入新的活力,显著提升回答的质量与准确性。
RAG 都应用在哪些场景?
Coze 知识库 RAG:知识管理的得力助手
2024 年,Coze 知识库的 RAG 应用成为 AI 领域的一大亮点。想象一下,企业内部有大量的行程安排、工作流程、账单明细以及客户需求等信息,这些信息如同散落在各处的珍珠,而 Coze 通过 RAG 技术将它们串成了一条璀璨的项链。用户只需上传相关文件,Coze 就能围绕这些知识库内容给出精准回答,无论是员工查询工作流程,还是客服人员快速响应客户需求,都能高效完成,大大提升了企业知识管理的效率。
AI Agent 与自动化工作
步入 2025 年,随着 Deepseek 等技术的发展,以 Manus 为代表的 AI Agent 崭露头角。借助 LLM 的强大能力,AI Agent 能够自动化完成各类工作任务。RAG 技术在此过程中发挥着关键作用,它让 AI Agent 能够从外部知识库中迅速获取所需信息。比如,在健康管理领域,当用户提出健身或爬山需求时,AI Agent 可以依据知识库中的健身知识、教练空闲时间等信息,为用户量身定制专属计划,真正实现智能化、个性化服务。
如何用代码实现 RAG?
接下来,让我们通过一段使用 Node.js 和 OpenAI API 实现 RAG 的代码示例,深入了解其实现过程。
php
const fs = require('fs');
const path = require('path');
const { OpenAI } = require('openai');
require('dotenv').config();
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
baseURL: process.env.OPENAI_BASE_URL,
});
这部分代码主要是在为后续的操作做准备。我们引入了fs模块,它就像是一个文件管理员,负责文件系统的各种操作;path模块则如同一位导航员,帮助我们准确处理文件路径。OpenAI模块是与 OpenAI API 沟通的桥梁,通过require('dotenv').config(),我们加载了环境变量,从中获取 OpenAI API 的密钥和基础 URL,就如同拿到了进入宝藏库的钥匙,随后创建了openai实例,为后续与 OpenAI 服务交互做好准备。
scss
const readCourseInfo = () => {
return new Promise((resolve, reject) => {
try{
const filePath = path.join(__dirname, '课程信息.txt');
fs.readFile(filePath, 'utf8', (err, data) => {
if(err) {
reject(err)
}
resolve(data)
})
} catch(err) {
reject(err)
}
});
}
readCourseInfo函数肩负着读取本地课程信息文件的重任。它返回一个 Promise,就像一个承诺,保证会在未来某个时刻给出结果。通过fs.readFile,我们以异步的方式读取文件内容,这就好比让一个快递员在后台默默工作,不影响其他任务的进行。如果读取成功,快递员会将文件内容传递给resolve;如果遇到问题,比如文件不存在或读取错误,快递员则会把错误信息交给reject。
javascript
const answerQuestion = async () => {
const courseInfo = await readCourseInfo(); // I/O
// console.log(courseInfo, '/////')
if (!courseInfo) {
return '没有课程信息'
}
// prompt 模版 chatbot 知识库应用
// 用户的输入 问题? 私人chatbot
// 文件内容 prompt
// LLM token 比较大 的
// LLM 学习
// AIGC
try {
// pormpt Template langchain
const prompt = `
你是一个课程助手,请根据以下课程信息回答问题:
只回答课程信息相关的内容,如果问题与课程无关,
请礼貌告知你只能回答与课程相关的问题。
课程信息:${courseInfo}
问题:${question}
`
const response = await openai.chat.completions.create({
model: 'gpt-3.5-turbo',
messages: [
{
role: 'system',
content: '你是一个专业课程助手, 根据课程信息回答问题。'
},
{
role: 'user',
content: prompt
}
],
temperature: 0,
max_tokens: 1000,
})
return response.choices[0].message.content
} catch(err) {
console.log(err)
}
}
answerQuestion函数是整个代码的核心逻辑所在,如同大脑指挥身体行动一般。它首先通过await readCourseInfo()耐心等待课程信息被读取出来。接着,它精心构建了一个提示(prompt),这个提示就像是给大语言模型下达的详细指令,将课程信息和用户的问题巧妙融合在一起。在这个提示中,我们明确告诉模型只回答与课程信息相关的内容,就像给模型划定了一个工作范围。随后,通过openai.chat.completions.create方法,我们向 OpenAI 的聊天完成接口发送请求,指定使用gpt-3.5-turbo模型,并清晰定义了消息的角色和内容。如果一切顺利,模型会返回一个回答,我们提取并返回这个回答;如果出现错误,比如网络问题或模型调用失败,我们会将错误信息打印出来,方便排查问题。
ini
const question = '有几门课程啊?'
answerQuestion(question)
.then(answer => {
console.log(answer)
})
这部分代码就像是给整个系统下达了一个启动指令。我们定义了一个用户问题,然后调用answerQuestion函数,将问题传递进去,就像把一个任务交给了前面构建的智能系统。通过.then方法,我们处理模型返回的回答,就像打开一个包裹,取出里面的答案,并将其打印到控制台,呈现在我们眼前。
总结
RAG 技术不仅为 AI 应用带来了更高的准确性和灵活性,还为开发者提供了一种创新的思路,能够开发出更智能、更贴合用户需求的 AI 系统。通过本文的介绍以及代码示例,相信大家对 RAG 技术有了更深入的了解,期待在未来,RAG 技术能够在更多领域开花结果,为我们的生活和工作带来更多便利与惊喜。