Denser Retriever: RAG中更强大的AI检索器,让您10 分钟内构建聊天机器人应用
一、Denser Retriever 介绍
一、Denser Retriever 介绍
在RAG系统的世界里,检索器一直是那个决定上限的关键角色。而今天要聊的
Denser Retriever
snowflake-arctic-embed-m模型
这个项目来自Denser.ai,创始人
黄志恒
完全开源
说到RAG系统,无非就是两大块:检索器与生成器。AI检索器这个角色,直接决定了整个应用的准确度和体验。而检索器又能分成两条路线:关键词搜索和向量搜索。前者靠关键词匹配,后者看语义相似性。行业内流行的工具也各有侧重,比如Elasticsearch主攻关键词,Milvus、Chroma和Pinecone则面向向量搜索。
在大语言模型时代,想快速搭建一个RAG AI应用原型已经不是难事。Langchain这类工具就能帮上大忙——比如用Langhian和Chroma搭一个法律文档分析应用,几分钟就能跑起来。
而
DenserAI团队推出的Denser Retriever,在快速原型设计方面确实有它的独到之处
在MTEB数据集上的评估结果很能说明问题

安装部署方面也很省心——一个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在数据检索这块,确实是个值得考虑的选择。
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名