Denser Retriever: RAG中更强大的AI检索器,让您10 分钟内构建聊天机器人应用

news2024/12/24 2:37:55

一、Denser Retriever 介绍

Denser Retriever 是一个企业级的RAG检索器,将多种搜索技术整合到一个平台中。在MTEB数据集上的实验表明,Denser Retriever可以显著提升向量搜索(VS)的基线(snowflake-arctic-embed-m模型, 在MTEB/BEIR排行榜达到了最先进的性能)。

它来自Denser.ai公司,创始人是黄志恒,曾担任 AWS 首席科学家,领导过 Amazon Kendra 和 Amazon Business Q 项目,截至 2024 年7 月,他的谷歌学术被引用次数超过 13,700 次。Denser Retriever是完全开源的,可以使用其构建自己专属的RAG应用和聊天机器人。

RAG系统主要包括两个部分:检索器和生成器。AI检索器用于确保 AI 应用中的准确和无缝体验。检索器大致分为两类:关键词搜索和向量搜索。关键词搜索依赖于关键词匹配,而向量搜索则关注语义相似性。流行的工具包括用于关键词搜索的 Elasticsearch 和用于向量搜索的 Milvus、Chroma 和 Pinecone。

在大语言模型时代,许多领域的专业人士都热衷于开发 RAG AI 应用原型。像 Langchain 这样的工具发挥着重要作用。例如,用户可以使用 Langhian 和 Chroma 快速构建一个用于法律文档分析的 RAG 应用。

DenserAI 团队推出的 Denser Retriever 侧在快速原型设计方面表现优异。Denser Retriever将多种搜索技术整合到一个平台中。它利用梯度提升(xgboost)机器学习技术,将关键词搜索、向量搜索和机器学习重排序结合在一起。

在 MTEB 数据集上评估 Denser Retriever。通过xgboost模型(记作ES+VS+RR_n)将关键词搜索、向量搜索和重排序器结合,可以显著提升向量搜索(VS)的基线(snowflake-arctic-embed-m模型, 在MTEB/BEIR排行榜达到了最先进的性能)。ES+VS+RR_n模型在15个MTEB数据集上达到了最高的NDCG@10得分56.47,相比snowflake模型(NDCG@10得分54.24)绝对提升了2.23,相对提升了4.11%。在广泛认可的MSMARCO基准数据集上,ES+VS+RR_n模型将snowflake模型的NDCG@10得分从41.77提升到47.23,带来了13.07%的相对提升。

用户可以通过一个简单的 Docker Compose 命令快速安装 Denser Retriever 及其所需工具,用于构建自己专属的RAG应用。同时Denser Retriever还提供了自托管解决方案,支持企业级别生产环境的部署。

1.1、Denser Retriever 能做什么?

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

● 支持异构检索器,如关键词搜索、向量搜索和机器学习模型重排序

● 利用 xgboost 机器学习技术有效结合异构检索器。

● 在MTEB检索基准测试上达到最先进的精确度

● 演示如何使用 Denser Retriever 来驱动端到端应用,如聊天机器人和语义搜索。

● 提供了详细的开发文档和安装指南

1.2、Denser Retriever的优势

完全开源:Denser Retriever 是开源的,提供透明性和持续的社区驱动改进机会。

可企业级中使用:设计用于生产环境的部署,确保实际应用中的可靠性和稳定性。

最先进的精度:提供最先进的准确性,提高 AI 应用质量。

可扩展:无论是处理不断增长的数据需求还是扩展用户需求,Denser Retriever 都能无缝扩展以满足要求。

灵活性:该工具适应广泛的应用,并可根据具体需求进行定制,是多种行业的多功能选择。

接下来,我们会介绍如何使用Denser Retriever构建一个由 AI 驱动的聊天机器人应用程序,该应用程序允许您根据自己的数据自定义自己的知识聊天机器人。

