2026年7月9日 周四晚上19:30,报名腾讯会议了解“如何构建自进化的动态知识库(Brain)”(限30人)
免费POC, 零成本试错
FDE知识库

FDE知识库

学习大模型的前沿技术与行业落地应用


收藏

重磅开源Denser Retriever:轻松构建企业级RAG应用和聊天机器人(内附机器人构建指引)

发布日期:2024-09-25 08:33:06 浏览次数: 2619
作者:关于NLP那些你不知道的事

微信搜一搜,关注“关于NLP那些你不知道的事”

重磅开源Denser Retriever:轻松构建企业级RAG应用和聊天机器人(内附机器人构建指引)

一、什么是检索增强生成?

检索增强生成RAG是人工智能中的一种先进技术,它通过将外部知识源整合到大型语言模型 (LLM) 的生成过程中来提高其能力。

与仅基于预先训练的知识生成响应的传统 LLM 不同,RAG 从外部数据库或文档中检索相关信息,并使用这些信息生成更准确、更符合上下文的响应。

这种方法可确保输出基于最新、最权威的数据,对于需要最新信息的应用程序特别有用。

二、RAG 系统的关键组件

为了全面理解 RAG,重要的是分解其主要组成部分:信息检索 (IR) 系统和自然语言生成 (NLG) 模型。

  • 信息检索

IR 系统使用高级搜索算法来扫描大型数据集并快速找到相关信息。这些算法采用语义搜索技术,超越了简单的关键字匹配,能够理解查询的上下文和含义。

RAG 系统可以从多个来源检索数据,包括内部数据库、在线存储库和实时网络搜索。这些数据源的质量和范围对于系统的有效性至关重要。

  • 自然语言生成

NLG 组件依赖于强大的语言模型,例如 GPT-3,这些模型能够生成类似人类的文本。这些模型在庞大的数据集上进行训练,使其能够创建连贯且与上下文相关的响应。

NLG 涉及多种技术,以确保生成的文本相关且准确。这包括使用特定领域的数据微调模型和使用高级文本生成算法。

三、为什么使用 RAG?

RAG 解决了 LLM 的几个固有局限性,例如其依赖静态训练数据,这可能导致响应过时或不准确。通过集成外部知识库,RAG 使 LLM 能够访问实时信息,从而提高其响应的相关性和准确性。

这种方法降低了错误信息出现的可能性,并增强了人们对 AI 输出的信任。此外,RAG 还允许组织控制和更新知识源,从而提供更具动态性和适应性的 AI 解决方案。

四、RAG 的 4 个优点和用例

如果将实时信息检索与高级 NLG 相结合,它可以帮助 RAG 系统提供更准确、更相关且更符合语境的响应。以下是使 RAG 适用于各行各业广泛应用的关键优势。

  • 经济高效的实施

与使用新数据重新训练大型语言模型相比,使用 RAG 更经济实惠。它允许您添加新信息,而无需大量重新训练带来的高昂技术和财务费用。

  • 当前信息

RAG 可让 LLM 连接实时数据、新闻网站和其他经常更新的信息源,提供最新信息。即使出现新信息,此功能也能确保响应保持相关性和准确性。

  • 提高用户信任度

提供包含权威来源的引用或参考的回复可以帮助 RAG 建立用户信任。用户可以验证信息,从而对 AI 生成的回复更有信心。

  • 更多开发人员控制

RAG 为开发人员提供了灵活性,使他们能够更有效地更改信息源并解决问题。它还允许根据授权级别限制敏感信息检索,确保响应适用于不同的上下文。

五、RAG 如何工作?

了解 RAG 的内部工作原理有助于我们认识到其改进 AI 生成内容的潜力。RAG 流程涉及几个关键步骤:

  • 创建外部数据

外部数据存在于 LLM 原始训练数据之外,是从各种来源(例如 API、数据库或文档存储库)收集的。然后使用嵌入语言模型将这些数据转换为数值表示并存储在矢量数据库中,从而创建生成式 AI 模型可以访问的知识库。

  • 检索相关信息

当收到用户查询时,它会被转换成向量表示,并与向量数据库匹配以检索相关文档。例如,在智能聊天机器人应用中,如果员工询问他们的年假,系统将检索政策文档和过去的休假记录来回答问题。

  • 增强 LLM 提示

检索到的数据被添加到用户输入中,从而创建增强提示。此增强提示包括原始查询和相关的检索信息,然后被输入到 LLM 中,以生成既知情又符合上下文的响应。

  • 更新外部数据

