社区供稿 | 中文 LangChain 项目的实现开源工作

news2024/12/23 3:20:39

Chinese-LangChain 是 yanqiangmiffy 同学的开源项目https://hf.co/spaces/ChallengeHub/Chinese-LangChainhttps://github.com/yanqiangmiffy/Chinese-LangChain

中文 langchain 项目,基于 ChatGLM-6b + langchain 实现本地化知识库检索与智能答案生成。

LangChain 的资料准备

海量的知识库,知识库是由一段一段的文本构成的。

LangChain 中用到的功能性语言模型

  • 基于问题搜索知识库中的文本的问题搜索知识文本功能性语言模型

  • 基于问题与问题相关的知识库文本进行问答的对话式语言模型

对话式大参数量语言模型有:

  1. chatglm

  2. LLama

  3. Bloom

基于中文预训练、问答训练、文档问答训练、多轮问答训练、人工强化反馈学习的对话式大参数语言模型有:

chatglm

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答,更多信息请参考 ChatGLM-6B 的 博客。

ChatGLM-6B:https://github.com/THUDM/ChatGLM-6BChatGLM 博客:https://chatglm.cn/blog

为了方便下游开发者针对自己的应用场景定制模型,THUDM 同时实现了基于 P-Tuning v2 的高效参数微调方法 (使用指南),INT4 量化级别下最低只需 7GB 显存即可启动微调。

THUDM:https://github.com/THUDMP-Tuning v2:https://github.com/THUDM/P-tuning-v2使用指南:https://github.com/THUDM/ChatGLM-6B/blob/main/ptuning/README.md

LLama

Huatuo-Llama-Med-Chinese:https://github.com/SCIR-HI/Huatuo-Llama-Med-Chinese

SCIR-HI 训练的医疗领域 Llama 对话式大参数语言模型

开源了经过中文医学指令精调/指令微调 (Instruct-tuning) 的 LLaMA-7B 模型。SCIR-HI 通过医学知识图谱和 GPT3.5 API 构建了中文医学指令数据集,并在此基础上对 LLaMA 进行了指令微调,提高了 LLaMA 在医疗领域的问答效果。

SCIR-HI:https://github.com/SCIR-HIChinese-LLaMA-Alpaca 开源仓库:https://github.com/ymcui/Chinese-LLaMA-Alpaca

为了促进大模型在中文 NLP 社区的开放研究,Chinese-LLaMA-Alpaca 开源了中文 LLaMA 模型和指令精调的 Alpaca 大模型。这些模型在原版 LLaMA 的基础上扩充了中文词表并使用了中文数据进行二次预训练,进一步提升了中文基础语义理解能力。同时,中文 Alpaca 模型进一步使用了中文指令数据进行精调,显著提升了模型对指令的理解和执行能力。详细内容请参考技术报告 (Cui, Yang, and Yao, 2023)。

报告地址:https://arxiv.org/abs/2304.08177

Chinese-LLaMA-Alpaca 主要内容:

  • 🚀 针对原版 LLaMA 模型扩充了中文词表,提升了中文编解码效率

  • 🚀 Chinese-LLaMA-Alpaca 开源了使用中文文本数据预训练的中文 LLaMA 以及经过指令精调的中文 Alpaca(7B、13B)

  • 🚀 快速使用笔记本电脑(个人 PC)的 CPU/GPU 本地量化和部署体验大模型

对比项中文 LLaMA中文 Alpaca
训练方式传统 CLM (在通用语料上训练)指令精调 (在指令数据上训练)
输入模板不需要需要符合模板要求(llama.cpp/LlamaChat/HF 推理代码等已内嵌)
适用场景 ✔️文本续写:给定上文内容,让模型继续写下去,生成下文1、指令理解(问答、写作、建议等)2、多轮上下文理解(聊天等)
不适用场景 ❌指令理解 、多轮聊天等文本无限制自由生成
llama.cpp使用 -p 参数指定上文使用 -ins 参数启动指令理解+聊天模式
text-generation-webui不适合 chat 模式使用 --cpu 可在无显卡形式下运行,若生成内容不满意,建议修改 prompt
LlamaChat加载模型时选择"LLaMA"加载模型时选择"Alpaca"
HF推理代码无需添加额外启动参数启动时添加参数 --with_prompt
已知问题如果不控制终止,则会一直写下去,直到达到输出长度上限。目前版本模型生成的文本长度相对短一些,比较惜字如金。

