AI大模型探索之路-实战篇:基于CVP架构-企业级知识库实战落地

目录

前言

 一、概述

 二、本地知识库需求分析

1. 知识库场景分析

2. 知识库应用特点

3. 知识库核心功能 

三、本地知识库架构设计 

1. RAG架构分析 

2. 大模型方案选型

3. 应用技术架构选型

4. 向量数据库选型

5. 模型选型

三、本地知识库RAG评估

四、本地知识库代码落地

1. 文件解析函数

2. 定义文件内容分割函数

3. 数据库操作函数

4.定义一个对话链

5. 模型定义

6. 知识库导入更新处理

7. 对话聊天处理

8. LangSmith监控配置

五、本地知识库项目上线

1. 项目启动运行

2. 知识库导入更新

3. 聊天对话测试

4. 查看运行监控

总结


前言

在当今信息时代,企业的知识管理变得日益重要。随着人工智能技术的飞速发展,企业知识库的构建和维护已经从传统的文档存储和关键词检索演变为更加智能化、高效化的知识服务。CVP架构模式,作为一种结合了强大的语言理解和快速信息检索能力的先进框架,为企业提供了一个实现这一目标的有效途径。本文将深入探讨如何基于CVP(ChatGPT + VectorDB + Prompt)架构实现企业级知识库项目的落地,以及在实际过程中的应用特点和技术细节。


 一、概述

CVP架构模式的优势在于其将强大的语言理解与快速的信息检索能力相结合,使得AI应用在企业环境中更加高效和智能。本章将重点讲解如何利用CVP架构(RAG架构的一种实践)来实现企业级知识库项目的落地。这涉及到大模型的自然语言理解能力、向量化存储技术,以及RAG对问题的检索增强技术的综合运用,以完成整个技术方案的实施。

 二、本地知识库需求分析

1. 知识库场景分析

对于企业而言,构建一个符合自身业务需求的知识库是至关重要的。通过RAG、微调等技术手段,我们可以将通用的大模型转变为对特定行业有着深度理解的“行业专家”,从而更好地服务于企业的具体业务需求。这样的知识库基本上适用于每个公司各行各业,包括但不限于

1)市场调研知识库:收集和整理市场调研数据,包括竞争对手分析、消费者洞察、行业趋势等。这有助于企业制定更有效的市场策略。
2)人力资源知识库:存储和管理与人力资源管理相关的信息,包括员工手册、培训资料、绩效评估等。这有助于人力资源部门更好地进行人才管理和激励。
3)项目管理知识库:存储和管理与项目管理相关的信息,包括项目计划、进度跟踪、风险管理等。这有助于项目经理更好地进行项目管理和控制。
4)技术文档知识库:用于存储和管理企业的技术文档,如用户手册、产品说明书、维修指南等。这些文档对于技术人员来说是宝贵的资源,可以帮助他们快速解决问题或学习新的技术信息。
5)项目流程知识库:包含项目管理的最佳实践、流程图、模板和其他相关文档。它可以帮助团队成员理解项目的各个阶段,以及如何有效地协作和沟通。
6)招标投标知识库:集中存储与企业参与招标投标活动相关的所有信息,如招标文件、历史投标案例、市场分析报告等。这有助于企业提高投标的成功率和效率。
7)方案资料知识库:用于管理和分享企业的商业方案、市场策略和其他相关的商业情报。这可以帮助决策者制定更加明智的战略决策。
 

2. 知识库应用特点

在当今这个数据驱动的商业环境中,企业对知识库的依赖日益加深。一个高效、可靠的知识库系统是企业资产管理中不可或缺的组成部分。同时知识库包括以下关键特点:

1)数据隐私性强

企业的知识库包含了大量敏感信息和核心机密,如商业策略、客户数据、研究结果等。它们不仅是公司资产的一部分,更是竞争优势的重要来源。因此,维护数据的隐私性和安全性是知识库系统的头等大事。

2)准确性要求高