我们将介绍如何:

  • 使用 Next.js 构建 Web 应用程序,
  • 使用@vercel/ai 将 AI 集成到软件应用程序中,
  • 使用 DenserRetriever 检索您自己的数据。

1.3、先决条件

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

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

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

二、项目设置和包安装

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

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 的状态是可正常运行的。

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

三、构建聊天机器人应用程序

在本节中,我将引导您构建聊天机器人应用程序。要设置 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 应用程序,您将看到神奇的效果。

四、结论

此 Chatbot 应用程序演示了如何使用 DenserRetriever 为端到端应用程序提供支持。

如果您正在构建企业 AI 应用程序,DenserRetriever 是满足您的数据检索需求的绝佳选择。

五、参考资料

[1]. Denser GitHub 地址

https://github.com/denser-org/denser-retriever/tree/main

[2]. Denser Retriever官网

https://retriever.denser.ai/

[3]. snowflake-arctic-embed-m模型

https://www.snowflake.com/blog/introducing-snowflake-arctic-embed-snowflakes-state-of-the-art-text-embedding-family-of-models/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2044622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在PyCharm使用conda虚拟环境,如何使用远程Linux系统上的conda虚拟环境。

目录 在PyCharm使用conda虚拟环境(windows) 使用远程Linux系统上的conda虚拟环境 在PyCharm使用conda虚拟环境(windows) 首先请创建好虚拟环境 点击输入 conda create -n pyspark python3.8 # conda create -n 名字任取 py…

智谱AI与和鲸科技签署战略合作协议,共拓大模型产业应用与人才培养新未来

8月9日,北京智谱华章科技有限公司(智谱 AI)与上海和今信息科技有限公司(和鲸科技)在北京签署战略合作协议。智谱 AI 总裁王绍兰与和鲸科技创始人、CEO 范向伟亲临现场,发表致辞并见证签约。智谱 AI AIGC 事…

Python软件包和PIP镜像下载地址

一、Python软件下载地址 1. 官网下载 https://www.python.org/downloads/ 2. 国内第三方镜像 https://mirrors.huaweicloud.com/python/ https://registry.npmmirror.com/binary.html?pathpython/ 从以上国内镜像即可下载安装程序,Windows平台,不论是In…

网络安全 DVWA通关指南 DVWA File Inclusion(文件包含)

DVWA File Inclusion(文件包含) 文章目录 DVWA File Inclusion(文件包含)本地文件包含(LFI)漏洞利用 远程文件包含(RFL)漏洞利用 修复建议 LowMediumHighImpossible 本地文件包含(LFI) 文件包含漏洞的产生原因是 PHP 语言在通过引…

我的世界 异地联机教程 无需公网IP、服务器

主要内容 什么是Minecraft(JAVA国际版) 搭建该服务,需要准备什么 详细步骤 1.启动器 安装MC并运行MC 2.运行 MoleSDN 进行异地联机 3.小伙伴皮蛋加入鼠鼠的MC 完成联机 什么是我的世界 一款3D沙盒电子游戏,由Mojang Studio…

ComfyUI大猫咪写真工作流,哩布线上一键运行

前言 这次教程是用ComfyUI做的大猫咪写真。 视频教程 打开下面这个网站,点击【在线运行工作流】就可以一键运行ComfyUI工作流了 所有的AI设计工具,模型和插件,都已经整理好了,👇获取~ 正面关键词: Chin…

基于二叉树的近似最近邻搜索-Annoy

在推荐系统的召回阶段,会实时计算用户的表征向量(user/query),然后去物料库去寻找与用户最匹配的N个物料返回给用户;在搜索系统,也同样存在这样的需求,用户的搜素(query)…

Efficient DETR:别再随机初始化了,旷视提出单解码层的高效DETR | CVPR 2021

Efficient DETR结合密集检测和稀疏集合检测的优点,利用密集先验来初始化对象容器,弥补单层解码器结构与 6 层解码器结构的差距。在MS COCO上进行的实验表明,仅 3 个编码器层和 1 个解码器层即可实现与最先进的目标检测方法竞争的性能&#xf…

