口碑好的网站建设方法有哪些,微信凡科互动黑了咋办,404 not found网站,网站开发一般用什么技术一、前言
自从大模型被炒的越来越火之后#xff0c;似乎国内涌现出很多希望基于大模型构建本地知识库的需求#xff0c;大概在5月底的时候#xff0c;当时Quivr发布了第一个0.0.1版本#xff0c;第一个版本仅仅只是使用LangChain技术结合OpenAI的GPT模型实现了一个最基本的…一、前言
自从大模型被炒的越来越火之后似乎国内涌现出很多希望基于大模型构建本地知识库的需求大概在5月底的时候当时Quivr发布了第一个0.0.1版本第一个版本仅仅只是使用LangChain技术结合OpenAI的GPT模型实现了一个最基本的架子功能并不够完善但可以研究研究思路当时 Quivr 通过借助于GPT的模型能力选择Supabase构建向量数据库来实现个人知识库还算是一个不错的选择自此一直有在关注 Quivr 的进展基本上Quivr的更新频率还是比较高的5月底写了一篇关于如何在本地基于Quivr构建知识库的文章之后陆陆续续基本上都有一些朋友私聊询问有关Quivr构建的一些问题也有一些对于Quivr未来功能规划方向的建议和期望如果Quivr发展的比较成熟对于个人或者中小企业或许也是一个低成本的选择。
随着这两个多月的更新Quivr已经陆续发布了五十多个版本不管是对原来功能的改进代码的重构还是扩展了很多新功能都让Quivr看起来没有原来那么弱小了基础的功能基本上也覆盖到了。感兴趣的可以尝试一下。
对于原来发布的文章和视频有感兴趣的可以从下面的链接进去因为Quivr一直在更新在部署方面可能有些许变化如果想部署最新版本的Quivr可以直接看这篇最新的升级篇即可。
[文章]Quivr 基于Supabase构建本地知识库
[视频]Quivr 基于Supabase构建本地知识库
二、功能特性
2.1、大脑扩展能力
从单个账号只支持一个大脑到现在可以支持多个大脑具体数量可以配置默认为5个这样部署一套Quivr系统就可以创建多个大脑来对知识库进行分开维护减少数据的检索范围和数据权限隔离。
用户可以根据偏好来自定义知识库比如针对产品的智能客服、针对交付的QA助理、产品经理助手等等。
2.2、大脑权限控制
支持对单个知识库根据[浏览]、[编辑]、[所有者]三个角色来设置对应的访问权限同时也支持通过链接和邮件的方式分享个人大脑给其他用户。
这样就可以很方便的实现个人私有知识库或者是公司团队共享的知识库而避免了以前每个用户都需要重复上传相同的知识导致Key的浪费和知识的冗余。
2.3、LLM扩展能力
原来的版本只支持集成GPT和Claude模型现在扩展了对本地开源模型的支持如GPT4All后续还将支持更多的开源模型。
2.4、开放API接口
Quivr采用前后端分离的独立架构Quivr 使用 FastAPI 为后端提供 RESTful API后端服务可以独立使用不需要前端应用程序我们的第三方应用也可以很方便的通过API接口集成Quivr大脑的我们自己的产品中
三、基础环境准备
3.1、先决条件
为了减少部署过程中不必要的麻烦建议操作系统选择Ubuntu 22或更高版本至于服务器只要能正常访问OpenAI的接口都可以我在GCP/AWS/阿里云上都安装过主要解决网络问题选对服务器所在区域即可。
系统内存如果只是个人用来部署玩一下建议不少于1GB2GB比较合适如果想用于正式环境则需根据具体的业务访问量配置。
系统硬盘仅仅部署演示建议不少于30GB。
接下来将演示在 Ubuntu 22 版本上快速部署Quivr来构建本地知识库系统。
3.2、安装Docker Docker-Compose
首先安装 Docker 和 Docker Compose 可以按照以下步骤进行操作
1、更新系统软件包列表
sudo apt update2、安装Docker依赖的软件包
sudo apt install apt-transport-https ca-certificates curl software-properties-common3、添加Docker官方的GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg4、添加Docker的软件源
echo deb [archamd64 signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null5、更新软件包列表
sudo apt update6、安装Docker Engine
sudo apt install docker-ce docker-ce-cli containerd.io7、验证Docker是否正确安装
sudo docker run hello-world8、安装Docker Compose
sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose9、添加执行权限
sudo chmod x /usr/local/bin/docker-compose10、验证Docker Compose是否正确安装
docker-compose --version现在您已经成功在Ubuntu上安装了Docker和Docker Compose。您可以使用这些命令来管理和运行容器化的应用程序。
错误failed to update store for object type *libnetwork.endpointCnt: Key not found in store
Restart docker deamon would fix it.For ubuntu:sudo service docker restart四、创建Supabase项目
Supabase是一个开源的Firebase替代品。使用 Postgres 数据库、身份验证、即时 API、边缘函数、实时订阅、存储和向量嵌入。一个免费账户可以创建2个项目。
1、注册账户
前往https://supabase.com/可以注册免费账户。
2、创建项目
3、配置网站URL和重定向地址
主要用于密码重置和电子邮件重定向跳转链接。地址为系统前端访问地址http://ip:3000
五、部署Quivr应用
5.1、克隆存储库 git clone https://github.com/StanGirard/Quivr.git cd Quivr可以使用 ls -alh 命令查看所有文件包含隐藏文件
一般Quivr每周都会在主分支更新新的内容会存在一定未知的bug建议选择一个最新的release稳定版本进行部署
5.2、复制.XXXXX_env文件
新版本后端代码重构了新的配置文件注意在backend/core/目录下面。 cp .backend_env.example backend/core/.env
cp .frontend_env.example frontend/.env5.3、更新frontend/.env文件
NEXT_PUBLIC_ENVlocal
NEXT_PUBLIC_BACKEND_URLhttp://你的IP:5050/
NEXT_PUBLIC_SUPABASE_URLyour supabase project url
NEXT_PUBLIC_SUPABASE_ANON_KEYyour supabase api key
NEXT_PUBLIC_JUNE_API_KEYyour june api key
请注意如果Quivr部署在本机电脑backend_url直接使用localhost如果Quivr部署在本地服务器或者云服务器则需要将后端URL修改为你服务器的实际的IP地址。很多人会忽略这个配置 关于NEXT_PUBLIC_JUNE_API_KEY属性的配置说明
Quivr 集成了 June Analytics 提供的API接口在集成了June Analytics 之后你只需要在系统中配置正确的June API密钥即June key然后June网站会自动开始收集和跟踪系统的数据。
一旦数据开始被收集你可以登录到June Analytics的仪表板并在其中查看和分析收集到的数据。June仪表板提供了一个用户友好的界面用于浏览各种报告、图表和指标以便你了解用户行为、事件触发和其他关键指标。
通过June仪表板你可以探索不同的分析视图如用户活动、事件追踪、转化率等。你可以根据时间范围、特定用户或自定义事件来过滤和细化数据以获取更具体的见解和洞察。
如果是正式上线的站点可以按需选择接入默认可以不用考虑设置此参数如果需要收集和分析网站的数据可以去注册June账号申请一个June Key 5.4、更新backend/core/.env文件
SUPABASE_URLyour supabase project url
SUPABASE_SERVICE_KEYyour supabase api key
PG_DATABASE_URLnotimplementedyet
OPENAI_API_KEYyour openai api key
ANTHROPIC_API_KEYnull
JWT_SECRET_KEYyour supabase jwt secret keyAUTHENTICATEtrue
GOOGLE_APPLICATION_CREDENTIALSchange-me
GOOGLE_CLOUD_PROJECTchange-me# 默认50M
MAX_BRAIN_SIZE52428800.
MAX_REQUESTS_NUMBER2000
MAX_BRAIN_PER_USER100# Private LLM Variables
PRIVATEFalse
MODEL_PATH./local_models/ggml-gpt4all-j-v1.3-groovy.bin# RESEND
RESEND_API_KEYyour resend api key
RESEND_EMAIL_ADDRESSyour resend email address
请注意supabase_url在您的Supabase仪表板下的项目设置- API中对应的Project URLsupabase_service_key在您的Supabase仪表板下的项目设置- API中找到。使用“Project API keys”部分中找到的anon public键。您 JWT_SECRET_KEY可以在 Project Settings - JWT Settings - JWT Secret 下的 supabase 设置中找到。(注意ANTHROPIC_API_KEY可以不配置值但key不能删除否则构建会失败) 5.5、创建Supabase数据库和表
通过Web界面SQL编辑器-“New Query”在Supabase数据库上运行以下迁移脚本。 数据库脚本地址
https://github.com/StanGirard/quivr/blob/main/scripts/tables.sql
-- Create users table
CREATE TABLE IF NOT EXISTS users(user_id UUID REFERENCES auth.users (id),email TEXT,date TEXT,requests_count INT,PRIMARY KEY (user_id, date)
);-- Create chats table
CREATE TABLE IF NOT EXISTS chats(chat_id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,user_id UUID REFERENCES auth.users (id),creation_time TIMESTAMP DEFAULT current_timestamp,history JSONB,chat_name TEXT
);-- Create vector extension
CREATE EXTENSION IF NOT EXISTS vector;-- Create vectors table
CREATE TABLE IF NOT EXISTS vectors (id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,content TEXT,metadata JSONB,embedding VECTOR(1536)
);-- Create function to match vectors
CREATE OR REPLACE FUNCTION match_vectors(query_embedding VECTOR(1536), match_count INT, p_brain_id UUID)
RETURNS TABLE(id UUID,brain_id UUID,content TEXT,metadata JSONB,embedding VECTOR(1536),similarity FLOAT
) LANGUAGE plpgsql AS $$
#variable_conflict use_column
BEGINRETURN QUERYSELECTvectors.id,brains_vectors.brain_id,vectors.content,vectors.metadata,vectors.embedding,1 - (vectors.embedding query_embedding) AS similarityFROMvectorsINNER JOINbrains_vectors ON vectors.id brains_vectors.vector_idWHERE brains_vectors.brain_id p_brain_idORDER BYvectors.embedding query_embeddingLIMIT match_count;
END;
$$;-- Create stats table
CREATE TABLE IF NOT EXISTS stats (time TIMESTAMP,chat BOOLEAN,embedding BOOLEAN,details TEXT,metadata JSONB,id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY
);-- Create summaries table
CREATE TABLE IF NOT EXISTS summaries (id BIGSERIAL PRIMARY KEY,document_id UUID REFERENCES vectors(id),content TEXT,metadata JSONB,embedding VECTOR(1536)
);-- Create function to match summaries
CREATE OR REPLACE FUNCTION match_summaries(query_embedding VECTOR(1536), match_count INT, match_threshold FLOAT)
RETURNS TABLE(id BIGINT,document_id UUID,content TEXT,metadata JSONB,embedding VECTOR(1536),similarity FLOAT
) LANGUAGE plpgsql AS $$
#variable_conflict use_column
BEGINRETURN QUERYSELECTid,document_id,content,metadata,embedding,1 - (summaries.embedding query_embedding) AS similarityFROMsummariesWHERE 1 - (summaries.embedding query_embedding) match_thresholdORDER BYsummaries.embedding query_embeddingLIMIT match_count;
END;
$$;-- Create api_keys table
CREATE TABLE IF NOT EXISTS api_keys(key_id UUID DEFAULT gen_random_uuid() PRIMARY KEY,user_id UUID REFERENCES auth.users (id),api_key TEXT UNIQUE,creation_time TIMESTAMP DEFAULT current_timestamp,deleted_time TIMESTAMP,is_active BOOLEAN DEFAULT true
);--- Create prompts table
CREATE TABLE IF NOT EXISTS prompts (id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,title VARCHAR(255),content TEXT,status VARCHAR(255) DEFAULT private
);--- Create brains table
CREATE TABLE IF NOT EXISTS brains (brain_id UUID DEFAULT gen_random_uuid() PRIMARY KEY,name TEXT NOT NULL,status TEXT,description TEXT,model TEXT,max_tokens INT,temperature FLOAT,openai_api_key TEXT,prompt_id UUID REFERENCES prompts(id)
);-- Create chat_history table
CREATE TABLE IF NOT EXISTS chat_history (message_id UUID DEFAULT uuid_generate_v4(),chat_id UUID REFERENCES chats(chat_id),user_message TEXT,assistant TEXT,message_time TIMESTAMP DEFAULT current_timestamp,PRIMARY KEY (chat_id, message_id),prompt_id UUID REFERENCES prompts(id),brain_id UUID REFERENCES brains(brain_id)
);-- Create brains X users table
CREATE TABLE IF NOT EXISTS brains_users (brain_id UUID,user_id UUID,rights VARCHAR(255),default_brain BOOLEAN DEFAULT false,PRIMARY KEY (brain_id, user_id),FOREIGN KEY (user_id) REFERENCES auth.users (id),FOREIGN KEY (brain_id) REFERENCES brains (brain_id)
);-- Create brains X vectors table
CREATE TABLE IF NOT EXISTS brains_vectors (brain_id UUID,vector_id UUID,file_sha1 TEXT,PRIMARY KEY (brain_id, vector_id),FOREIGN KEY (vector_id) REFERENCES vectors (id),FOREIGN KEY (brain_id) REFERENCES brains (brain_id)
);-- Create brains X vectors table
CREATE TABLE IF NOT EXISTS brain_subscription_invitations (brain_id UUID,email VARCHAR(255),rights VARCHAR(255),PRIMARY KEY (brain_id, email),FOREIGN KEY (brain_id) REFERENCES brains (brain_id)
);--- Create user_identity table
CREATE TABLE IF NOT EXISTS user_identity (user_id UUID PRIMARY KEY,openai_api_key VARCHAR(255)
);CREATE OR REPLACE FUNCTION public.get_user_email_by_user_id(user_id uuid)
RETURNS TABLE (email text)
SECURITY definer
AS $$
BEGINRETURN QUERY SELECT au.email::text FROM auth.users au WHERE au.id user_id;
END;
$$ LANGUAGE plpgsql;CREATE OR REPLACE FUNCTION public.get_user_id_by_user_email(user_email text)
RETURNS TABLE (user_id uuid)
SECURITY DEFINER
AS $$
BEGINRETURN QUERY SELECT au.id::uuid FROM auth.users au WHERE au.email user_email;
END;
$$ LANGUAGE plpgsql;CREATE TABLE IF NOT EXISTS migrations (name VARCHAR(255) PRIMARY KEY,executed_at TIMESTAMPTZ DEFAULT current_timestamp
);INSERT INTO migrations (name)
SELECT 20230809154300_add_prompt_id_brain_id_to_chat_history_table
WHERE NOT EXISTS (SELECT 1 FROM migrations WHERE name 20230809154300_add_prompt_id_brain_id_to_chat_history_table
);
数据库脚本执行完成后在Table编辑器中可以看到已经创建完成的表。 5.6、设置yarn的超时时间
在前端容器构建依赖阶段一般会比较慢部分依赖可能由于网络原因长时间无法完成会导致yarn连接超时旧版本可以在/frontend/Dockerfile文件中修改yarn install部分的脚本增加网络超时参数新版本已增加该参数可忽略此步骤。
RUN yarn install --network-timeout 1000000 5.7、构建并启动Quivr
docker compose -f docker-compose.yml up --build -d
Quivr构建完成启动后如下图所示 六、访问Quivr
部署完成后直接访问 http://ip:3000第一次部署可以通过邮箱注册账号 6.1、添加新大脑
Quivr 有一个“大脑”的概念。它们是封闭的信息体可用于为大型语言模型 (LLM) 提供上下文以回答有关特定主题的问题。
LLM接受过各种各样的数据培训但要回答有关特定主题的问题或用于围绕特定主题进行推论需要向他们提供该主题的上下文。Quivr 使用大脑作为提供上下文的直观方式。
当在 Quivr 中选择大脑时LLM将仅获得该大脑的上下文。这允许用户为特定主题构建大脑然后用它们来回答有关该主题的问题。未来 Quivr 将会有与其他用户共享大脑的功能。
在Quivr新版本中可以支持创新多个知识库大脑实现知识库的内容检索隔离同时还支持对支持库进行授权只允许授权用户才能访问也可以通过分享链接的方式共享知识库。比几个月前的版本功能更加完善。 1、要使用大脑只需从 Quivr 界面右上角标题中的“使用大脑”图标中选择菜单即可。
2、我们可以通过单击“创建大脑”按钮来创建一个新的大脑。系统将提示您输入大脑的名称。你也可以使用账户生成的默认大脑。
3、要切换到不同的大脑只需单击菜单中的大脑名称并选择您想要使用的大脑即可。
4、如果你没有选择大脑则你上传的任何文档都将添加到默认大脑中。
5、在新建大脑知识库界面中可以设置使用的模型和模型相关参数同时也可以针对每个知识库大脑设置独有的Prompt以及所使用的OpenAI API Key不设置则默认读取配置文件中配置的Key。
注意如果在使用聊天功能时需要从菜单中先选择一个大脑才能使用聊天功能。
6.2、共享知识库
在选择大脑界面我们点击大脑后面的分享按钮通过URL或者发邮件的方式分享或者邀请其它用户加入大脑共享知识库。 Quivr 中通过集成 Resend API用于通过电子邮件邀请来处理共享大脑。
在 /backend/core/.env 文件中引入了两个环境变量来配置发送邮件的功能 RESENDAPIKEY这是 Resend 为我们的应用程序提供的唯一 API 密钥。它使我们能够以安全的方式与 Resend 平台进行通信。 RESENDEMAILADDRESS这是我们通过重新发送发送电子邮件时用作发件人地址的电子邮件地址。
从环境变量中获取 Resend API 密钥和电子邮件地址后我们使用它通过 resend.Emails.send 方法发送电子邮件。
6.2、上传知识库
新建完知识库大脑后就可以选择对应的知识库上传文档构建向量数据了支持文档、音频、视频和网页链接所有文件最终都会抽取文件中的文本内容通过调用大模型的API构建向量数据。 文件上传完成后会有如下提示信息 6.3、查询知识库
知识库文档构建完成后就可以对当前选择的知识库大脑进行内容检索了这里我们以鲁迅先生在日本留学的老师藤野先生为例来测试一下Quivr是否正确识别了知识库文档的内容。
在没学习专有知识之前GPT模型不知道鲁迅先生在日本学医的老师是谁一般会胡乱给出一个日本人的名字而且多次询问人命还不一致。 在上传完关于鲁迅先生写的《藤野先生》部分文章内容之后我们再次询问发现可以成功检索正确的答案了。
七、本地化LLM支持
Quivr 在0.0.46版本可以正式支持接入本地LLM大模型目前只支持由 GPT4All 提供支持的私有 LLM 模型其他开源模型即将推出基本上与 PrivateGPT 项目提供的功能类似。意味着你的数据永远存储在本地。LLM 将下载到服务器并在本地对你的问题运行推理。
7.1、使用方法 在 /backend/core/.env 文件中将“private”属性设置为 True。您还可以在 .env 文件中设置其他模型参数。 GPT4All 模型下载地址https://gpt4all.io/models/ggml-gpt4all-j-v1.3-groovy.bin
将下载的 GPT4All 模型放在 /backend/local_models 文件夹中。
GPT4All 是一个开源软件生态系统允许任何人在日常硬件上训练和部署强大且定制的大型语言模型 LLM。 Nomic AI 负责监督对开源生态系统的贡献确保质量、安全性和可维护性。
GPT4All 软件生态系统与以下 Transformer 架构兼容 Falcon LLaMA (including OpenLLaMA) MPT (including Replit) GPT-J Replit - 基于 Replit Inc. 的 Replit 架构 StarCoder - 基于 BigCode 的 StarCoder 架构
具体支持的模型型号列表可以从 GPT4All 的网站上查看详尽列表或下载任何支持的模型。使用这些架构之一训练的任何模型都可以量化并使用所有 GPT4All 绑定在本地运行并在聊天客户端。您可以通过为 gpt4all 后端做出贡献来添加新变体。
7.2、未来计划
Quivr 计划在本地私有化 LLM 功能中添加更多模型。使用 Hugging Face 的本地嵌入模型来减少对 OpenAI API 的依赖。未来还将添加在前端和 API 中使用私有 LLM 模型的功能。目前的版本只有部署后端才能使用。
八、Quivr路线图
九、References
Quivr GitHub
https://github.com/StanGirard/quivr
Quivr FastAPI
https://api.quivr.app/docs
Resend API
https://resend.com/overview
June Analytics
https://analytics.june.so/
GPT4All WebSite
https://gpt4all.io/index.html
GPT4All Models
https://gpt4all.io/models/ggml-gpt4all-j-v1.3-groovy.bin
GPT4All Supported Models
https://raw.githubusercontent.com/nomic-ai/gpt4all/main/gpt4all-chat/metadata/models.json