HF 推理代码https://github.com/ymcui/Chinese-LLaMA-Alpaca/blob/main/scripts/inference_hf.py

对比项中文 LLaMA中文 Alpaca
训练方式传统 CLM (在通用语料上训练)指令精调 (在指令数据上训练)
输入模板不需要需要符合模板要求(llama.cpp/LlamaChat/HF 推理代码等已内嵌)
适用场景 ✔️文本续写:给定上文内容,让模型继续写下去,生成下文1、指令理解(问答、写作、建议等)2、多轮上下文理解(聊天等)
不适用场景 ❌指令理解 、多轮聊天等文本无限制自由生成
llama.cpp使用 -p 参数指定上文使用 -ins 参数启动指令理解+聊天模式
text-generation-webui不适合 chat 模式使用 --cpu 可在无显卡形式下运行,若生成内容不满意,建议修改 prompt
LlamaChat加载模型时选择"LLaMA"加载模型时选择"Alpaca"
HF推理代码无需添加额外启动参数启动时添加参数 --with_prompt
已知问题如果不控制终止,则会一直写下去,直到达到输出长度上限。目前版本模型生成的文本长度相对短一些,比较惜字如金。

HF 推理代码https://github.com/ymcui/Chinese-LLaMA-Alpaca/blob/main/scripts/inference_hf.py

对比项中文 LLaMA中文 Alpaca
训练方式传统 CLM (在通用语料上训练)指令精调 (在指令数据上训练)
输入模板不需要需要符合模板要求(llama.cpp/LlamaChat/HF 推理代码等已内嵌)
适用场景 ✔️文本续写:给定上文内容,让模型继续写下去,生成下文1、指令理解(问答、写作、建议等)2、多轮上下文理解(聊天等)
不适用场景 ❌指令理解 、多轮聊天等文本无限制自由生成
llama.cpp使用 -p 参数指定上文使用 -ins 参数启动指令理解+聊天模式
text-generation-webui不适合 chat 模式使用 --cpu 可在无显卡形式下运行,若生成内容不满意,建议修改prompt
LlamaChat加载模型时选择"LLaMA"加载模型时选择"Alpaca"
HF推理代码无需添加额外启动参数启动时添加参数 --with_prompt
已知问题如果不控制终止,则会一直写下去,直到达到输出长度上限。目前版本模型生成的文本长度相对短一些,比较惜字如金。

LangChain 的工作流程

在没有知识库的情况下:直接将问题输入对话式大语言模型作为当前问题的答案。

在有知识库的情况下:首先用输入的问题,基于文本相似度表征模型获取到输入的表征。依靠表征寻找到相似的知识段落文本。第二将相似知识段落文本拼接上问题输入对话式语言模型获取当前问题的文档问答结果。

LangChain 的问答实现路径

基于纯粹的大语言模型的对话能力

基于相似度检索相关文档以及基于对话大参数预训练语言模型的阅读理解能力

LangChain 的资料库向量化

如何提升 LangChain 的性能:

  1. 训练垂直领域问题与文档相似度模型,提升问题寻找知识文档的精度。

  2. 训练垂直领域问题+知识文档的对话式大语言模型,优化返回结果。

在不同的环境中安装 LangChain 环境

安装 pytorch 1.13.1

# ROCM 5.2 (Linux only)
pip3 install torch torchvision torchaudio --extra-index-url
pip install torch==1.13.1+rocm5.2 torchvision==0.14.1+rocm5.2 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/rocm5.2
# CUDA 11.6
pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116
# CUDA 11.7
pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu117
# CPU only
pip install torch==1.13.1+cpu torchvision==0.14.1+cpu torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cpu

安装 pytorch 2.0.0、cuda 11.7

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117

安装 pytorch 2.0.0、cuda 11.8

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

LangChain 项目地址:https://github.com/hwchase17/langchain

很多中文的 LangChain 都是基于这个项目进行二次开发的。

安装 LangChain 的两次尝试

LangChain 可在 PyPi 上使用,因此可以轻松安装:

pip install langchain

