重磅开源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 中,以生成既知情又符合上下文的响应。
文档及其嵌入内容通过自动实时流程或定期批处理定期更新。此持续更新过程对于保持 RAG 系统检索到的信息的准确性和相关性非常重要。
六、提示、微调和 RAG 之间的区别
有几种方法可以充分利用语言模型。三种常见技术是提示、微调和 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 应用程序:
npxcreate-next-app--examplehttps://github.com/vercel/ai/tree/main/examples/next-langchainnext-retriever
在本教程中,我们将使用 vercel 的 langchain 集成模板。接下来,我们可以安装依赖项。
cdnext-retriever
npminstall
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-urlshttp://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:minioserver/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。
dockercomposeup-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";
exportconstdynamic="force-dynamic";
exportconstmaxDuration=60;
functiongeneratePrompt(query:string,passages:string[]):string{
letprompt:string=
"###Instructions:\n"+
"Thefollowingcontextconsistsofanorderedlistofsources.Ifyoucanfindanswersfromthecontext,usethecontexttoprovidealongresponse.YouMUSTcitethecontexttitlesandsourceURLsstrictlyinMarkdownformatinyourresponse.Ifyoucannotfindtheanswerfromthesources,useyourknowledgetocomeupwithareasonableansweranddonotciteanysources.Ifthequeryaskstosummarizethefileoruploadedfile,provideasummarizationbasedontheprovidedsources.Iftheconversationinvolvescasualtalkorgreetings,relyonyourknowledgeforanappropriateresponse.";
prompt+=`###Query:\n${query}\n`;
if(passages.length>0){
prompt+=`\n###Context:\n${JSON.stringify(passages)}\n`;
}
prompt+="###Response:";
returnprompt;
}
exportasyncfunctionPOST(req:Request){
const{
messages,
}:{
messages:Message[];
}=awaitreq.json();
constmodel=newChatOpenAI(
{
model:"gpt-4o",
},
{
baseURL:process.env.OPENAI_API_BASE_URL,
},
);
constquery=messages[messages.length-1].content;
const{passages}=awaitfetch("http://127.0.0.1:8090/retrieve",{
method:"
OST",
headers:{
"Content-Type":"application/json",
},
body:JSON.stringify({
question:query,
}),
})
.then((res)=>{
if(res.ok){
returnres.json();
}else{
thrownewError("Failedtofetch");
}
})
.catch((err)=>{
return{docs:[],passages:[]};
});
constprompt=generatePrompt(query,passages);
conststream=awaitmodel.stream(
messages.map((message)=>
message.role=="user"
?newHumanMessage(prompt)
:newAIMessage(message.content),
),
);
returnnewStreamingTextResponse(LangChainAdapter.toAIStream(stream));
接下来,在 .env.local 中设置 OPENAI_API_KEY 环境变量。
cp.env.local.example.env.local
现在,启动你的 Next.js 应用程序,你将看到其效果。

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