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

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

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

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

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

那么有没有其他处理计划呢?

今天,树先生教咱们一种运用远端模型(OpenAI)构建个人常识库的处理计划—— Quivr。

基于 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

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

Supabase 创立项目

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

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

项目创立完结,会来到一个欢迎页面,这儿首要关注下面这两个装备参数就行,后边会用到。

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

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

基于 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个装备么?拷贝到这儿。其他的按实际情况修正。

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

然后修正 backend 目录下的环境变量,仍是上面 Supabase 的装备,拷贝到这儿。由于咱们用的是 OpenAI 提供的服务,所以这儿咱们填上 OPENAI_API_KEY,ANTHROPIC_API_KEY 是挑选 Claude 的装备,咱们能够删了。

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

接下来是 JWT_SECRET_KEY,这个能够在 Supabase 这儿获取。

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

履行 SQL

装备完了,接下来要初始化数据库了。翻开 Supabase 面板,按下图点击。

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

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

将下面的 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 个数据表。

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

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 搭建个人专属知识库

上传常识库

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

常识库问答

问常识库里的问题

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

原始材料里内容

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

常识库检查

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

问题与改善

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

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

  • 网页响应慢的问题,首要咱们运用的都是海外节点云服务,高延时导致网页资源加载慢,之所以要用海外节点云服务,无非是由于用到了 OpenAI 的大模型与 Embedding 服务,那么有没有在国内节点上去拜访 OpenAI 的方式呢?网上处理计划有许多,云函数就是其间一种处理计划,如果咱们感兴趣,请点赞保藏,我会根据咱们的反馈来综合考虑出一期教程。有了云函数后,替换代码里拜访 openai 的地址就能够,不过 Quivr 这个项目用的是官方的 openai 组件包,改动仍是比较大的,这块树先生还在研讨中。
  • 呈现下面这种报错的首要原因是 OpenAI 约束了普通账户的恳求速率,处理办法是为你的 OpenAI 账户添加付出方式。

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

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