这将安装 LangChain 的最低要求。当 LangChain 与各种模型提供程序、数据存储等集成时,它的很多价值就来了。默认情况下,不安装执行此操作所需的依赖项。然而,还有另外两种安装 LangChain 的方法确实引入了这些依赖关系。

要安装通用 LLM 提供程序所需的模块,请运行:

pip install langchain[llms]

要安装所有集成所需的所有模块,请运行:

pip install langchain[all]

请注意,如果您使用的是 zsh,则在将方括号作为参数传递给命令时需要引用方括号,例如:

pip install 'langchain[all]'

基于源码安装 LangChain

git clone https://github.com/hwchase17/langchain.git
cd langchain
pip install -e .

Chinese-LangChain 安装部署过程

24  pip install -r requirements.txt
   26  pip install 'httpx[socks]'
   27  python main.py
   44  发现导入pdf失败,提示缺失一下的包 以下异常并没有引起程序中断。
   45* pip install 'unstructured[local-inference]'

Chinese-LangChain 构建自己知识库的文档与问题相似度表征,这一步一定要准备好足够的内存。

import os

from langchain.embeddings.huggingface import HuggingFaceEmbeddings
from langchain.schema import Document
from langchain.vectorstores import FAISS
from tqdm import tqdm

# 中文 Wikipedia 数据导入示例:
embedding_model_name = 'GanymedeNil/text2vec-large-chinese'
docs_path = '/root/work/Chinese-LangChain/docs'
embeddings = HuggingFaceEmbeddings(model_name=embedding_model_name)

docs = []
d = []
doc_files = os.listdir("./docs")
for doc_one in doc_files:
    if not "txt" in doc_one:
        continue
    with open(os.path.join("./docs",doc_one), 'r', encoding='utf-8') as f:
        for idx, line in tqdm(enumerate(f.read().split("。"))):
            d.append(line)
d = list(set(d))
for idx, d_one in tqdm(enumerate(d)): 
            metadata = {"source": f'doc_id_{idx}'}
            docs.append(Document(page_content=line.strip()+"。", metadata=metadata))

vector_store = FAISS.from_documents(docs, embeddings)
vector_store.save_local('cache/annoy/')

相对有限的内存资源来说,可以尝试把知识库文本段向量化做成一个批式处理流程:

import os
import pandas as pd
from langchain.schema import Document
from langchain.document_loaders import UnstructuredFileLoader
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from tqdm import tqdm
# 中文 Wikipedia 数据导入示例:
embedding_model_name = 'GanymedeNil/text2vec-large-chinese'
embeddings = HuggingFaceEmbeddings(model_name=embedding_model_name)

d = []
doc_files = os.listdir("./2012")
for doc_one in doc_files:
    if not "txt" in doc_one:
        continue
    with open(os.path.join("./2012",doc_one), 'r', encoding='utf-8') as f:
        for idx, line in tqdm(enumerate(f.read().split("。"))):
            d.append(line)
