大语言模型langchain+ChatGLM3-6B+本地知识库实战

本文详细描述了如何在阿里云环境中利用langchain和ChatGLM3-6B模型创建对话系统,包括微调、本地知识库的搭建、环境配置(如conda环境和硬件资源选择),以及如何加载和预处理本地知识库,以提升模型的行业特定知识应用能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大语言模型langchain+ChatGLM3-6B+本地知识库实战

目标

  • 进行langchain创建,以ChatGLM3-6B作为对话模型。
  • 在langchain环境下,进行本地知识库定制。

微调、本地知识库和 Prompt基本概念

微调、本地知识库和 prompt 是LMM模型调整和优化中的重要概念,它们之间有一定的关系和区别。

  • 微调(Finetuning)是一种让预先训练好的模型适应特定任务或数据集的低成本方案。
  • 本地知识库(Local Knowledge Base)是一种存储行业特定信息的数据库,它可以为LMM模型提供实时、动态的知识补充。
  • Prompt 是一种用于引导模型生成特定类型回答的输入提示。

1、环境准备

在aliyun选择硬件资源,选择镜像版本时格外注意pytorch、cuda的版本:pytorch=2.1.2、cuda=12.1、python=3.10,还有modelscope=1.11.0与Tensorflow=2.14.0。

序号资源明细
132G内存,16G显卡(NVidia Tesla V100),Ubuntu20.04。
2pytorch=2.1.2、cuda=12.1、python=3.10
3modelscope=1.11.0与Tensorflow=2.14.0

2、创建conda虚拟环境

conda create -n langchain python=3.10
conda activate langchain

3、langchain+chatglm3-6b模型源码下载

  • 克隆 langchain-ChatGLM 源码
git clone https://github.com/imClumsyPanda/langchain-ChatGLM.git
  • 克隆text2vec-large-chinese模型
git lfs install

wget https://aliendao.cn/model_download.py

pip install huggingface_hub

python model_download.py --repo_id GanymedeNil/text2vec-large-chinese
  • 克隆ChatGLM3-6B
git clone https://github.com/THUDM/ChatGLM3

cd ChatGLM3

git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git chatglm3-6b-models
  • 测试ChatGLM3-6B能否正常启动
#按照ChatGLM3的readme.md执行requirements.txt
pip install -r requirements.txt

#web_demo_gradio.py调用出错,将这个代码复制到ChatGLM3目录,然后降级gradio从4.1*降级到3.40
pip install gradio==3.40.0
  • 安装langchain依赖
# 进入目录
$ cd langchain-ChatGLM

# 安装全部依赖
$ pip install -r requirements.txt 
$ pip install -r requirements_api.txt
$ pip install -r requirements_webui.txt
  • 初始化langchain
python copy_config_example.py
#ToDO:修改model_copy.py相关参数

#按照官方教程,执行以下代码会报错,大概率是embd模型有误
#python init_database.py --recreate-vs

其中,model_copy.py里的默认内容不需要删除(有些教程建议删除),将embedding\model相关路径改成绝对路径即可。

  • 启动langchain UI
#一键启动
python startup.py -a

以下为一键启动后的信息:

==============================Langchain-Chatchat Configuration==============================
操作系统:Linux-4.19.24-7.34.cbp.al7.x86_64-x86_64-with-glibc2.35.
python版本:3.10.13 (main, Sep 11 2023, 13:44:35) [GCC 11.2.0]
项目版本:v0.2.10
langchain版本:0.0.354. fastchat版本:0.2.35


当前使用的分词器:ChineseRecursiveTextSplitter
当前启动的LLM模型:['chatglm3-6b', 'zhipu-api', 'openai-api'] @ cuda
{'device': 'cuda',
 'host': '0.0.0.0',
 'infer_turbo': False,
 'model_path': '/mnt/workspace/langchain-ChatGLM/ChatGLM3/THUDM/chatglm3-6b',
 'model_path_exists': True,
 'port': 20002}
{'api_key': '',
 'device': 'auto',
 'host': '0.0.0.0',
 'infer_turbo': False,
 'online_api': True,
 'port': 21001,
 'provider': 'ChatGLMWorker',
 'version': 'glm-4',
 'worker_class': <class 'server.model_workers.zhipu.ChatGLMWorker'>}
{'api_base_url': 'https://api.openai.com/v1',
 'api_key': '',
 'device': 'auto',
 'host': '0.0.0.0',
 'infer_turbo': False,
 'model_name': 'gpt-4',
 'online_api': True,
 'openai_proxy': '',
 'port': 20002}
当前Embbedings模型: text2vec-large-chinese @ cuda
==============================Langchain-Chatchat Configuration==============================

启动成功。

  • 可能会遇到pydantic问题,降级即可
    可能是由于本人在langchain和ChatGLM3-6B之间反复调用,执行过多次requirements.txt,一些python库的版本被更新。会导致重新执行python startup.py -a会报错。
    查阅了一下langchain的requirements.txt中的pydantic==1.10.13,需降级:
pip install pydantic==1.10.13

4、运行ChatGLM3的web_demo

按照ChatGLM3中相关readme.md的教程操作。遇到找不到peft,安装:

pip install peft
  • python运行web_demo_gradio.py
python web_demo_gradio.py
  • streamlit运行web_demo_streamlit.py
#指定地址,且指定为本机127地址,自动生成端口号,浏览器可以访问
streamlit run web_demo_streamlit.py --server.address=127.0.0.1
  • Jupiter内核安装
