LangChain-ChatGLM-Fay-Ue实现本地数字人

LangChain-ChatGLM 基于本地知识库的问答

ChatGLM-6B简介

它是一个开源的,支持中英双语的对话语言模型,基于General Language Model(GLM)架构,具有62亿参数

ChatGLM-6B应用

大语言模型通常基于通识知识进行训练,因此在面向如下场景时,常常需要借助模型微调或提示词工程提升语言模型应用效果

  • 垂直领域知识
  • 基于私有数据的问答

微调和提示词工程

名词 是什么 适用场景
微调 针对预先训练的语言模型在特定任务的少量数据集上对其进行进一步训练 当任务或域定义明确,并有足够的标记数据可供训练时,通常使用微调过程
提示词工程 涉及设计自然语言提示或指令,可以指导语言模型执行特定任务。 最适合需要高精度和明确输出的任务。提示工程可用于制作引发所需输出的查询

LangChain介绍(提示词工程框架)

LangChain简介

Langchain是一个用于开发由语言模型驱动的应用程序的框架
主要功能:

  • 调用语言模型
  • 将不同数据源接入到语言模型的交互中
  • 允许语言模型与运行环境交互

LangChain中提供的模块

  • Modules:支持的模型类型和集成
  • Prompt:提示词管理、优化和序列化。
  • Memory:内存是指在链/代理调用之间持续存在的状态
  • Indexes:当语言模型与特定于应用程序的数据相结合时,会变得更加强大-此模块包含用于加载、查询和更新外部数据的接口和集成。
  • Chain:链是结构化的调用序列(对LLM或其他实用程序)
  • Agents:代理是一个链,其中LLM在给定高级指令和一组工具的情况下,反复决定操作,执行操作并观察结果,直到高级指令完成。
  • Calbacks:回调允许您记录和流式传输任何链的中间步骤,从而轻松观察、调试和评估应用程序的内部。

LangChain应用场景

  • 文档问答:在特定文档上回答问题,仅利用这些文档中的信息来构建答案
  • 个人助理:个人助理需要采取行动,记住互动,并了解您的数据。
  • 查询表格数据:使用语言模型查询库表类型结构化
    数据(CSV、SQL、DataFrame)等
  • 与API交互:使语言模型与API交互非常强大。它允许他们访问最新信息,并允许他们采取行动
  • 信息提取:从文本中提取结构化信息
  • 文档总结:压缩较长文档,一种数据增强生成

基于单一文档问答的实现原理

  1. 加载本地文档:读取本地文档加载为文本
  2. 文本拆分:将文本按照字符,长度或语义进行拆分
  3. 根据提问匹配文本:根据用户提问对文本进行字符匹配或语义检索(需要向量化)
  4. 构建Prompt:将匹配文本,用户提问,加入Prompt模板
  5. LLM生成回答:将Prompt发送给LLM获得基于文档内容的回答

基于本地知识库的问答实现原理

title

  • 1,2 文本加载
  • 3,4 文本拆分
  • 5,6文本向量化形成Vectorstore向量数据库
  • 8 将查询的文本向量化
  • 9,10 到向量数据库里面进行已有文段的匹配
  • 11 形成相关文段
  • 12 转化为Prompt Template(引导LLM模型生成特定类型响应的一种格式输入方式)的形式
  • 13 填充到Prompt当中
  • 14 发送至LLM(大语言模型)
  • 15 LLM回复

基于本地知识库的问答的代码实现(简易版)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 启动模型
from transformers import AutoTokenizer,AutoModel
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b",trust_remote_code=True)
model = AutoModelfrom_pretrained("THUDM/chatglm-6b",trust_remote_code=True).half().cuda()chatglm = model.eval()

from langchain.document_loaders import UnstructuredFileLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings.openai import:OpehAIEmbeddings
from langchain.vectorstores import FAISS

# 定义文件路径
filepath = "test.txt"

# 加载文件
Loader = UnstructuredFileLoader(filepath)
docs = Loader.load()

# 文本分割
text_splitter = CharacterTextSplitter(chunk_size = 500,chunk_overlap = 200)
docs = text_splitter.split_text(docs)

# 构建向量库
embeddings = OpenAIEmbeddings()
vector_store = FAISS.from_documents(docs,embeddings)

