www.teandq.com
晓安科普

本地知识库搭建(开源知识库搭建)怎么可以错过

2023-10-19Aix XinLe

得益于海量的训练数据和大量的模型参数,类chatgpt大模型在各个知识领域上均有令人惊艳的表现。\x0d\x0a但是,对于一些特定的或是未曾学习过的专属知识领域,大模型却难以给出符合期望的结果。今天,带大家用大模型+个人知识库,打造你的专属知识问答助手

本地知识库搭建(开源知识库搭建)怎么可以错过

 

背景得益于海量的训练数据和大量的模型参数,类chatgpt大模型在各个知识领域上均有令人惊艳的表现但是,对于一些特定的或是未曾学习过的专属知识领域,大模型却难以给出符合期望的结果比如,企业客服、私有知识问答等。

那么,如何利用LLM搭建专属知识库问答助手呢?以下,我对各类方案进行了一个汇总,包含方案原理和具体实操,希望对你有所帮助一  方案原理大模型在专有知识问答上表现不佳,原因是模型没有见过或学习过这些知识,自然也给不出我们想要的结果。

解决思路就是:让模型看见或学习这些知识具体的,有两条路线:(1)模型训练:根据专有知识做一个训练数据集,然后用大模型在数据集上进行微调,让模型去学习这些知识类似于,你给模型出了一大本练习题,包含题目和答案,手把手教他做题。

等他学会了,考试遇到类似的题目,就知道怎么做了(2)外挂知识库:在问模型问题的时候,额外给他一些专有知识中的相关信息,让他从中找到正确的答案类似于,你给模型出了一道阅读理解题,让他先读一大段文字,然后回答问题。

从描述中大家可以看出,路线 1 实现起来相对复杂,难度较大,具有较高的门槛,此处不做详细说明;本文收集的方案都是基于路线 2 完成的,也就是外挂知识库实现路线2,有两个关键的步骤:(1)从知识库中挑选出与问题相关的内容。

这里涉及到对文档的加载、切分、向量化、相似度比对等一系列的操作(2)将挑选出的内容与问题,一起输入给大模型主要涉及prompt的编写一)怎样从知识库中找到与问题相关的内容?知识库的内容一般比较多,要想模型快速、准确地回答问题,首先需要为模型提供最相关的信息。

这一步对于最终的问答效果有着非常重要的影响试想一下,如果找到的信息太多、或者相关度不高,模型很容易迷失其中,难以给出准确的答案;类似于,你直接丢给他一本书,让他去书中寻找问题的答案,效果可想而知另一方面,如果给的信息不足、甚至完全没有相关信息,模型也就无从参考。

那么,如何从海量的知识库中寻找与问题相关的信息?1、知识库预处理加载、读取文件:读取存储在本地的知识库文件,通常是将其转化为文本格式文本分割(Text splitter):按照一定的规则(例如段落、句子、token数量等)将文本分割成各个部分

2、文本向量化和存储文本向量化:这通常涉及到NLP的特征抽取,可以通过诸如TF-IDF、word2vec、语言模型等方法将分割好的文本转化为数值向量,方便后续的文本相似度计算,即检索和问题相关的文本向量存储:文本向量化之后存储到数据库vectorstore,常见的有Pincone, Qdrant, Waviate, Milvus, Chroma等。

3、问句向量化采用和知识库文本相同的向量化处理方式,将查询问题转为语义向量,用于问题和知识库文本之间的相似度计算4、从知识库文本中挑选 top k 个相关文本这一步是信息检索的核心,一般可通过余弦相似度、欧氏距离等计算方式,找出与问题向量最接近的文本向量。

这样,我们就找到了知识库中与问题最相关的 top k 个文本二)将挑选出的内容与问题,一起输入给大模型挑选出与问题的相关文本后,和问题一起组合成prompt,输入给大模型prompt示例如下:"""已知信息:{context}。

根据上述已知信息,简洁和专业的来回答用户的问题如果无法从中得到答案,请说 “根据已知信息无法回答该问题” 或 “没有提供足够的相关信息”,不允许在答案中添加编造成分,答案请使用中文问题是:{question}"""。

其中,context部分就是相关的知识库文本,question是查询问题。三)整体流程图

二  方案实现具体的方案实现,主要在于以下几点:模型的选择和使用方式:开源模型或收费模型?本地部署还是调用API?模型应用开发工具:langchain、Quivr、闻达知识库外挂形式:文档、pdf、数据库、知识图谱、联网搜索等

一) 模型选择和使用方式开源模型优点:免费,自由度高缺点:效果不及收费的商用大模型;需要GPU资源进行部署

