10 分钟内构建您的聊天机器人应用程序(Next.js、gpt4o 和 DenserRetriever)

2024-08-17 23:03:22 浏览数 (2)

Designed by Freepik (www.freepik.com)Designed by Freepik (www.freepik.com)

在本文中,您将学习如何构建一个由 AI 驱动的聊天机器人应用程序,该应用程序允许您根据自己的数据自定义自己的知识聊天机器人。我们将介绍如何:

●使用 Next.js 构建 Web 应用程序,

●使用@vercel/ai 将 AI 集成到软件应用程序中,

●使用 DenserRetriever 检索您自己的数据。

DenserRetriever:企业级人工智能检索器。

RAG系统主要包括两个部分:检索器和生成器。人工智能检索器用于确保人工智能应用中的准确和无缝体验。而Denser Retriever 将多种搜索技术整合到一个平台中。在MTEB数据集上的实验表明,Denser Retriever可以显著提升向量搜索(VS)的基线(snowflake-arctic-embed-m模型, 在MTEB/BEIR排行榜达到了最先进的性能)。它利用梯度增强 (xgboost) 机器学习技术来结合:

  • 基于关键字的搜索,重点在于精确获取查询中提到的内容。
  • 矢量数据库非常适合查找大量可能相关的答案。
  • 机器学习重新排序器可以对结果进行微调,以确保最相关的答案位于列表顶部。

DenserRetriever官网

DenserRetriever的GitHub地址

先决条件

要完全理解本教程,您需要对 React 或 Next.js 有基本的了解。以下是构建 AI 驱动的聊天机器人应用程序所需的工具:

Docker&Docker compose - 在您的本地主机上提供 DenserRetriever api服务器。

OpenAI API——提供 API 密钥,使我们能够使用 ChatGPT 模型执行各种任务。

项目设置和软件包安装

创建 Next.js 项目

首先,通过在终端中运行以下代码片段创建一个 Next.js 应用程序:

代码语言:javascript复制
npx create-next-app --example 
https://github.com/vercel/ai/tree/main/examples/next-langchain next-retriever

在本教程中,我们将使用 vercel 的 langchain 集成模板。接下来,我们可以安装依赖项。

代码语言:javascript复制
cd next-retriever
npm install

启动 DenserRetriever

首先,将 docker-compose.yml 文件复制到您的工作目录。

代码语言:javascript复制
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-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。

代码语言:javascript复制
docker compose up -d

索引建立完成后,DenserRetriever 的状态将是健康的。

恭喜!您现在可以构建应用程序了。

构建聊天机器人应用程序

在本节中,我将引导您构建聊天机器人应用程序。要设置 Next.js 和 DenserRetriever 之间的连接,请导航到 Next.js 应用程序文件夹/api/chat并编辑文件route.ts

代码语言:javascript复制
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:n"  
    "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:n${query}n`;

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

  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));
}

接下来,在中设置您的OPENAI_API_KEY环境变量.env.local

代码语言:javascript复制
cp .env.local.example .env.local

现在,启动你的 Next.js 应用程序,你将看到奇迹。

结论

Denser Retriever 兼具了易用性和先进的准确性,如果您正在构建企业 AI 应用程序,DenserRetriever 是满足您的数据检索需求的一个非常不错的选择。

如果你想要了解更多关于 Denser Retriever,以及如何安装,还有从文本文件或网页页面构建检索索引,并在此索引上进行查询的相关信息,欢迎阅读如下文章:

Denser Retriever: 企业级AI检索器,轻松构建RAG应用和聊天机器人(完全开源)

如想了解更多关于Denser Retriever的资讯,欢迎阅读我们的博客。

0 人点赞