# 根据提问匹配上下文
query = "LangChain 能够接入哪些数据类型?"
docs = vector_store.similarity_search(query)

context = [doc.page_content for doc in docs]

# 构建prompt
prompt = f"已知信息:\n{context}\n根据已知信息回答问题:\n{query}"

# LLM 生成回答
chatglm.chat(tokenizer,prompt,history=[])

LangChain-ChatGLM项目简介

Langchain-ChatGLM是一个基于ChatGLM等大语言模型的本地知识库问答实现

项目特点:

  • 依托ChatGLM等开源模型实现,可离线部署
  • 基于langchain实现,可快速实现接入多种数据源
  • 在分句、文档读取等方面,针对中文使用场景优化
  • 支持pdf、txt、md、docx等文件类型接入,具备命令行demo、webui和vue前端
    项目结构:
  • models:LLM的接口类与实现类,针对开源模型提供流式输出支持
  • loader:文档加载器的实现类
  • textsplitter:文本切分的实现类
  • chains:工作链路实现,如chains/local_doc_qa实现了基于本地文档的问答实现
  • content:用于存储上传的原始文件
  • vector_store:用于存储向量库文件,即本地知识库本体
  • configs:配置文件存储

项目部署

ChatGLM环境部署

项目下载

1
git clone https://github.com/THUDM/ChatGLM-6B.git

环境安装

用conda创建python3.10环境

1
conda create --name ChatGLM-6B python=3.10 

启动该环境

1
conda activate ChatGLM-6B

安装相关依赖

1
pip install -r requirements.txt

ChatGLM3-6B模型下载

已经下载git LFS 的情况下

1
2
3
4
5
// 有代理就用huggingface
git clone https://huggingface.co/THUDM/chatglm-6b

// 无代理用modelscope
git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git

本地代码调用模型(测试)

1
2
3
4
5
6
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("E:\ChatGLM3-6b-model", trust_remote_code=True)
model = AutoModel.from_pretrained("E:\ChatGLM3-6b-model", trust_remote_code=True).half().cuda()
model = model.eval()
response, history = model.chat(tokenizer, "你好", history=[])
print(response)
改成相对应的模型文件夹绝对路径
1
2

tips:在编译器里面运行时一定要选择conda创建的那个python解释器,或者直接命令行运行也行,如下

conda activate <环境名称>
python <文件名>.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

![title](/img/LangChain-ChatGLM-Fay-Ue实现本地数字人/2.png)

如果出现报错,扔给gpt,结合gpt的分析去解决,不要无脑跟着输入命令

#### ChatGLM项目调用模型
##### 本地API开放
只需要将所有```THUDM/chatglm-6b``` 替换为相对应的模型文件夹绝对路径
然后用 ```python api.py ``` 开放API即可

![title](/img/LangChain-ChatGLM-Fay-Ue实现本地数字人/3.png)
##### 本地API调用测试

