首页 > 教程攻略 > ai资讯 >Denser Retriever: RAG中更强大的AI检索器,让您10 分钟内构建聊天机器人应用

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

来源:互联网 时间:2026-08-22 14:35:15

一、Denser Retriever 介绍

在RAG系统的世界里,检索器一直是那个决定上限的关键角色。而今天要聊的

Denser Retriever

,可以说是把多种搜索技术揉到一起的集大成者——一个真正企业级的检索器。看看它在MTEB数据集上的表现就知道了:在基线上用

snowflake-arctic-embed-m模型

跑,已经能到MTEB/BEIR排行榜的SOTA水平,而Denser Retriever还能把这个基线再往上推一截。

这个项目来自Denser.ai,创始人

黄志恒

,曾担任AWS首席科学家,领导过Amazon Kendra和Amazon Business Q项目。截至2024年7月,他的谷歌学术引用次数已经超过13,700次。更重要的是,

完全开源

——这意味着你可以用它来搭建自己专属的RAG应用和聊天机器人。

说到RAG系统,无非就是两大块:检索器与生成器。AI检索器这个角色,直接决定了整个应用的准确度和体验。而检索器又能分成两条路线:关键词搜索和向量搜索。前者靠关键词匹配,后者看语义相似性。行业内流行的工具也各有侧重,比如Elasticsearch主攻关键词,Milvus、Chroma和Pinecone则面向向量搜索。

在大语言模型时代,想快速搭建一个RAG AI应用原型已经不是难事。Langchain这类工具就能帮上大忙——比如用Langhian和Chroma搭一个法律文档分析应用,几分钟就能跑起来。

DenserAI团队推出的Denser Retriever,在快速原型设计方面确实有它的独到之处

。它把关键词搜索、向量搜索和机器学习重排序都整合到一个平台里,背后靠的是梯度提升(xgboost)机器学习技术来把它们拧在一起。

在MTEB数据集上的评估结果很能说明问题

。通过xgboost模型(记作ES+VS+RR_n)把这三种技术结合起来,相比单独的snowflake-arctic-embed-m向量搜索基线(NDCG@10得分54.24),ES+VS+RR_n模型在15个MTEB数据集上拿下了56.47的最高NDCG@10得分,绝对提升了2.23,相对提升4.11%。在业内公认的MSMARCO基准数据集上,这个组合模型更是一口气从41.77拉到47.23,相对提升高达13.07%。

安装部署方面也很省心——一个Docker Compose命令就能搞定所有工具,顺便还能构建自己的RAG应用。Denser Retriever还提供自托管方案,支持

企业级别

的生产环境部署。

1.1、Denser Retriever 能做什么?

初始版本提供了这些功能:

  • 支持异构检索器,包括

    关键词搜索、向量搜索和机器学习模型重排序

  • 通过

    xgboost

    机器学习技术有效整合这些异构检索器。
  • 在MTEB检索基准测试上做到

    最先进的精确度

  • 自带演示案例,展示如何用Denser Retriever驱动

    端到端应用

    ——比如聊天机器人和语义搜索。
  • 提供详细的开发文档和安装指南。

1.2、Denser Retriever的优势

  • 完全开源

    :开源带来的透明性和社区驱动改进机会,是闭源方案很难给到的。
  • 企业级可用

    :设计目标就是生产环境部署,可靠性和稳定性有保障。
  • 最先进的精度

    :直接提升AI应用的质量底线。
  • 可扩展

    :数据量再大、用户再多,也能无缝扩张。
  • 灵活性

    :它不只是为某一类场景设计的工具,而是能适配多种行业需求、按需定制的全能选手。

接下来,我们聊聊如何用Denser Retriever构建一个AI驱动的聊天机器人应用——这个应用允许你基于自己的数据,打造一个专属的知识聊天机器人。具体涉及:

  • 使用Next.js构建Web应用。
  • 使用@vercel/ai集成AI能力到软件应用中。
  • 使用DenserRetriever检索你自己的数据。

1.3、先决条件

理解本教程前,建议先对React或Next.js有个基本了解。工具准备上也很直接:

  • 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_JA VA_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:
" +
    "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:
${query}
`;

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

  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应用,你就会看到效果了。

四、结论

这个聊天机器人应用,清晰地展示了DenserRetriever如何为端到端应用提供检索能力。如果你正在搭建企业级的AI应用,DenserRetriever在数据检索这块,确实是个值得考虑的选择。