探索 RAG(检索增强生成)

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 技术能够在更多领域开花结果,为我们的生活和工作带来更多便利与惊喜。

相关推荐
蓑笠翁00141 分钟前
Python异步编程入门:从同步到异步的思维转变
linux·前端·python
程序员小杰@2 小时前
✨WordToCard使用分享✨
前端·人工智能·开源·云计算
larntin20022 小时前
vue2开发者sass预处理注意
前端·css·sass
Enti7c3 小时前
利用jQuery 实现多选标签下拉框,提升表单交互体验
前端·交互·jquery
SHUIPING_YANG3 小时前
在Fiddler中添加自定义HTTP方法列并高亮显示
前端·http·fiddler
互联网搬砖老肖4 小时前
Web 架构之前后端分离
前端·架构
水银嘻嘻4 小时前
web 自动化之 selenium+webdriver 环境搭建及原理讲解
前端·selenium·自动化
寧笙(Lycode)4 小时前
为什么使用Less替代原始CSS?
前端·css·less
m0_zj4 小时前
57.[前端开发-前端工程化]Day04-webpack插件模式-搭建本地服务器
前端·webpack·node.js
GoFly开发者5 小时前
GoFly企业版框架升级2.6.6版本说明(框架在2025-05-06发布了)
前端·javascript·vue.js