来源:互联网 更新时间:2026-08-22 14:35
在RAG系统的世界里,检索器一直是那个决定上限的关键角色。而今天要聊的
这个项目来自Denser.ai,创始人
说到RAG系统,无非就是两大块:检索器与生成器。AI检索器这个角色,直接决定了整个应用的准确度和体验。而检索器又能分成两条路线:关键词搜索和向量搜索。前者靠关键词匹配,后者看语义相似性。行业内流行的工具也各有侧重,比如Elasticsearch主攻关键词,Milvus、Chroma和Pinecone则面向向量搜索。
在大语言模型时代,想快速搭建一个RAG AI应用原型已经不是难事。Langchain这类工具就能帮上大忙——比如用Langhian和Chroma搭一个法律文档分析应用,几分钟就能跑起来。
而

安装部署方面也很省心——一个Docker Compose命令就能搞定所有工具,顺便还能构建自己的RAG应用。Denser Retriever还提供自托管方案,支持
初始版本提供了这些功能:
接下来,我们聊聊如何用Denser Retriever构建一个AI驱动的聊天机器人应用——这个应用允许你基于自己的数据,打造一个专属的知识聊天机器人。具体涉及:
理解本教程前,建议先对React或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
先把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在数据检索这块,确实是个值得考虑的选择。
腾讯ima怎么把微信内容一键导入知识库?
黄金价格不断创新高!黄金稳定币XAU、PAXG市值达11亿美元
CC币价格预测(2026-2035):Canton币今日价格走势+长期价格预测
腾讯ima怎么创建共享知识库?
Celestia价格预测2026-2032:TIA币能否引领山寨币上涨行情?历史价格回顾
新浪互联网热点小时报丨2026年07月26日16时_今日实时互联网热点速递
新浪机器学习热点小时报丨2026年07月25日18时_今日实时机器学习热点速递
比特币(BTC)核心周期指标复刻历史走势 价格或跌破5.8万美元关键支撑位
新浪人工智能热点小时报丨2026年07月30日18时_今日实时人工智能热点速递
WorkBuddy微信版怎么获得积分?
车载冰箱重置到出厂设置几步?
5000元起的鼠标哪个最值得入手?
比特币 2025 年价格预测:BTC 的未来走势
笔记本移动电源推荐哪款?
结婚家电首选:Leader懒人三筒Ultra热泵洗烘一体
短剧《史上最强洪荒修为》剧情介绍
kimi提示词专家使用方法新手指南
Aptos(APT)2026-2032年价格预测与历史走势梳理
短剧《仙人跳获透视,古玩玉器我全拿捏》剧情介绍
腾讯ima知识库怎么分类管理?
手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc