基于 Quivr 搭建个人专属知识库

简介: Quivr 是一款使用生成 AI 技术来存储和检索非结构化信息的“第二大脑”,可以将其视为 Obsidian 的增强版,并且具备更强的人工智能功能。Quivr 可以处理几乎所有类型的数据,包括文本、图像、代码片段等。它采用先进的人工智能技术来帮助您生成和检索信息。同时,它还专注于速度和效率,确保您可以快速访问数据。您的数据安全由您掌控,Quivr 支持多个文件格式,包括文本、Markdown、PDF、PowerPoint、Excel、Word、音频、视频等。

上一篇里,树先生教大家利用 ChatGLM-6B + langchain 实现个人专属知识库,实际运行下来,发现2个问题:

1、购买的 16G 显存的 GPU 云服务,在 FP16 精度下,多轮对话到第二轮,显存就爆了,无奈只能上 INT4 量化;

2、GPU 云服务也是一笔不小的开销啊,普通个人玩家也耗费不起~

那么有没有其他解决方案呢?

今天,树先生教大家一种使用远端模型(OpenAI)构建个人知识库的解决方案—— Quivr。


Quivr 介绍

Quivr 是一款使用生成 AI 技术来存储和检索非结构化信息的“第二大脑”,可以将其视为 Obsidian 的增强版,并且具备更强的人工智能功能。


Quivr 可以处理几乎所有类型的数据,包括文本、图像、代码片段等。它采用先进的人工智能技术来帮助您生成和检索信息。同时,它还专注于速度和效率,确保您可以快速访问数据。您的数据安全由您掌控,Quivr 支持多个文件格式,包括文本、Markdown、PDF、PowerPoint、Excel、Word、音频、视频等。

从介绍上来看,支持的文件格式还算比较丰富,毕竟自诩为“第二大脑”呢!


实战

Quivr 和我们之前介绍的其他知识库方案一样,本质上都是基于 Prompt 与大模型交互来的,Quivr 用到的主要技术有:

  • LLM:GPT3.5 / GPT 4
  • Embedding:OpenAI embedding
  • 向量知识库:Supabase


准备工作

  • 海外节点云服务(项目需要与 OpenAI 交互,但交互的地址是不可配置的,这块如果想用国内节点云服务走代理那一套,需要自行改造代码)
  • Supabase 账号
  • OpenAI API Key

Supabase 创建项目

点击 New project 创建一个新项目,填写必要信息,密码那边选择自动生成就行。

项目创建完成,会来到一个欢迎页面,这里主要关注下面这两个配置参数就行,后面会用到。

其他流程我就不介绍了,这里提一点,云服务器需要放行 30005050 端口,分别对应Quivr的前后端。


项目部署

环境准备好了以后,就可以开始项目部署工作了。

下载源码

git clone https://github.com/StanGirard/quivr.git && cd quivr
# 切换到 v0.0.4分支
git checkout v0.0.4
git checkout -b v0.0.4

设置环境变量

cp .backend_env.example backend/.env
cp .frontend_env.example frontend/.env

首先修改 frontend 目录下的环境变量,还记得之前 Supabase 那边的2个配置么?拷贝到这里。其他的按实际情况修改。

然后修改 backend 目录下的环境变量,还是上面 Supabase 的配置,拷贝到这里。因为我们用的是 OpenAI 提供的服务,所以这里我们填上 OPENAI_API_KEY,ANTHROPIC_API_KEY 是选择 Claude 的配置,我们可以删了。

接下来是 JWT_SECRET_KEY,这个可以在 Supabase 这里获取。

执行 SQL

配置完了,接下来要初始化数据库了。打开 Supabase 面板,按下图点击。

将下面的 3 个 SQL 语句依次复制进去执行。