文档及其嵌入内容通过自动实时流程或定期批处理定期更新。此持续更新过程对于保持 RAG 系统检索到的信息的准确性和相关性非常重要。

六、提示、微调和 RAG 之间的区别

有几种方法可以充分利用语言模型。三种常见技术是提示、微调和 RAG。每种方法的工作原理不同,各有优势。

  • 提示工程Prompt Engineering

提示工程涉及设计特定的输入或提示来指导模型的响应。这种方法方便用户且经济高效,但受到模型预训练知识的限制。它最适合一般主题和快速答案。

  • 微调Fine-Tuning

微调使用额外数据调整模型参数,以提高知识密集型任务的性能。这种方法提供了高度的定制化,但资源密集,需要大量的计算能力和专业知识。

  • RAG

RAG 结合了检索和生成的优势,使用外部知识库来指导模型的响应。它平衡了提示的简易性和微调的定制性,使其适合需要动态和上下文丰富的输出的应用程序。

RAG 允许整合最新和最相关的信息,而无需进行大量的再培训。

七、Denser Retriever项目

Denser Retriever 项目是 RAG 强大功能的典型示例。这项开源计划将多种搜索技术整合到一个平台中,使用梯度增强 (xgboost) 机器学习技术来集成基于关键字的搜索、向量数据库和机器学习排名器。

其结果是一个高度精确的搜索系统,其性能明显优于传统的向量搜索基线。

在广泛使用的 MSMARCO 基准数据集上,Denser Retriever 与最佳向量搜索基线相比,实现了 13.07% 的相对 NDCG@10 增益,证明了其卓越的性能和有效性。这一显著的改进展示了 RAG 在提高搜索和检索系统的准确性和相关性方面的潜力。

这款检索器由 Denser.ai 公司开发,其创始人黄志恒曾担任 AWS 首席科学家,领导过 Amazon Kendra 和 Amazon Business Q 项目。截至 2024 年 7 月,黄志恒的谷歌学术引用次数已超过 13,700 次。他最引人注目的贡献是开创性的“用于序列标记的双向 LSTM-CRF 模型”论文。

GitHub 存储库:https://github.com/denser-org/denser-retriever/tree/main

博客:https://denser.ai/blog/denser-retriever/

文档:https://retriever.denser.ai/

Denser Retriever 完全开源,允许用户轻松构建自己的 RAG 应用和聊天机器人。

八、Denser Retriever 能做什么?

Denser Retriever 的初始版本提供了以下功能:

  • 支持异构检索器:包括关键词搜索、向量搜索以及机器学习模型重排序,确保在各种检索场景下均能实现高效准确的结果。
  • 利用 xgboost 技术:通过 xgboost 机器学习技术,将异构检索器的结果进行有效结合,提高整体检索性能。
  • 先进的精确度:在 MTEB 检索基准测试中,Denser Retriever 达到了最先进的精确度水平,展现出其卓越的性能。
  • 驱动端到端应用:提供了如何使用 Denser Retriever 来驱动聊天机器人和语义搜索等端到端应用的示范。
  • 详细的开发文档和安装指南:为开发者提供了全面的文档支持,帮助快速上手并进行部署。

九、Denser Retriever应用:10分钟内构建聊天机器人

通过一下步骤,你将可以学习如何构建一个由 AI 驱动的聊天机器人应用程序,该应用程序允许您根据自己的数据自定义自己的知识聊天机器人。

9.1 前置条件

如下教程需要对 React 或 Next.js 有基本的了解。以下是构建 AI 驱动的聊天机器人应用程序所需的工具:

Docker&Docker compose - 在您的本地主机上提供 DenserRetriever api服务器。

OpenAI API——提供 API 密钥,让我们可以使用 ChatGPT 模型执行各种任务。

9.2 项目设置和软件包安装

9.2.1 创建 Next.js 项目

首先,通过在终端中运行以下代码片段创建一个 Next.js 应用程序:

npx create-next-app --example https://github.com/vercel/ai/tree/main/examples/next-langchain next-retriever

在本教程中,我们将使用 vercel 的 langchain 集成模板。接下来,我们可以安装依赖项。

cd next-retriever
npm install

9.2.2 启动 DenserRetriever

首先,将 docker-compose.yml 文件复制到您的工作目录。

version: "3.5"