ipython kernel install --name chatglm3-demo --user
  • streamlit调用composite_demo
    将composite_demo中的所有文件复制到ChatGLM3-6B目录中,否则修改py中的路径。
streamlit run main.py --server.address=127.0.0.1

5、运行langchain的Web UI,准备本地知识库

  • 使用本地知识库时,新建知识库,提示:

ValueError: 'text2vec-large-chinese' is not in list

  • 尝试用官网教程,也有问题:
python init_database.py --recreate-vs
  • 换个Embedding库试试。下载BAAI/bge-large-zh:
wget https://aliendao.cn/model_download.py

pip install huggingface_hub

python model_download.py --repo_id BAAI/bge-large-zh

下载完成后,将BAAI目录放到langchain根目录。创建BAAI本地知识库:

python init_database.py --recreate-vs

成功。

  • 再次启动langchian:

进入本地知识库,可以看到BAAI成功加载。

6、新建本地知识库

  • 新建本地知识库填写元信息

  • 上传word
    随便上传了一个原生的word,没有做任何预处理。报错AxiosError: Request failed with status code 403
    网上有一个说法是降级streamlit,但是我启动没有用streamlit。试试再说:

pip install streamlit==1.28.0

问题解决,可以上传。

  • 将word换成txt,重新加载

问答加载器、分词器、文档数量、源文件、向量库都是空或者叉。是否还存在问题?

2024-02-07 06:23:23,603 - utils.py[line:295] - INFO: RapidOCRDocLoader used for /mnt/workspace/langchain-ChatGLM/knowledge_base/RichardNorth/content/神经内科典型病例分析.doc
2024-02-07 06:23:24,088 - utils.py[line:377] - ERROR: PackageNotFoundError: 从文件 RichardNorth/神经内科典型病例分析.doc 加载文档时出错:Package not found at '/mnt/workspace/langchain-ChatGLM/knowledge_base/RichardNorth/content/神经内科典型病例分析.doc'
2024-02-07 06:23:24,104 - faiss_cache.py[line:38] - INFO: 已将向量库 ('RichardNorth', 'bge-large-zh') 保存到磁盘
INFO:     127.0.0.1:37936 - "POST /knowledge_base/update_docs HTTP/1.1" 200 OK
2024-02-07 06:23:24,106 - _client.py[line:1027] - INFO: HTTP Request: POST http://127.0.0.1:7861/knowledge_base/update_docs "HTTP/1.1 200 OK"

将word换成txt,重新加载,可以加载。

  • 使用知识库问答,能回答问题,但是本地知识库其实没有加载成功

观察发现,本地知识库文件上传成功了,但是在分词器、向量库等后继操作,导致在问答时失败:
未找到相关文档,该回答为大模型自身能力解答!
估计是本地知识库需要规范化,也就是需要进行预处理。

7、本地知识库预处理

参考了BAAI向量库中的本地知识库文本格式,将个人知识库txt进行处理。处理前发现文档格式确实混乱(网上下载下来的),需要进行换行、去除空格、增加markdown标题符号等。
处理完成后,再次上传,成功。

### 如何在 LangChain 中实现本地知识库 #### 创建本地知识库的工作流程 为了提高对话系统的准确性,特别是在处理特定领域的小众知识时,在LangChain中集成本地知识库成为一种有效的方法[^4]。具体来说,先将本地的知识资源进行预处理,包括但不限于文本文件、PDF文档等内容转换成适合机器理解的形式——即嵌入(embedding),并将其保存至专门设计来高效存储此类结构化信息的向量数据库内。 #### 数据准备与预处理 对于要加入到本地知识库的数据,首先要完成的是数据清洗和格式统一工作。这一步骤确保所有待索引的信息都处于最佳状态以便后续操作。接着利用合适的算法对清理后的资料实施编码过程,生成对应的embeddings表示形式。这一环节至关重要,因为高质量的embedding可以直接影响到最后查询效果的好坏[^3]。 #### 向量化与存储 一旦获得了上述提到的embeddings之后,则需考虑选用何种类型的向量数据库来进行持久化的管理。当前市面上存在多种开源解决方案可供选择,如Faiss, Pinecone等。通过API接口可以方便快捷地把这些预先计算好的特征向量存入选定的目标仓库之中[^5]。 #### 集成与应用 当一切准备工作就绪后,就可以着手于构建实际应用场景下的对话系统了。每当接收到新的用户请求时,系统会自动尝试从已建立起来的本地知识库里查找最相似条目作为辅助依据之一参与到最终回复内容生成的过程中去。这种做法不仅有助于提升回答的相关性和精确度,同时也使得整个交互体验更加自然流畅[^1]。 ```python from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS import os # 初始化 embedding 函数 embeddings_function = HuggingFaceEmbeddings() # 加载已有或新创建的向量数据库实例 vector_db_path = "path/to/vector_database" if not os.path.exists(vector_db_path): vector_store = FAISS.create_index_from_texts( texts=["example text"], embeddings=embeddings_function) else: vector_store = FAISS.load_local(path=vector_db_path) # 添加更多文本片段到现有数据库里 new_text_chunks = ["another piece of information"] for chunk in new_text_chunks: vector_store.add_texts([chunk]) # 查询最近邻节点 query_result = vector_store.similarity_search(query="search query", k=5) print(query_result) ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

North_D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值