收费模型优点:效果好,API调用,无需GPU资源缺点:收费、自由度低公司名称产品名称地址OpenAIChatGPThttps://chat.openai.comGoogleBardhttps://bard.google.com

百度文心一言https://yiyan.baidu.com/welcomeAnthropicClaude2https://www.anthropic.com/index/claude-2Microsoft

Binghttps://www.bing.com/阿里巴巴通义千问https://tongyi.aliyun.com/科大讯飞星火https://xinghuo.xfyun.cn/更多大模型参考:https://github.com/zhengzangw/awesome-huge-models;

https://www.datalearner.com/ai-models/pretrained-models?&aiArea=-1&language=-1&contextLength=-1&openSource=-1&publisher=-1

二)模型应用开发工具从上述的方案原理可以看出,要实现外挂知识库的大模型问答,需要实现多个功能模块:如文本加载、分割、向量化、模型调用等等从头开始实现非常困难和复杂的不过,做程序员这一行的都知道,你只需要用现成的轮子就行了。

接下来,让我们看看几款大模型问答应用的开发工具LangChainLangChain(https://github.com/langchain-ai/langchain)是一个大模型应用开发框架,将大模型开发应用的许多功能进行了模块化的封装,大幅提升开发效率。

按照官网的划分,主要有6大功能模块:Data Augmented Generation数据增强生成,其实就是我们这里说到的基于额外信息的问答提供额外信息的形式有很多种,比如txt文档、pdf、知识图谱数据等。

这个功能模块中包含了文档加载、分割、向量化、存储、索引等所有功能,可以快速集成各类知识文档LLMs and Prompts大模型和提示词大模型部分封装了对不同模型的和管理和调用,如chatglm、palm、chatgpt系列等等,配置即用;提示词部分定义、封装了不同的提示词模版,如问答、对话、fewshot等等。

Memory记忆模块,用来保存和模型交互时的上下文状态,处理长期记忆,获得更加准确的结果主要包含两个部分:1)将交互过程中的输入、输出进行记忆并结构化存储,为下一步的交互提供上下文;2) 根据交互历史构建知识图谱,提供更多相关信息。

Chains链接,其实就是针对不同应用场景,封装了对模型和多个组件的一系列调用具体的,针对不同形式的知识库,chains实现了不同的调用方式:1) 与Elasticsearch数据库交互的:elasticsearch_database;。

2) 基于知识图谱问答的:graph_qa: 其中 chains/graph_qa/base.py 便实现了一个基于知识图谱实现的问答系统,具体步骤为:首先,根据提取到的实体在知识图谱中查找相关的信息,它返回的是与实体相关的所有信息,形式为三元组;然后,将所有的三元组组合起来,形成上下文;最后,将问题和上下文一起输入到qa_chain,得到最后的答案;

3)自动生成代码并执行的:llm_math等等4)面向私域数据的:qa_with_sources,其中的这份代码文件 chains/qa_with_sources/vector_db.py 则是使用向量数据库的问题回答

5)面向SQL数据源的:sql_database,可以重点关注这份代码文件:chains/sql_database/base.py6)面向模型对话的:chat_models,包括这些代码文件:__init__.py、anthropic.py、azure_openai.py、base.py、fake.py、google_palm.py、human.py、jinachat.py、openai.py、promptlayer_openai.py、vertexai.py

7)constitutional_ai:对最终结果进行偏见、合规问题处理的逻辑,保证最终的结果符合价值观8)llm_checker:能让LLM自动检测自己的输出是否有没有问题的逻辑Agents代理,其实就是执行任务的一个具体对象,你可以理解为工具人,需要去调用上述的各个组件,如信息获取、模型调用、处理输出等等,直到任务完成。

LangChain只是提供了大模型应用的各个功能模块,要搭建完整的知识库问答应用,还需要进行大量的代码开发闻达闻达(https://github.com/wenda-LLM/wenda),官方介绍:一个LLM调用平台。

目标为针对特定环境的高效内容生成,同时考虑个人和中小企业的计算资源局限性,以及知识安全和私密性问题,集成了以下功能:1)知识库:支持对接本地离线向量库、本地搜索引擎、在线搜索引擎等2)多种大语言模型:目前支持离线部署模型有。

chatGLM-6B\chatGLM2-6B、chatRWKV、llama系列(不推荐中文用户)、moss(不推荐)、baichuan(需配合lora使用,否则效果差)、Aquila-7B、InternLM

,在线API访问openai api和chatGLM-130b api3)Auto脚本:通过开发插件形式的JavaScript脚本,为平台附件功能,实现包括但不限于自定义对话流程、访问外部API、在线切换LoRA模型。

