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

相关推荐
爱嘿嘿的小黑13 分钟前
docker 常用命令
前端
dangfulin16 分钟前
CSS——变换、过度与动画
前端·css
南屿欣风27 分钟前
解决 Gin Web 应用中 Air 热部署无效的问题
前端·gin
猿大师办公助手30 分钟前
Web网页内嵌福昕OFD版式办公套件实现在线预览编辑PDF、OFD文档
前端·pdf·word
幼儿园技术家1 小时前
什么是RESTful 或 GraphQL?
前端
echola_mendes2 小时前
LangChain 结构化输出:用 Pydantic + PydanticOutputParser 驯服 LLM 的“自由发挥”
服务器·前端·数据库·ai·langchain
拉不动的猪2 小时前
刷刷题46(常见的三种js继承类型及其优缺点)
前端·javascript·面试
关注我:程序猿之塞伯坦2 小时前
JavaScript 性能优化实战:突破瓶颈,打造极致 Web 体验
开发语言·前端·javascript
兰德里的折磨5502 小时前
对于后端已经实现逻辑了,而前端还没有设置显示的改造
前端·vue.js·elementui
hikktn2 小时前
【开源宝藏】30天学会CSS - DAY9 第九课 牛顿摆动量守恒动画
前端·css·开源