直接request发post包即可
示例代码:
```py
import requests

def Chat(prompt,history):
url = "http://127.0.0.1:8000"
json = {"prompt": prompt, "history": history}
headers = {"Content-Type": "application/json;charset=UTF-8"}

response = requests.post(url=url,json=json,headers=headers)

return response.json()['response'], response.json()['history']

history = []
while True:
response, history = Chat(input("问题:"),history)
print("回答:",response)

测试结果:
title

langchain加载ChatGLM

langchain依赖安装

在你的python项目下面

1
pip install langchain

加载ChatGLM模型

创建一个langChainLoadChatGLM.py文件用来加载ChatGLM

1
2
3
4
5
6
7
8
9
from langchain.llms import ChatGLM

endpoint_url = "http://127.0.0.1:8000" # ChatGLM Api接口

llm = ChatGLM(
endpoint_url = endpoint_url,
max_token = 80000,
top_p = 0.9
)

后续完善文档分割和向量化,写prompt模板即可

Fay部署+联动UE数组人

Fay部署

Fay环境安装

使用conda创建虚拟环境(推荐)或者直接下载python3.10

1
2
conda create --name Fay python=3.10
conda activate Fay

Fay项目拉取,依赖下载

项目拉取:

1
git clone https://github.com/TheRamU/Fay.git

cd到Fay项目的主目录下,安装依赖

1
pip install -r requirements.txt

配置Fay的key

配置Fay项目下的system.conf文件,把需要的Apikey配置好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
[key]
#funasr / ali
ASR_mode = ali
#ASR二选一(需要运行fay/test/funasr服务)集成达摩院asr项目、感谢中科大脑算法工程师张聪聪提供集成代码
local_asr_ip=127.0.0.1
local_asr_port=10197

# ASR二选一(第1次运行建议用这个,免费3个月), 阿里云 实时语音识别 服务密钥(必须)https://ai.aliyun.com/nls/trans
ali_nls_key_id=
ali_nls_key_secret=
ali_nls_app_key=



# 微软 文字转语音 服务密钥(非必须,使用可产生不同情绪的音频)https://azure.microsoft.com/zh-cn/services/cognitive-services/text-to-speech/
ms_tts_key=
ms_tts_region=

# 讯飞 情绪分析 服务密钥 https://www.xfyun.cn/service/emotion-analysis/
xf_ltp_app_id=
xf_ltp_api_key=

#NLP多选一:xfaiui、yuan、chatgpt、rasa(需启动chatglm及rasa,https://m.bilibili.com/video/BV1D14y1f7pr)、VisualGLM
chat_module=xfaiui

# 讯飞 自然语言处理 服务密钥(NLP3选1) https://aiui.xfyun.cn/solution/webapi/
xf_aiui_app_id=
xf_aiui_api_key=

#浪.潮源大模型 服务密钥(NLP3选1) https://air.inspur.com/
yuan_1_0_account=
yuan_1_0_phone=

#gpt 服务密钥(NLP3选1) https://openai.com/
chatgpt_api_key=

#ngrok内网穿透id,远程设备可以通过互联网连接Fay(非必须)http://ngrok.cc
ngrok_cc_id=

#revChatGPT对接(非必须,https://chat.openai.com登录后访问https://chat.openai.com/api/auth/session获取)
gpt_access_token=
gpt_conversation_id=

启动

conda的虚拟环境,下面然后启动main.py即可
python main.py

UE数字人下载

下载开源数字人项目

https://github.com/xszyou/fay-ue5

下载好想要的项目即可,注意需要的ue版本

下载Epic

官网: https://www.unrealengine.com/en-US/unreal-engine-5

下载虚拟引擎UE以及需要的插件

本文下载的是ue5.0.3,根据你下载的数字人项目去下载对应版本的引擎

title
下载插件

title
下载好以下插件

title

然后直接打开数字人项目文件夹下面的.uproject文件,运行即可

Contents
  1. 1. LangChain-ChatGLM 基于本地知识库的问答
    1. 1.1. ChatGLM-6B简介
      1. 1.1.1. ChatGLM-6B应用
      2. 1.1.2. 微调和提示词工程
    2. 1.2. LangChain介绍(提示词工程框架)
      1. 1.2.1. LangChain简介
      2. 1.2.2. LangChain中提供的模块
      3. 1.2.3. LangChain应用场景
      4. 1.2.4. 基于单一文档问答的实现原理
      5. 1.2.5. 基于本地知识库的问答实现原理
      6. 1.2.6. 基于本地知识库的问答的代码实现(简易版)
    3. 1.3. LangChain-ChatGLM项目简介
    4. 1.4. 项目部署
      1. 1.4.1. ChatGLM环境部署
        1. 1.4.1.1. 项目下载
        2. 1.4.1.2. 环境安装
        3. 1.4.1.3. ChatGLM3-6B模型下载
        4. 1.4.1.4. 本地代码调用模型(测试)
      2. 1.4.2. langchain加载ChatGLM
        1. 1.4.2.1. langchain依赖安装
      3. 1.4.3. 加载ChatGLM模型
  2. 2. Fay部署+联动UE数组人
    1. 2.1. Fay部署
      1. 2.1.1. Fay环境安装
      2. 2.1.2. Fay项目拉取,依赖下载
      3. 2.1.3. 配置Fay的key
      4. 2.1.4. 启动
    2. 2.2. UE数字人下载
      1. 2.2.1. 下载开源数字人项目
      2. 2.2.2. 下载Epic
      3. 2.2.3. 下载虚拟引擎UE以及需要的插件
|