4)其他实用化所需能力:对话历史管理、内网部署、多用户同时使用等从功能来看,与langchain有些相似,也支持外挂知识库和多种大语言模型,但没有langchain全面和通用不过,这也和闻达的定位有关,针对的是开源模型的本地部署和调用;同时,封装了更多实际应用的功能,如多用户同时使用、对话历史管理等;也可以通过Auto脚步开发的形式,自定义一些功能角色(就是封装prompt)。

相比于langchain,闻达的封装程度更高,还提供了懒人安装包,可以一键运行部署,基本没什么代码开发量QuivrQuivr(https://github.com/StanGirard/quivr),是专门面向知识库问答的开源解决方案,可本地部署,开箱即用。

Quivr的特点在于:1)直接调用大模型API,如chatgpt系列、claude(开源模型部署调用目前只支持GPT4ALL)2)文本向量化采用OpenAI embedding模型3)采用Supabase向量数据库进行向量存储。

4)支持各类形式的文件:Text、Markdown、PDF、Powerpoint、Excel、Word、Audio、Video5)Quivr使用了langchain框架使用Quivr搭建知识库,你只需要部署完Quivr并配置好大模型API-key、Supabase链接,即可进行知识库的问答。

不过,你需要解决网络限制的问题三)如何选择模型和应用工具如何选择具体的方案,视具体情况而定以下是我的一些个人看法,供参考首先你需要确定使用哪种大模型商用大模型可直接调用API,无需GPU资源,但存在持续使用费用,同时国外大模型可能还存在网络和合规问题;使用开源模型,则需要GPU资源支持,但不存在边际成本。

其次,选择应用工具如果追求应用开发的高度灵活性,可使用langchain,各个功能模块可自由选择、设计,后续迭代、拓展也比较方便如果想快速上线、没有什么定制化功能,可选择闻达或者Quivr,基本没有开发工作。

其中,闻达更适合选择开源大模型本地部署,Quivr更适合调用商用模型的API三 方案范例了解了方案原理和实现方式,接下来,让我们一起看看几个优秀案例,动手搭建自己的专属知识库,体验一下实际效果一)基于LangChain + ChatGLM2 搭建知识库。

项目介绍本地知识库的问答应用,对中文场景与开源模型支持友好、可离线运行大模型:ChatGLM2(https://github.com/THUDM/ChatGLM2-6B)embedding模型:GanymedeNil/text2vec-large-chinese

开发框架:LangChain项目地址:https://github.com/chatchat-space/langchain-ChatGLM特点:高度灵活、免费、数据安全性高,需要GPU资源支持实操运行环境:此处白嫖阿里云PAI-DSW产品,可免费体验A10、V100等GPU。

1)下载源码git clone https://github.com/chatchat-space/langchain-ChatGLM.git2) 安装依赖cdlangchain-ChatGLMpipinstall -r requirements.txt

3)下载ChatGLM2模型和embedding模型git lfs installgit clone https://huggingface.co/THUDM/chatglm2-6b $PWD/chatglm2-6b

git clone https://huggingface.co/GanymedeNil/text2vec-large-chinese $PWD/text2vec4)修改配置在 configs/model_config.py

文件中,修改embedding_model_dict和llm_model_dict中的模型路径,分别配置为上一步下载的模型路径

同时,LLM_MODEL配置为“chatglm2-6b”

5)启动项目pythonwebui.py6)上传文档,即可开始知识库问答

二)基于Quivr搭建知识库项目介绍直接采用Quivr工具搭建知识库,服务器部署好Quivr,上传文件即可大模型:gpt3.5/gpt4embedding模型:openai embedding模型向量数据库。

:supabase项目地址:https://github.com/StanGirard/quivr特点:开箱即用,灵活性低、有持续费用、数据会经由外网、需要解决网络问题实操1)注册supabase(https://supabase.com/)账号并创建项目,用来存储向量化之后的知识库

注册很简单,用邮箱注册即可。登陆页面之后,点击创建项目,按照提示依次填写信息即可。

创建好项目之后,关注三个配置参数,后续会用到。

2)在创建好的supabase项目中创建库表依次点击以下图标,在脚本编辑界面中粘贴以下三个sql语句,然后点击执行,创建库表。

create extension vector;-- Create a table to store your documentscreatetableifnotexists documents (id

bigserial primary key,contenttext, -- corresponds to Document.pageContentmetadata jsonb, -- corresponds to Document.metadata

embedding vector(1536) -- 1536 works for OpenAI embeddings, change if needed);CREATEFUNCTION match_documents(query_embedding vector(

1536), match_count int)RETURNSTABLE(idbigint,contenttext,metadata jsonb,-- we return matched vectors to enable maximal marginal relevance searches

embedding vector(1536),similarity float)LANGUAGE plpgsqlAS $$# variable_conflict use_columnBEGINRETURN