create extension vector;
-- Create a table to store your documents
create table if not exists documents (
id bigserial primary key,
content text, -- corresponds to Document.pageContent
metadata jsonb, -- corresponds to Document.metadata
embedding vector(1536) -- 1536 works for OpenAI embeddings, change if needed
);
CREATE FUNCTION match_documents(query_embedding vector(1536), match_count int)
    RETURNS TABLE(
        id bigint,
        content text,
        metadata jsonb,
        -- we return matched vectors to enable maximal marginal relevance searches
        embedding vector(1536),
        similarity float)
    LANGUAGE plpgsql
    AS $$
    # variable_conflict use_column
BEGIN
    RETURN query
    SELECT
        id,
        content,
        metadata,
        embedding,
        1 -(documents.embedding <=> query_embedding) AS similarity
    FROM
        documents
    ORDER BY
        documents.embedding <=> query_embedding
    LIMIT match_count;
END;
$$;
create table
  stats (
    -- A column called "time" with data type "timestamp"
    time timestamp,
    -- A column called "details" with data type "text"
    chat boolean,
    embedding boolean,
    details text,
    metadata jsonb,
    -- An "integer" primary key column called "id" that is generated always as identity
    id integer primary key generated always as identity
  );
-- Create a table to store your summaries
create table if not exists summaries (
    id bigserial primary key,
    document_id bigint references documents(id),
    content text, -- corresponds to the summarized content
    metadata jsonb, -- corresponds to Document.metadata
    embedding vector(1536) -- 1536 works for OpenAI embeddings, change if needed
);
CREATE OR REPLACE FUNCTION match_summaries(query_embedding vector(1536), match_count int, match_threshold float)
    RETURNS TABLE(
        id bigint,
        document_id bigint,
        content text,
        metadata jsonb,
        -- we return matched vectors to enable maximal marginal relevance searches
        embedding vector(1536),
        similarity float)
    LANGUAGE plpgsql
    AS $$
    # variable_conflict use_column
BEGIN
    RETURN query
    SELECT
        id,
        document_id,
        content,
        metadata,
        embedding,
        1 -(summaries.embedding <=> query_embedding) AS similarity
    FROM
        summaries
    WHERE 1 - (summaries.embedding <=> query_embedding) > match_threshold
    ORDER BY
        summaries.embedding <=> query_embedding
    LIMIT match_count;
END;
$$;

执行完成后,会产生 3 个数据表。

Docker 版本更新(可选)

这一步不是必须的,因为我买的云服务器 docker 版本比较低,所以需要升级一下,具体如何安装可以在 docker 官网上找到,这里就以 CentOS 7.6 下安装 docker 为例。

# Uninstall old versions
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
# Set up the repository
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# Install Docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Start Docker
sudo systemctl start docker

项目启动

docker compose build && docker compose up

这个过程还比较耗时。。。


项目展示

用户认证

上传知识库

知识库问答

问知识库里的问题

原始资料里内容

知识库查看


问题与改进

  • 体验过 Quivr 的朋友应该有所体会,Quivr 默认会以英文进行回复,这个其实很好解决,找到项目里的内置 prompt 改成中文就行,之前就说过,目前市面上这一套外挂知识库的开源方案,基本都是基于 prompt 来的。

  • 网页响应慢的问题,主要我们使用的都是海外节点云服务,高延时导致网页资源加载慢,之所以要用海外节点云服务,无非是因为用到了 OpenAI 的大模型与 Embedding 服务,那么有没有在国内节点上去访问 OpenAI 的方式呢?网上解决方案有很多,云函数就是其中一种解决方案,如果大家感兴趣,请点赞收藏,我会根据大家的反馈来综合考虑出一期教程。有了云函数后,替换代码里访问 openai 的地址就可以,不过 Quivr 这个项目用的是官方的 openai 组件包,改动还是比较大的,这块树先生还在研究中。
  • 出现下面这种报错的主要原因是 OpenAI 限制了普通账户的请求速率,解决办法是为你的 OpenAI 账户增加支付方式。


