|

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还提供了自托管解决方案,支持企业级别生产环境的部署。 ingFang SC";font-weight: bold;color: rgb(255, 255, 255);line-height: 22px;letter-spacing: 1px;">1.1、Denser Retriever 能做什么?ingFang SC";font-weight: bold;color: rgb(24, 61, 111);line-height: 22px;letter-spacing: 1px;">
Denser Retriever 的初始版本提供了如下功能: ● 支持异构检索器,如关键词搜索、向量搜索和机器学习模型重排序。 ● 利用 xgboost 机器学习技术有效结合异构检索器。 ● 在MTEB检索基准测试上达到最先进的精确度 ● 演示如何使用 Denser Retriever 来驱动端到端应用,如聊天机器人和语义搜索。 ● 提供了详细的开发文档和安装指南 ingFang SC";font-weight: bold;color: rgb(255, 255, 255);line-height: 22px;letter-spacing: 1px;">1.2、Denser Retriever的优势ingFang SC";font-weight: bold;color: rgb(24, 61, 111);line-height: 22px;letter-spacing: 1px;">
● 完全开源:Denser Retriever 是开源的,提供透明性和持续的社区驱动改进机会。 ● 可企业级中使用:设计用于生产环境的部署,确保实际应用中的可靠性和稳定性。 ● 最先进的精度:提供最先进的准确性,提高 AI 应用质量。 ● 可扩展:无论是处理不断增长的数据需求还是扩展用户需求,Denser Retriever 都能无缝扩展以满足要求。 ● 灵活性:该工具适应广泛的应用,并可根据具体需求进行定制,是多种行业的多功能选择。 接下来,我们会介绍如何使用Denser Retriever构建一个由 AI 驱动的聊天机器人应用程序,该应用程序允许您根据自己的数据自定义自己的知识聊天机器人。 - 使用@vercel/ai 将 AI 集成到软件应用程序中,
- 使用 DenserRetriever 检索您自己的数据。
ingFang SC";font-weight: bold;color: rgb(255, 255, 255);line-height: 22px;letter-spacing: 1px;">1.3、先决条件ingFang SC";font-weight: bold;color: rgb(24, 61, 111);line-height: 22px;letter-spacing: 1px;">
要完全理解本教程,您需要对 React 或 Next.js 有基本的了解。以下是构建 AI 驱动的聊天机器人应用程序所需的工具:Docker&Docker compose - 在您的本地主机上提供 DenserRetriever api服务器。OpenAI API——提供 API 密钥,使我们能够使用 ChatGPT 模型执行各种任务。ingFang SC";font-weight: bold;color: rgb(255, 255, 255);line-height: 22px;letter-spacing: 1px;">2.1、创建 Next.js 项目ingFang SC";font-weight: bold;color: rgb(24, 61, 111);line-height: 22px;letter-spacing: 1px;">
首先,通过在终端中运行以下代码片段来创建 Next.js 应用程序:
ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;overflow-x: auto;border-radius: 8px;margin: 10px 8px;">npxcreate-next-app--examplehttps://github.com/vercel/ai/tree/main/examples/next-langchainnext-retriever在本教程中,我们将使用 vercel 的 langchain 集成模板。接下来,我们可以安装依赖项。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;overflow-x: auto;border-radius: 8px;margin: 10px 8px;">cdnext-retriever npminstall
首先,将 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 的状态是可正常运行的。 然后,您现在可以构建应用程序了。 在本节中,我将引导您构建聊天机器人应用程序。要设置 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:"POST", 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 应用程序,您将看到神奇的效果。 
此 Chatbot 应用程序演示了如何使用 DenserRetriever 为端到端应用程序提供支持。 如果您正在构建企业 AI 应用程序,DenserRetriever 是满足您的数据检索需求的绝佳选择。 |