services:
  denserretriever:
    image: jotyy318/denserretriever
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8090/"]
      interval: 30s
      timeout: 20s
      retries: 3
    ports:
      - "8090:8090"

  elasticsearch:
    image: elasticsearch:8.13.4
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms1g -Xmx1g
      - xpack.security.enabled=false
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-./docker-volume}:/usr/elasticsearch/data
    ports:
      - "9200:9200"
      - "9300:9300"

  etcd:
    container_name: milvus-etcd
    image: quay.io/coreos/etcd:v3.5.0
    environment:
      - ETCD_AUTO_COMPACTION_MODE=revision
      - ETCD_AUTO_COMPACTION_RETENTION=1000
      - ETCD_QUOTA_BACKEND_BYTES=4294967296
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-./docker-volume}/volumes/etcd:/etcd
    command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd

  minio:
    container_name: milvus-minio
    image: minio/minio:RELEASE.2020-12-03T00-03-10Z
    environment:
      MINIO_ACCESS_KEY: minioadmin
      MINIO_SECRET_KEY: minioadmin
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-./docker-volume}/volumes/minio:/minio_data
    command: minio server /minio_data
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  standalone:
    container_name: milvus-standalone
    image: milvusdb/milvus:v2.3.15
    command: ["milvus", "run", "standalone"]
    environment:
      ETCD_ENDPOINTS: etcd:2379
      MINIO_ADDRESS: minio:9000
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-./docker-volume}/volumes/milvus:/var/lib/milvus
    ports:
      - "19530:19530"
    depends_on:
      - "etcd"
      - "minio"

networks:
  default:
    name: milvus

接下来,您可以用自己的数据替换数据/code/data。如果没有,它将使用 DenserAI 的默认数据。

最后,运行以下命令启动 DenserRetriever。

docker compose up -d

索引建立完成后,DenserRetriever 的状态是可正常运行的。

然后,您现在可以构建应用程序了。

9.3 构建聊天机器人应用程序

我将引导构建聊天机器人应用程序。要设置 Next.js 和 DenserRetriever 之间的连接,请导航到 Next.js 应用程序文件夹/api/chat并编辑文件route.ts。

import { ChatOpenAI } from "@langchain/openai";
import { LangChainAdapter, Message, StreamingTextResponse } from "ai";
import { AIMessage, HumanMessage } from "langchain/schema";

export const dynamic = "force-dynamic";
export const maxDuration = 60;

function generatePrompt(query: string, passages: string[]): string {
  let prompt: string =
    "### Instructions:\n" +
    "The following context consists of an ordered list of sources. If you can find answers from the context, use the context to provide a long response. You MUST cite the context titles and source URLs strictly in Markdown format in your response. If you cannot find the answer from the sources, use your knowledge to come up with a reasonable answer and do not cite any sources. If the query asks to summarize the file or uploaded file, provide a summarization based on the provided sources. If the conversation involves casual talk or greetings, rely on your knowledge for an appropriate response.";

  prompt += `### Query:\n${query}\n`;

  if (passages.length > 0) {
    prompt += `\n### Context:\n${JSON.stringify(passages)}\n`;
  }

  prompt += "### Response:";

  return prompt;
}

export async function POST(req: Request) {
  const {
    messages,
  }: {
    messages: Message[];
  } = await req.json();

  const model = new ChatOpenAI(
    {
      model: "gpt-4o",
    },
    {
      baseURL: process.env.OPENAI_API_BASE_URL,
    },
  );

  const query = messages[messages.length - 1].content;

  const { passages } = await fetch("http://127.0.0.1:8090/retrieve", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      question: query,
    }),
  })
    .then((res) => {
      if (res.ok) {
        return res.json();
      } else {
        throw new Error("Failed to fetch");
      }
    })
    .catch((err) => {
      return { docs: [], passages: [] };
    });

  const prompt = generatePrompt(query, passages);

  const stream = await model.stream(
    messages.map((message) =>
      message.role == "user"
        ? new HumanMessage(prompt)
        : new AIMessage(message.content),
    ),
  );

  return new StreamingTextResponse(LangChainAdapter.toAIStream(stream));

接下来,在 .env.local 中设置 OPENAI_API_KEY 环境变量。

cp .env.local.example .env.local

现在,启动你的 Next.js 应用程序,你将看到其效果。

Denser Retriever 是一个非常出色的工具。它集成了多种搜索技术,结合关键词搜索、向量搜索和机器学习重排序,为构建高效的 RAG 应用提供了强大的支持。Denser Retriever 不仅具备企业级的应用潜力,还通过其开源特性为开发者提供了灵活的定制和扩展能力,是构建高性能检索系统的理想选择。

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