好了,就到这里,总的来说,使用远端模型或本地模型各有优缺点,感兴趣的朋友自行搭建体验吧,喜欢朋友别忘了点赞、转发、收藏哟~

相关文章
|
2月前
|
人工智能 大数据 数据处理
【开源项目推荐】8.9K纯中文本地GPT知识库搭建项目
【开源项目推荐】8.9K纯中文本地GPT知识库搭建项目
699 0
|
3天前
|
运维 机器人 开发者
使用阿里云百炼通过appflow模板,组合钉钉机器人搭建个人知识库评测与感想
尝试构建个人助手机制,用阿里云百炼+AppFlow+钉钉机器人,花费两午休时间解决配置问题。百炼appid复制时多出空格致错,文档未提及,耗时排查。应用创建时模型选项限于max, plus, turbo,性价比高的qwen-long未上线。期望尽快修复bug和上线新模型以降低成本。附故障排查截图。
26 1
|
2月前
|
机器人 Linux API
基于Ollama+AnythingLLM轻松打造本地大模型知识库
Ollama是开源工具,简化了在本地运行大型语言模型(ile优化模型运行,支持GPU使用和热加载。它轻量、易用,可在Mac和Linux上通过Docker快速部署。AnythingLLM是Mintplex Labs的文档聊天机器人,支持多用户、多种文档格式,提供对话和查询模式,内置向量数据库,可高效管理大模型和文档。它也是开源的,能与Ollama结合使用,提供安全、低成本的LLM体验。这两款工具旨在促进本地高效利用和管理LLMs。
143133 32
|
2月前
|
人工智能 数据安全/隐私保护
|
2月前
|
人工智能 小程序 Java
接入QAnything的AI问答知识库,可私有化部署的企业级WIKI知识库
zyplayer-doc是一款适合企业和个人使用的WIKI知识库管理工具,提供在线化的知识库管理功能,专为私有化部署而设计,最大程度上保证企业或个人的数据安全,可以完全以内网的方式来部署使用它。 您也可以将其作为企业产品的说明文档来使用,支持一键将整个空间的内容开放到互联网,提供有不同风格的开放文档页样式可供选择,以及适配了在手机端、小程序中文档的展示,省去为产品的说明文档而定制开发系统的成本。
959 0
|
2月前
|
人工智能 机器人 异构计算
使用PAI-DSW搭建基于LangChain的检索知识库问答机器人
在本教程中,您将学习如何在阿里云交互式建模(PAI-DSW)中,基于LangChain的检索知识库实现知识问答。旨在建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。
|
10月前
|
机器学习/深度学习 人工智能 算法
搭建AI知识库问答应用的实验报告
随着人工智能技术的不断发展,越来越多的企业和个人开始关注和使用AI技术来提升工作效率和生活质量。然而,搭建一个高效的AI知识库问答应用并不是一件容易的事情,需要大量的数据和计算资源支持。幸运的是,阿里云提供了丰富的免费资源,可以帮助我们轻松搭建自己的AI知识库问答应用。本文总结此次实验的步骤和完成实验的心得体会。
|
12月前
|
存储 数据采集 自然语言处理
基于大模型构建本地知识库
基于大模型构建本地知识库
3449 1
|
机器学习/深度学习 自然语言处理 算法
基于 ChatGLM-6B 搭建个人专属知识库
之前树先生教过大家如何利用微调打造一个垂直领域的 LLM 专属模型。但是微调一方面需要专业知识,通常需要很多计算资源和时间,以便在不同的超参数设置上训练多个模型并选择最佳的一个,另一方面动态扩展比较差,新增和修改原有的数据都要重新微调一次。总得来说对非专业人员不友好。 今天树先生教大家无需微调就能实现垂直领域的专业问答,利用 ChatGLM-6B + langchain 实现个人专属知识库,非常简单易上手。
9422 3
|
自然语言处理 API 数据安全/隐私保护
开源免费的知识库文档管理系统(合集+排名)
开源免费的知识库文档管理系统(合集+排名)
4871 0