querySELECTid,content,metadata,embedding,1 -(documents.embedding query_embedding) AS similarityFROM

documentsORDERBYdocuments.embedding query_embeddingLIMIT match_count;END;$$;createtablestats (-- A column called "time" with data type "timestamp"

timetimestamp,-- 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

idinteger primary keygeneratedalwaysasidentity);createtableifnotexists summaries (id bigserial primary

key,document_id bigintreferences documents(id),contenttext, -- corresponds to the summarized contentmetadata jsonb,

-- corresponds to Document.metadataembedding vector(1536) -- 1536 works for OpenAI embeddings, change if needed

);CREATEORREPLACEFUNCTION match_summaries(query_embedding vector(1536), match_count int, match_threshold

float)RETURNSTABLE(idbigint,document_id bigint,contenttext,metadata jsonb,-- we return matched vectors to enable maximal marginal relevance searches

embedding vector(1536),similarity float)LANGUAGE plpgsqlAS $$# variable_conflict use_columnBEGINRETURN

querySELECTid,document_id,content,metadata,embedding,1 -(summaries.embedding query_embedding) AS similarity

FROMsummariesWHERE1 - (summaries.embedding query_embedding) > match_thresholdORDERBYsummaries.embedding query_embedding

LIMIT match_count;END;$$;执行成功后,可以在databse中看见创建的三张表。

3)Quirv部署下载源码,依次执行以下命令gitclone https://github.com/StanGirard/quivr.git && cd quivrgitcheckout v0.0.4git

checkout -b v0.0.4配置参数cp.backend_env.example backend/.envcp.frontend_env.example frontend/.env配置frontend/.env, 图中的两个参数对应上文创建supabase project提到的Project Url 和anon key。

配置backend/.env,supabase_url、supabase_service_key分别对应supabase project中的Project Url 和service key,jwt_secret_key对应上文supabase中的jwt secret。

另外,因为要调用openai的gpt模型和embedding模型,需配置上openai的api_key

启动项目quirv采用docker进行部署,部署环境需要安装docker大家可根据具体的部署环境安装docker安装好之后,在quirv根目录下执行以下命令:docker compose build && docker compose up。

如果docker compose用不了,改成docker-compose;权限问题,添加sudo。

后记以上,对大模型专属知识库问答的原理、实现、具体案例进行了大致的梳理和说明,并针对不同情况给出了方案选择的参考意见,如有错误,恳请指正另外,如果大家有更好的解决方案,欢迎留言告知另外,在实际体验的过程中,基于知识库的大模型问答仍然存在漏答、回答不准确的情况。

要想达到令人满意的效果,还需要做大量的测试和优化工作

免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186

知识本地知识库搭建(开源知识库搭建)怎么可以错过

2023-10-19Aix XinLe147

本地知识库搭建(开源知识库搭建)怎么可以错过得益于海量的训练数据和大量的模型参数,类chatgpt大模型在各个知识领域上均有令人惊艳的表现。\x0d\x0a但是,对于一些特定的或是未曾学习过的专属知识领域,大模型却难以给出符合期望的结果。今天,带大家用大模型+个人知识库,打造你的专属知识问答助手…

历史2020高中历史学科课程标准(高中历史新旧课程标准对比)太疯狂了

2023-10-19Aix XinLe54

2020高中历史学科课程标准(高中历史新旧课程标准对比)太疯狂了2021年河南新高一学生,使用新教材老高考模式,快来看看新旧教材对比解读,了解学习方向吧。…

百科干货满满dota2西雅图(dota2西雅图ti6)

2023-10-19Aix XinLe95

干货满满dota2西雅图(dota2西雅图ti6)LGD.DOTA2战队昨天正式出发前往西雅图参加TI6!没有永远的丰碑,只有不息的战斗!兄弟们挺起胸膛,咬紧牙关,带着玄月的份一起努力,Figh…

科学科学指南针 供应商(二年级科学指南针怎么做)一篇读懂

2023-10-19Aix XinLe9

科学指南针 供应商(二年级科学指南针怎么做)一篇读懂指南针是中国古代劳动人民在长期的实践中对磁石磁性认识的结果。作为中国古代四大发明之一,它的发明对人类的科学技术和文明的发展,起了无可估量的作用。…

历史2020高中历史学科课程标准(高中历史新旧课程标准对比)原创

2023-10-19Aix XinLe157

2020高中历史学科课程标准(高中历史新旧课程标准对比)原创基于深度学习技术的青铜鼎分期断代研究*李春桃 吉林大学考古学院“古文字与中华文明传承发展工程”协同攻关创新平台戚睿华 吉林大学考古学院“古文字与…