当员工或客户在查询知识库时,他们期待得到的不仅仅是答案,而是准确无误、切实可行的解决方案。知识库的准确性直接影响到用户的体验和企业决策的质量。因此,构建一个能够提供精确信息和数据的知识库系统,对于提高企业运营效率和增强用户信任具有不可估量的价值。

3. 知识库核心功能 

1)知识库更新与导入功能

为了保持知识库的时效性和准确性,必须定期进行内容更新和数据导入。系统应提供一个直观易用的界面,让授权人员能够方便地上传和更新文件,不论是初始化知识库还是后续的维护阶段。

2)知识库检索与增强功能

面对用户的咨询,系统需要快速而准确地提供答案。利用RAG(Retrieval-Augmented Generation)机制,即将自然语言处理技术和向量搜索结合使用,可以显著提升答案的质量。通过理解用户提问的上下文,系统先从本地知识库中检索相关信息,然后利用这些信息来增强生成模型的答案,从而产生更为全面和精确的回复。通过这种机制提高答案的相关性和信息丰富度,同时大大增强了用户体验。

三、本地知识库架构设计 

1. RAG架构分析 

1)知识数据向量化 

加载:通过文档加载器(DocumentLoaders)加载我们的数据(本地知识库)。
拆分:文本拆分器将大型文档拆分为较小的块。便于向量或和后续检索。
向量:对拆分的数据块,进行Embedding向量化处理。
存储:将向量化的数据块存储到向量数据库VectorDB 中,方便进行搜索。

2)知识数据检索返回

检索:根据用户输入,使用检索器从存储中检索相关的拆分。
生成:使用包含问题和检索到的数据的提示,交给ChatModel / LLM(聊天模型/语言生成模型)生成答案。

2. 大模型方案选型

技术方案

模型选择

调试方式

周期

数据类型

开发门槛

技术门槛

微调Fine-tuning

相关开源模型,比如:GLM,Llama等

通过微调更新积累知识

调试

时间长

敏感的数据(私有部署)

需要GPU算力环境支持

需要比较深AI算法知识储备

Embedding

通常选择闭源模型

通过更新迭代向量数据库

调试

时间短

通用可公开

基于第三方API

相对较少的AI知识技能储备

GPT助手

OpenAI或者其他大模型

通过Prompt更新知识

调试

时间短

通用可公开

非常少量的AI知识技能储备

1)方案三相当于我们常用的很多GPT助手工具,不需要开发,直接通过prompt,将背景知识库给到通用大模型,个人使用比较多。
2)通常企业级落地方案一般都会采用微调+Embedding 两者结合的方案实现,主要保证数据的私有性;
3)如果没有算力环境支撑,同时又是可公开数据则可采用Embedding方案。

本次项目实践主要采用Embedding方案,借用向量数据库实现。

3. 应用技术架构选型

LLM+VectorDB+Prompt+LanChain

用户提问后,问题信息由LangChain调用嵌入模型向量化,再查询向量数据库获取结果;

接着在由LangChain将向量数据库返回的内容给到LLM,由LLM处理整合出最终答案给到用户。

4. 向量数据库选型

在上一篇《AI大模型探索之路-应用篇12:AI大模型应用之向量数据库选型》我们有探讨相关的向量数据库选型。

本项目这次实践过程中,先采用轻量级的适合个人开发调试的向量数据库Faiss。

5. 模型选型

1. Embedding Model(嵌入模型):OpenAI 的text-embedding-3-small
2. LLM模型选择: 同样的统一采用OpenAI

主要是目前使用的是OpenAI的API KEY,先把羊毛撸到底,后续篇章再考虑其他大模型的学习使用

三、本地知识库RAG评估

在前面系列文章中Ragas篇章《AI大模型探索之路-应用篇11:AI大模型应用智能评估(Ragas)》

有详细介绍说明关于AI大模型智能评估相关,本章节不再另作说明。

四、本地知识库代码落地

1. 文件解析

定义PDF文件解析函数extract_text_from_PDF;用于解析知识库文档(后续可以扩展支持多个文件格式)