d = list(set(d))
for i in range(len(d)//100000):
    docs = []

    for idx, d_one in tqdm(enumerate(d[100000*i:100000*(i+1)])): 
        metadata = {"source": f'doc_id_{idx}'}
        docs.append(Document(page_content=line.strip()+"。", metadata=metadata))

    vector_store = FAISS.from_documents(docs, embeddings)
    vector_store.save_local('cache/annoy'+str(i)+'/')

100 万句子分成了 10 批次 10 万次句子生成了 10 个 faiss 向量数据文件。获取向量的过程也是需要显卡参与计算的。

72d47be6a85b1455375311b58dd0cf5f.png

从 0 到 3 是我生成的 faiss 向量数据文件。据说还可以合并成一个大的向量文件。

在 Chinese-LangChain 中加入自己的知识库的文档与问题相似度表征

class LangChainCFG:
    llm_model_name = 'THUDM/chatglm-6b-int4-qe'  # 本地模型文件 or huggingface远程仓库
    embedding_model_name = 'GanymedeNil/text2vec-large-chinese'  # 检索模型文件 or huggingface远程仓库
    vector_store_path = './cache'
    docs_path = './docs'
    kg_vector_stores = {
        '2010年企业年报': './cache/annoy/',
    }  # 可以替换成自己的知识库,如果没有需要设置为None
    # kg_vector_stores=None
    patterns = ['模型问答', '知识库问答']  #

训练垂直领域问题 + 知识文档的对话式大语言模型的几种方式,(按照资源由小到大的排序方式)

  1. ptuning v2 & finetune chatglm 的官方支持了对下游文本生成任务进行 ptuning 和全参数量 finetune 的实现 chatglm ptuning & finetune:https://github.com/THUDM/ChatGLM-6B/tree/main/ptuning

  2. lora 开源社区的志愿者小伙伴,为了提升多卡的并行训练方法,实现了一套基于 lora 训练策略的多卡并行训练实现。

  3. pretrain 根据 ymcui 的实现的 Chinese-LLaMA-Alpaca 项目,可以知道通过 transformers 的原生代码进行 clm 的 pretrain 可以提升 LLaMA 语言模型的生成效果。在 LLaMA 的预训练过程中采用的是先扩充词表,再进行中文数据集预训练的过程。

相关工作

transformers language-modeling:https://github.com/huggingface/transformers/tree/main/examples/pytorch/language-modeling

全参数量 finetune 目前看起来效果是非常不错的。效果提升非常明显。



如果你有好的文章希望通过我们的平台分享给更多人,请通过这个链接与我们联系:
https://bit.ly/hf-tougao

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

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

相关文章

YOLOv5+姿态估计HRnet与SimDR检测视频中的人体关键点

一、前言 由于工程项目中需要对视频中的person进行关键点检测,我测试各个算法后,并没有采用比较应用化成熟的Openpose,决定采用检测精度更高的HRnet系列。但是由于官方给的算法只能测试数据集,需要自己根据算法模型编写实例化代码…

[网络安全]XSS之Cookie外带攻击姿势及例题详析

[网络安全]XSS之Cookie外带攻击姿势及例题详析 概念姿势及Payload启动HTTP协议 method1启动HTTP协议 method2 例题详析Payload1Payload2window.open 总结 本文仅分享XSS攻击知识,不承担任何法律责任。 本文涉及的软件等请读者自行安装,本文不再赘述。 概…

Node.js 学习系列(五)—— 文件系统

Node.js 提供一组类似 UNIX(POSIX) 标准的文件操作API。 Node 导入文件系统模块 (fs) 语法如下所示: var fs require("fs")异步和同步 Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本。 读取文…

异常体系与项目实践

程序式阴影:为什么不报错? 一、简介 在程序开发的过程中,异常处理从来都是一个复杂的维度,无论是新手还是经验老到的选手,在编码时都会面对各种异常情况; 程序中的异常可以反映系统的缺陷和待优化的点&am…

【STM32】基础知识 第十四课 看门狗 IWDG 深入理解与应用

【STM32】基础知识 第十四课 看门狗 IWDG 深入理解与应用 概述什么是独立看门狗 (IWDG)独立看门狗工作原理键寄存器状态寄存器 (IWDG_SR)寄存器配置操作步骤 案例总结 概述 STM32 系列单片机具有强大的内置功能, 其中之一就是独立看门口 (IWDG). 看门狗定时器是一种重要的硬件…

webpack Plugin Loader

本文作者为 360 奇舞团前端开发工程师 webpack是Javascript工具链的关键部分。webpack是个用于现代JavaScript应用程序的静态模块打包工具。它不仅可以支持ESM和CommonJS模块化编程,而且还可以支持或扩展支持许多不同的静态资源,例如:Files,I…

我将开始更新 强化学习

你好,我是zhenguo(郭震) 很久没有更新文章,从现在开始我将逐步恢复更新。在接下来的日子,我将系统更新强化学习文章,在期间,也会插播一些读博做科研的一些日常总结。如果你感兴趣,欢…

【观察】华为:持续创新,场景聚焦,推动数据中心实现可持续发展

毫无疑问,在数字经济时代,数据被纳入“新型生产要素”,而数据中心作为承载数据价值的关键,不仅是国民经济发展的重要基础设施,更成为了科技创新和技术应用的实体。也正因此,过去十几年数据中心产业实现了快…

最新开源!更擅长推理的LLaMA大模型,支持中文

©PaperWeekly 原创 作者 | 李忠利 研究方向 | 自然语言处理 跟大家介绍一下自己最近训练的 LLaMA 模型——BiLLa: A Bilingual LLaMA with Enhanced Reasoning Ability. Github 地址: https://github.com/Neutralzz/BiLLa HuggingFace 模型: ht…

【Python】数据分析与可视化实践:收支日统计数据可视化的实现

Python数据分析与可视化实践:收支日统计数据可视化的实现 Author:萌狼蓝天 Date:2023-5-7 数据读入与基本处理 上图是原始数据的一部分,存放于excel中,首先使用pd读入数据。读入数据后,删除不是收入&#x…

chatgpt赋能Python-python3_8_3怎么用

Python 3.8.3:简介与使用 Python是一种高级编程语言,拥有许多库和框架,是Web开发、数据分析、机器学习、人工智能等领域的首选语言之一。而Python 3.8.3是Python的最新版本,在新功能、稳定性、安全性等方面都有很大提升。 Pytho…

Midjourney 创建私人画图机器人,共享账号如何设置独立绘画服务器

本教程收集于:AIGC从入门到精通教程 Midjourney 创建私人画图机器人,共享账号如何设置独立绘画服务器 你是不是遇到以下问题: 1.Midjourney会员怎么自建绘图服务器,不受其他人的打扰? 2.Midjourney会员共享账号如何自建服务器,供其他人使用? 3.在官方服务器作图,频…

gRPC-go参数功能介绍总结目录(专栏)

本篇文章是gRPC-go框架的参数功能介绍总结 本篇文章的目的: 查看快速方便查询gRPC-go都有哪些参数可用!可以快速的查询到相关案例!gRPC-go版本是v1.30.0 可以从下面的地址下载gRPC-go版本 链接: https://pan.baidu.com/s/1za02qnUII78n-XhlrLf7RA 密码: 3tok 1、grpc-go客…

深入浅出 OkHttp 源码解析及应用实践

作者:vivo 互联网服务器团队- Tie Qinrui OkHttp 在 Java 和 Android 世界中被广泛使用,深入学习源代码有助于掌握软件特性和提高编程水平。 本文首先从源代码入手简要分析了一个请求发起过程中的核心代码,接着通过流程图和架构图概括地介绍…

chatgpt赋能Python-python3_7_6怎么用

Python 3.7.6怎么用 – 简单易上手的编程语言 Python是一种简单易用的编程语言,已经成为了计算机科学领域中最受欢迎的语言之一。Python内置了许多库和工具,可以让用户轻松地完成各种任务。 作为Python的最新版本,Python 3.7.6带来了许多令…

Java Web项目中无效数据怎样处理?

最近在做一个java web项目(自己随便想的),遇到一个这个的需求,就是从后台数据库根据用户id数据查询用户信息给前端用作个人主页展示吧!,但是后台数据库中用户信息中是有密码字段(虽然进行了加密处理)的,对于这个密码数…

一个玩游戏的失足青年,转行做编程到教育的挣扎过程(3/4)

有一个人,从小的心愿是当一名飞行员,终于有一天他当上了飞行员。 但是,他第一次飞行时,飞机就出事了。 好在他能够跳伞。但是,降落却是坏的,打不开...... 突然,他看见了在正下方的地上&#xff…

声音生成——将Autoencoder修改成Variant Autoencoder在mnist训练

文章目录 概述VariantAutoencoder.py文件实现关闭eager execution修改bottlenectk组件修改loss损失函数VariantAutoencoder.py实现的全部代码 train.py文件实现load_mnist模块train模块完整代码执行效果 总结Analysis代码 概述 之前的一篇文章中,介绍了如何实现aut…

if

[rootes3 data]# cat ifaction.sh #!/bin/bash#********************************************************************read -p "请输入身高(m为单位): " HIGH if [[ ! "$HIGH" ~ ^[0-2](\.[0-9]{,2})?$ ]];then echo "输入错误的身高!" exit…

面试字节,简历做了点手脚,第三方背调公司查出来了,被撤销offer!

简历做了手脚被查出来,怎么办? 一位面试字节的程序员哀叹: 运气差,在简历上做了点手脚,被第三方背调查出来了,只能等着被通知撤销offer! 有人说,现在背调查的可严格了,字…