指针函数与函数指针的区别

1、指针函数 1-1、定义 指针函数,顾名思义,是一个函数,但其返回类型是指针。这意味着当这个函数被调用时,它会返回一个地址值,这个地址值指向某个类型的数据。 1-2、特点 函数性质:首先,它是…

【2024】20个高级 Java 面试问题及答案

1:解释Java序列化中transient关键字的意义。 在 Java 中,“ transient ”关键字用于指示变量在对象序列化期间不应被序列化。当变量被标记为“transient”时,意味着该变量应被序列化机制忽略。 这在处理不应持久的敏感或临时数据时特别有用…

基础 - 前端知识体系详解

一、前端三要素 HTML(结构): 超文本标记语言(Hyper Text Markup Language),决定网页的结构和内容。CSS(表现): 层叠样式表(Cascading Style Sheets&#xff0…

基于飞腾平台的Hbase的安装配置

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适…

人脸操作:从检测到识别的全景指南

人脸操作:从检测到识别的全景指南 在现代计算机视觉技术中,人脸操作是一个非常重要的领域。人脸操作不仅包括检测图像中的人脸,还涉及到人脸识别、表情分析、面部特征提取等任务。这些技术在各种应用中发挥着关键作用,从社交媒体…

Windows Server 2016 Standard 将程序加入开机自启动

分3步 1 打开“启动”文件夹:在Windows的搜索栏中输入“shell:startup”,点击搜索结果中的 “启动” 文件夹即可打开。 2 在启动文件夹中,右键点击空白区域,选择“新建”->“快捷方式”。 3 将 “程序的快捷方式” 添加到启动…

IP转地理位置:3个好用免费开源库代码及数据库对比体验详解

最近在做一个IP定位显示国家省市功能,在全网找了一圈,也每个安装体验过,测试他的数据库精准度。 本人是用PHP的第三方库,整理以下使用过的ip定位转地理位置库。 ip定位转地理位置库 1.itbdw/ip-database: **gihub地…

Qt 系统相关 - 网络与音视频

目录 一、Qt 网络 1. UDP Socket 1.1 核心 API 概览 1.2 回显服务器 1.3 回显客户端 2. TCP Socket 2.1 核心 API 概览 2.2 回显服务器 2.3 回显客户端 3. HTTP Client 3.1 核心 API 3.2 代码示例 二、Qt 音视频 1. Qt 音频 1.1 核心API概览 1.2 示例 2. Qt 视…

Java面试八股之请简述消息队列的发布订阅模式

请简述消息队列的发布订阅模式 发布订阅(Publish-Subscribe,简称 Pub/Sub)模型是一种消息传递模式,它在组件之间提供了高度的解耦和灵活性。这种模式广泛应用于分布式系统、事件驱动架构以及消息队列系统中。下面是发布订阅模型的…

什么是核心交换机?这样回答太到位了

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 你们好,我的网工朋友。 无论是企业内部通信还是对外服务,稳定高效的数据传输都是成功的关键。 在这个背景下&#xff0c…

A-CSPO课程概念澄清和实操:假定(Assumptions)、实验(Experiments)、假设(Hypotheses)

“确保你把这当作一个实验。” “我们的工作假设是客户想要这个。” 这些场景熟悉吗?你的团队(或整个组织)可能会经常混淆假定(Assumptions)、实验(Experiments)和假设(Hypotheses)等术语,这会造成混乱。 让我们澄清一下每一个…

JAVA社会校招人力资源招聘系统小程序源码

解锁职场新篇章,揭秘“社会校招人力资源招聘系统”的奥秘 一、引言:为何社会校招需要数字化升级? 在这个信息爆炸的时代,企业面临着前所未有的招聘挑战:如何从海量简历中精准筛选出合适的人才?如何高效管…