from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS#, Milvus, Pinecone, Chroma
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
from models.llm_model import get_openai_model
import streamlit as st
from config.keys import Keys
from PyPDF2 import PdfReader
from prompt.prompt_templates import bot_template, user_templatedef extract_text_from_PDF(files):text = ""for pdf in files:pdf_reader = PdfReader(pdf)for page in pdf_reader.pages:text += page.extract_text()return text

2. 文件分割

需要基于token阀值和文档结构考虑分割大小;
叠加冗余:进行分割时,要避免知识切片导致信息丢失,要保持上下文的连贯;
数据结构整理:本地知识库需要提前整理成结构清晰,且语义化的数据结构。

def split_content_into_chunks(text):text_spliter = CharacterTextSplitter(separator="\n",    # 指定分隔符为换行符("\n")将根据换行符进行分割。chunk_size=500,    # 指定每个分割后的文本块的大小为500个字符chunk_overlap=50,  # 指定分割后的文本块之间的重叠大小为50个字符length_function=len)chunks = text_spliter.split_text(text)return chunks

3. 数据库操作

基于数据库选型,操作不同的数据库服务

def save_chunks_into_vectorstore(content_chunks, embedding_model):# ① FAISS# pip install faiss-gpu (如果没有GPU,那么 pip install faiss-cpu)vectorstore = FAISS.from_texts(texts=content_chunks,embedding=embedding_model)# ② Pinecone 待扩展# ③ Milvus 待扩展return vectorstore

4.Chain对话链

用于调用langchain提供的对话检索链,将向量数据库中检索到结果给到LLM,再由LLM调用大模型整合之后返回对话答案

def get_chat_chain(vector_store):# ① 获取 LLM model(核心优化地方)llm = get_openai_model()# 用于缓存或者保存对话历史记录的对象memory = ConversationBufferMemory(memory_key='chat_history', return_messages=True)# ③ 对话链conversation_chain = ConversationalRetrievalChain.from_llm(llm=llm,retriever=vector_store.as_retriever(),memory=memory)return conversation_chain

5. 模型调用封装

定义一个LLM模型和一个嵌入模型
核心关注点temperature=0;对于知识库我们要求内容要尽量保持严谨。

def get_openai_model():llm_model = ChatOpenAI(openai_api_key=Keys.OPENAI_API_KEY,model_name=Keys.MODEL_NAME,temperature=0)return llm_modeldef get_openaiEmbedding_model():return OpenAIEmbeddings(openai_api_key=Keys.OPENAI_API_KEY)

6. 知识库导入更新

对知识库进行解析、分割、嵌入向量化、存储到向量数据库

# 1.上传PDF文件
files = st.file_uploader("上传知识文档,然后点击'提交并处理'", accept_multiple_files=True)# 2. 获取文档内容(文本)
texts = extract_text_from_PDF(files)# 3. 将获取到的文档内容进行切分
content_chunks = split_content_into_chunks(texts)# 4. 向量化并且存储数据
embedding_model = get_openaiEmbedding_model()
vector_store = save_chunks_into_vectorstore(content_chunks, embedding_model)# 5. 创建对话chain
conversation= get_chat_chain(vector_store)

7. 对话聊天处理

接收用户传入的问题,并调用Chain链进行处理后,返回结果

conversation({'question': user_input})

8. LangSmith监控配置

可以提前将下面配置设置在环境变量中

os.environ["LANGCHAIN_TRACING_V2"]= "true"
os.environ["LANGCHAIN_ENDPOINT"]= "https://api.smith.langchain.com"
os.environ["LANGCHAIN_API_KEY"]= os.getenv("LANGCHAIN_API_KEY")
os.environ["LANGCHAIN_PROJECT"]="langsmith02"

五、本地知识库项目上线

1. 项目启动运行

streamlit run knowledge_chatbot.py

2. 知识库导入更新

 访问上面8501端口地址;通过左侧栏“知识文档”处,进行上传导入知识库文件

3. 聊天对话测试

通过对话窗口,提问知识库中的内容

继续提问测试

4. 查看运行监控

登录到LangSmith平台可以查看到对话聊天过程中的整个Agent调用链路


总结

通过CVP架构的实践,我们成功地实现了一个企业级的知识库项目落地。这一过程中不仅涵盖了从需求分析到架构设计,再到代码落地和项目上线的全方位技术实施,还特别强调了数据的安全性、准确性和核心功能的实现。最终,通过精心设计的技术堆栈和细致的开发过程,我们构建了一个既安全又高效的企业知识库,它不仅能够响应用户的精准查询,还能够作为一个强大的知识中心,为企业带来信息时代的竞争优势。

文章若有瑕疵,恳请不吝赐教;若有所触动或助益,敬请关注并给予支持。

                              期待各位老铁多多支持,高质量互三!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文了解LangChain的记忆模块(理论实战+细节)

大多数LLM应用程序都有一个会话接口。会话的一个重要组成部分是能够参考会话早期的信息(上文信息)。这种存储过去互动信息的能力就称为“记忆(Memory)”。LangChain提供了许多用于向系统添加Memory的封装。 目前 LangChain 中大多…

OJ 连续数的和 球弹跳高度的计算【C判断是否为完全平方数】【格式输出%g输出全部小数部分】

连续数的和 判断是否为完全平方数有两种方法 1.遍历所有小于该数的整数,有一个满足平方与该数相等,则是完全平方数 2.用sqrt()或pow()函数对该数开方,取整(舍去小数部分),再平方,与该数相等则…

nodejs解析url参数

需要引入 url 模块; var http require(http); var url require(url);http.createServer(function (req, res) {res.writeHead(200, {Content-Type: text/plain});// 解析 url 参数var params url.parse(req.url, true).query;res.write("name: " par…

初学python记录:力扣705. 设计哈希集合

题目: 不使用任何内建的哈希表库设计一个哈希集合(HashSet)。 实现 MyHashSet 类: void add(key) 向哈希集合中插入值 key 。bool contains(key) 返回哈希集合中是否存在这个值 key 。void remove(key) 将给定值 key 从哈希集合…

Linux部署自动化运维平台Spug

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件…

halcon-轴断面检测定位

前言 通常情况下轴检测时,通常会检测轴的各个阶段的长度。但是由于各种原因,在轴断面的区域现实不明显,无法正确提取,这时候需要根据轴断面的突出部分进行检测,但是由于部分轴的粗轴和细轴区域的宽度差距相当接近&…

windows SDK编程 --- 第一个程序

一、基础知识 1.Unicode 和 ANSI 在 Windows 编程中,Unicode 和 ANSI 是两种不同的字符编码方法,它们用于定义如何在计算机中表示和存储字符数据。 ANSI ANSI(American National Standards Institute)编码是一种基于单字节的字符…

使用阿里云试用Elasticsearch学习:4. 聚合——2

近似聚合 如果所有的数据都在一台机器上,那么生活会容易许多。 CS201 课上教的经典算法就足够应付这些问题。如果所有的数据都在一台机器上,那么也就不需要像 Elasticsearch 这样的分布式软件了。不过一旦我们开始分布式存储数据,就需要小心…

Vue的学习之旅-part6-循环的集中写法与ES6增强语法

Vue的学习之旅-循环的集中写法与ES6增强语法 vue中的几种循环写法for循环for in 循环 for(let i in data){}for of 循环 for(let item of data){}reduce() 遍历 reduce( function( preValue, item){} , 0 ) ES6增强写法 类似语法糖简写对象简写函数简写 动态组件中使用 <kee…

AI应用实战2:使用scikit-learn进行回归任务实战

代码仓库在gitlab&#xff0c;本博客对应于02文件夹。 1.问题分析 在此篇博客中我们来对回归任务进行实战演练&#xff0c;背景是直播带货平台的业绩预测。第一步&#xff0c;就是分析问题。 问题痛点&#xff1a; 在直播带货平台上&#xff0c;由于市场环境多变、用户行为复…

5 个让日常编码更简单的 Python 库

今天我们一起来研究一些非常有用的第三方模块&#xff0c;可以使得我们的日常编码变得更加简单方便 sh https://github.com/amoffat/sh 如果曾经在 Python 中使用过 subprocess 库&#xff0c;那么我们很有可能对它感到失望&#xff0c;它不是最直观的库&#xff0c;可能还有些…

ubuntu 更改 ssh 默认端口 22 以加固安全

出于加固安全考虑&#xff0c;一般公司会禁用 ssh 的 22 端口号&#xff0c;因此我们需要改为其他端口。 1、ssh 命令行登录 进入台式机&#xff0c;修改 /etc/ssh/sshd_config 文件中的 Port 配置行&#xff0c;将 22 改为 8022&#xff0c;保存修改后&#xff0c;重启 ssh 服…

【汇编】存储器

存储器 计算机存储器可分为内部存储器&#xff08;又称内存或主存&#xff09;和外部存储器&#xff0c;其中内存是CPU能直接寻址的储存空间&#xff0c;由半导体器件制成 存储单元的地址和内容 计算机存储信息的基本单位是一个二进制位&#xff0c;一位可存储一个二进制数&…

企业利器大曝光:CRM系统功能剖析

企业存在的根本目标是吸引并留住顾客。为了能够追踪顾客的信息以及与他们保持联系&#xff0c;不论企业规模大小&#xff0c;都长期使用了多种传统的手工方式。——彼得德鲁克 CRM系统的功能有哪些&#xff1f;如何做客户管理一直是企业管理中的热门话题&#xff0c;CRM&#…

[大模型]Qwen1.5-7B-Chat-GPTQ-Int4 部署环境

Qwen1.5-7B-Chat-GPTQ-Int4 部署环境 说明 Qwen1.5-72b 版本有BF16、INT8、INT4三个版本&#xff0c;三个版本性能接近。由于BF16版本需要144GB的显存&#xff0c;让普通用户忘却止步&#xff0c;而INT4版本只需要48GB即可推理&#xff0c;给普通用户本地化部署创造了机会。&…

C语言——数据在内存中的存储

引言 数据是程序运行的核心。当我们用C语言编写程序时&#xff0c;我们实际上是在操纵内存中的数据。这些数据在内存中是如何储存的&#xff0c;今天我们就来学习这些内容。 基本数据类型 1.整型 int: 基本整型&#xff0c;通常占用4个字节 short: 短整型&#xff0c;通常占用…

Gradle 在 Spring 中的使用-ApiHug准备-工具篇-006

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace ApiHug …

【arduino】控制N位数码管

以下以四位共阳极数码管为例&#xff1b; 本文所有说明均以注释的方式进行。 使用方法&#xff1a; #include "DigitalTube.h" //每位共阳极对应的引脚int digital[4] {8, 11, 12, 7};//参数分别为a f b g e c d dp digital(共阳极引脚数组) length(digital长度)D…

LRUCache原理及源码实现

目录 LRUCache简介&#xff1a; LRUCache的实现&#xff1a; LinkedHashMap方法实现&#xff1a; 自己实现链表&#xff1a; 前言&#xff1a; 有需要本文章源码的友友请前往&#xff1a;LRUCache源码 LRUCache简介&#xff1a; LRU是Least Recently Used的缩写&#xf…

ChatGPT-4 Turbo 今天开放啦!附如何查询GPT-4 是否为 Turbo

2024年4月12日&#xff0c;OpenAI在X上宣布GPT-4 Turbo开放了&#xff01;提高了写作、数学、逻辑推理和编码方面的能力。另外最重要的是&#xff0c;响应速度更快了&#xff01;&#xff01; ChatGPT4 Turbo 如何升级&#xff1f;解决国内无法升级GPT4 Turbo的问题&#xff0…