项目简介
本项目旨在开发能够处理用户上传的金融文本与数据中的专业术语和复杂知识,用ai实现专家级别的查询和分析的金融问答大模型系统。
基于大模型应用开发的教程,进行一定的封装完善得到的有知识库助手功能的金融对话大模型项目,核心是针对glm4大模型 API 实现了底层封装,基于 Langchain 搭建了可切换模型的检索问答链,并实现 Gradio 和Vue结合部署的个人轻量大模型应用。
项目架构
整体架构
本项目为一个基于大模型的个人知识库助手,基于 LangChain 框架搭建,核心技术包括 LLM API 调用、向量数据库、检索问答链等。项目整体架构如下:
本项目从底向上依次分为 LLM 层、数据层、数据库层、应用层与服务层。
① LLM 层主要基于 zhipuai API 进行了 LLM 调用封装,支持用户以统一的入口、方式来访问不同的模型,支持随时进行模型的切换;
② 数据层主要包括个人知识库的源数据以及 Embedding API,源数据经过 Embedding 处理可以被向量数据库使用;
③ 数据库层主要为基于个人知识库源数据搭建的向量数据库,在本项目中我们选择了 Chroma;
④ 应用层为核心功能的最顶层封装,我们基于 LangChain 提供的检索问答链基类进行了进一步封装,从而支持不同模型切换以及便捷实现基于数据库的检索问答;
⑤ 最顶层为服务层,我们分别实现了 Gradio 搭建 Demo 来支持本项目的服务访问。
代码结构
本项目的完整代码存放于 project 目录下,实现了项目的全部功能及封装,代码结构如下:
-project(星号*代表该类含有前端开发中需要调用的方法)
-readme.md 项目说明
-llm LLM调用封装
-zhipuai_llm.py 自定义智谱AI LLM
-*call_llm.py(对话都需要用到,其中chat with llm直接用到) 将各个 LLM 的原生接口封装在一起
-embedding embedding调用封装
-zhipuai_embedding.py 自定义智谱AI embedding
-database 数据库层封装
-knowledge_db 存储源数据的文件夹
-vector_data_base 存储向量数据库的文件夹,数据库文件为chroma.sqlite3
-*create_db.py(知识库文件向量化) 处理源数据及初始化数据库封装
-chain 应用层封装
-*qa_chain.py 封装检索问答链(chat db without history),返回一个检索问答链对象
-*chat_qa_chian.py:封装对话检索链(chat db with history),返回一个对话检索链对象
-get_vectordb.py 用于获取或创建向量数据库对象(辅助方法,被上面两个方法使用)
-model_to_llm (辅助方法,被上面两个方法使用)
-serve 服务层封装
-run_gradio.py 启动 Gradio 界面
-补充
-模型用的是glm4模型,api为7cf22af17f2d01144caf46eda1550b1e.hu1OH9O4YeKTWlgM(节约使用)
项目逻辑
- 用户:可以通过 run_gradio 启动整个服务;
- 服务层调用 qa_chain.py 或 chat_qa_chain 实例化对话检索链对象,实现全部核心功能;
- 服务层和应用层都可以调用、切换 prompt_template.py 中的 prompt 模板来实现 prompt 的迭代;(没做该功能)
- 也可以直接调用 call_llm 中的 get_completion 函数来实现不使用数据库的 LLM;
- 应用层调用已存在的数据库和 llm 中的自定义 LLM 来构建检索链;
- 如果数据库不存在,应用层调用 create_db.py 创建数据库,该脚本可以使用 zhipuai embedding
各层简析
1. LLM 层
LLM 层主要功能为将 zhipuai API 进行封装
2.数据层
数据层主要包括个人知识库的源数据(包括 pdf、txt、md 等)和 Embedding 对象。源数据需要经过 Embedding 处理才能进入向量数据库,我们在数据层自定义了智谱提供的 Embedding API 的封装,支持上层以统一方式调用智谱 Embedding。
3.数据库层
数据库层主要存放了向量数据库文件。同时,我们在该层实现了源数据处理、创建向量数据库的方法。
4.应用层
应用层封装了整个项目的全部核心功能。我们基于 LangChain 提供的检索问答链,在 LLM 层、数据库层的基础上,实现了本项目检索问答链的封装。自定义的检索问答链除具备基本的检索问答功能外,也支持通过 model 参数来灵活切换使用的 LLM。我们实现了两个检索问答链,分别是有历史记录的 Chat_QA_Chain 和没有历史记录的 QA_Chain。
5.服务层
服务层主要是基于应用层的核心功能封装,实现了 Demo 的搭建。在本项目中,我们分别实现了通过 Gradio 搭建前端界面与 FastAPI 进行封装,支持多样化的项目调用。
LLM开发流程和规划
经过学习和分析,我们将大模型开发分解为以下几个流程,也确定了接下来的工作阶段。
确定目标:
在进行开发前,我们首先需要确定开发的目标,即要开发一款面向金融工作者和投资者以及金融爱好者和初学者的智能金融问答分析大模型系统。
核心功能:
1、 上传文档、创建知识库;
2、 选择知识库,检索用户提问的相关片段;
3、 提供专业的金融解读和分析,获取大模型回答;
4、 历史对话记录;
5、web UI
确定技术架构和工具
框架:LangChain
Embedding模型:智谱
数据库:Chroma
大模型:GLM
数据准备与向量知识库构建
本项目实现原理如下:加载本地文档 -> 读取文本 -> 文本分割 -> 文本向量化 -> question 向量化 -> 在文本向量中匹配出与问句向量最相似的 top k 个 -> 匹配出的文本作为上下文和问题一起添加到 Prompt 中 -> 提交给 LLM 生成回答。
1. 收集和整理用户提供的文档
用户常用文档格式有 PDF、TXT、MD 等,首先,我们可以使用 LangChain 的文档加载器模块方便地加载用户提供的文档,或者使用一些成熟的 Python 包进行读取。
由于目前大模型使用 token 的限制,我们需要对读取的文本进行切分,将较长的文本切分为较小的文本,这时一段文本就是一个单位的知识。
2. 将文档词向量化
使用文本嵌入(Embeddings)技术对分割后的文档进行向量化,使语义相似的文本片段具有接近的向量表示。然后,存入向量数据库,完成 索引(index) 的创建。
利用向量数据库对各文档片段进行索引,可以实现快速检索。
3. 将向量化后的文档导入 Chroma 知识库,建立知识库索引
Langchain 集成了超过 30 个不同的向量数据库。Chroma 数据库轻量级且数据存储在内存中,这使得它非常容易启动和开始使用。
将用户知识库内容经过 Embedding 存入向量数据库,然后用户每一次提问也会经过 Embedding,利用向量相关性算法(例如余弦算法)找到最匹配的几个知识库片段,将这些知识库片段作为上下文,与用户问题一起作为 Prompt 提交给 LLM 回答。
项目规划
大模型集成与 API 连接
集成 GLM 大模型,配置 API 连接。
编写代码,实现与大模型 API 的交互,以便获取问题回答。
核心功能实现
1.构建 Prompt Engineering,实现大模型回答功能,根据用户提问和知识库内容生成回答。
2.实现流式回复,允许用户进行多轮对话。
3.添加历史对话记录功能,保存用户与助手的交互历史。
核心功能迭代优化
进行验证评估,收集 Bad Case。
根据 Bad Case 迭代优化核心功能实现。
前端与用户交互界面开发
1.使用 Vue 搭建前端界面。
2.实现用户上传文档、创建知识库的功能。
3.设计用户界面,包括问题输入、知识库选择、历史记录展示等。
部署测试与上线
1.部署问答助手到服务器或云平台,确保可在互联网上访问。
2.进行生产环境测试,确保系统稳定。
3.上线并向用户发布。