介绍
跟着ChatGPT的横空出世,国内互联网大厂、创业公司纷纷加了AIGC赛道,不断推出各种大模型,而这些大模型因为规划庞大、结构复杂,往往包括了数十亿至数千亿的参数。这些模型在练习阶段,一般需求运用高效能的GPU集群练习数十天时刻,在推理阶段,一般也需求高效能的GPU集群才能支撑必定量级的并发恳求且实时回来。现在也有不少公司推出了规划相对较小但作用仍有必定优势的大模型,能够在消费级的单卡GPU上进行推理、乃至练习。本文测验在一般的Macbook Pro上布置大模型开源计划,完成自然言语问答和对话等功能,尽管性能和作用一般,但能够在不凭借深度学习专用GPU服务器的前提下,体会一下现在AIGC的才能。
装备
所运用的Macbook Pro装备如下:
- 机型,Macbook Pro(14英寸,2021年);
- 芯片,Apple M1 Pro;
- 内存,16G;
- 体系,macOS Monterey,12.6.2。
前置条件
首要默许本地已装置macOS的软件包管理东西Homebrew。
Git
装置Git:
brew install git
因为运用git指令下载的模型文件较大,因而还需求装置Git Large File Storage:
brew install git-lfs
Conda
Conda是一个依靠和环境管理东西,支撑的言语包括Python、R、Ruby、Lua、Scala、Java、JavaScript、C/C++、Fortran等,且现在在Python言语生态中得到广泛的运用,经过其能够创立、管理多个相互独立、阻隔的Python环境,并在环境中装置、管理Python依靠,而MiniConda是Conda的免费、最小可用版别。下载并装置MiniConda:
wget repo.anaconda.com/miniconda/M… bash ./Miniconda3-latest-MacOSX-arm64.sh -b -p $HOME/miniconda source ~/miniconda/bin/activate
ChatGLM-6B
介绍
论文《Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond》经过图1所示的树状图详细列举了自2018年以来自然言语大模型(LLM)这一领域的开展道路和相应的各大模型,其间一部分是在Transformer呈现之前、不依据Transformer的大模型,例如AI2的ELMo,另一大部分是在Transfomer呈现之后、依据Transformer的大模型,其又分为三个开展道路:
- 仅依据Transformer解码器的大模型(图中的蓝色部分),例如,OpenAI的GPT系列、Meta的LLaMa、Google的PaLM等;
- 仅依据Transformer编码器的大模型(图中的粉丝部分),例如,Google的BERT、Meta的RoBERTa等;
- 一起依据Transformer编码器和解码器的大模型(图中的绿色部分),例如,Meta的BART、Google的T5、清华大学的GLM/ChatGLM等。
这儿挑选ChatGLM-6B进行本地布置,其官网上的介绍如下:ChatGLM-6B是一个开源的、支撑中英双语问答的对话言语模型,依据General Language Model(GLM)架构,具有62亿参数。结合模型量化技能,用户能够在消费级的显卡上进行本地布置(INT4量化级别下最低只需6GB显存)。ChatGLM-6B运用了和ChatGLM相同的技能,针对中文问答和对话进行了优化。经过约1T标识符的中英双语练习,辅以监督微调、反应自助、人类反应强化学习等技能的加持,62亿参数的ChatGLM-6B已经能生成相当契合人类偏好的答复。而ChatGLM-6B-INT4是ChatGLM-6B量化后的模型权重。具体的,ChatGLM-6B-INT4对ChatGLM-6B中的28个GLM Block进行了INT4量化,没有对Embedding和LM Head进行量化。量化后的模型理论上6G显存(运用CPU即内存)即可推理,具有在嵌入式设备(如树莓派)上运转的可能。
布置
创立并激活环境:
conda create –name chatglm python=3.9 conda activate chatglm
下载ChatGLM-6B源码:
cd ~/workspace/ git clone github.com/THUDM/ChatG…
装置依靠:
cd ~/workspace/ChatGLM-6B pip install -r requirements.txt
下载ChatGLM-6B INT4量化的模型权重ChatGLM-6B-INT4:
cd ~/workspace/models/ git lfs install git clone huggingface.co/THUDM/chatg…
Macbook直接加载量化后的模型可能呈现提示——“clang: error: unsupported option ‘-fopenmp’”,还需单独装置OpenMP依靠,此时会装置下面几个文件:/usr/local/lib/libomp.dylib, /usr/local/include/ompt.h, /usr/local/include/omp.h, /usr/local/include/omp-tools.h:
curl -O mac.r-project.org/openmp/open… sudo tar fvxz openmp-14.0.6-darwin20-Release.tar.gz -C /
履行以下Python代码,从本地地址加载模型并进行推理,对“你好”和“怎样读一本书”进行答复:
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("/Users/xxx/workspace/models/chatglm-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("/Users/xxx/workspace/models/chatglm-6b-int4", trust_remote_code=True).float()
model = model.eval()
response, history = model.chat(tokenizer, "你好", history=[])
print(response)
response, history = model.chat(tokenizer, "怎样读一本书", history=history)
print(response)
履行成果如图2所示,推理耗时约6分钟,比较慢。
修正ChatGLM-6B源码目录下的web_demo.py文件的7、8两行,运用本地已下载的INT4量化的模型权重ChatGLM-6B-INT4,而且不运用半精度(Mac不支撑)和CUDA(无GPU):
tokenizer = AutoTokenizer.from_pretrained("/Users/xxx/workspace/models/chatglm-6b-int4", trust_remote_code=True) #tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("/Users/xxx/workspace/models/chatglm-6b-int4", trust_remote_code=True).float() #model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
启动web_demo.py:
python web_demo.py
可在网页中发问,由模型进行推理,如图3所示。
ChatGLM2-6B
介绍
ChatGLM2-6B是开源中英双语对话模型ChatGLM-6B的第二代版别,于2023年6月25日发布,关于其介绍直接引用官网上的内容。ChatGLM2-6B在保留了初代模型对话流通、布置门槛较低一级众多优异特性的根底之上,还引进了如下新特性:
- 更强壮的性能:依据ChatGLM初代模型的开发经历,全面升级了ChatGLM2-6B的基座模型。ChatGLM2-6B运用了GLM的混合目标函数,经过了1.4T中英标识符的预练习与人类偏好对齐练习,评测成果显示,比较于初代模型,ChatGLM2-6B在MMLU(+23%)、CEval(+33%)、GSM8K(+571%) 、BBH(+60%)等数据集上的性能取得了大幅度的提升,在同尺度开源模型中具有较强的竞争力。
- 更长的上下文:依据FlashAttention技能,其将基座模型的上下文长度(Context Length)由ChatGLM-6B 的2K扩展到了32K,并在对话阶段运用8K的上下文长度练习,答应更多轮次的对话。但当时版别的 ChatGLM2-6B对单轮超长文档的理解才能有限,其会在后续迭代升级中侧重进行优化。
- 更高效的推理:依据Multi-Query Attention技能,ChatGLM2-6B有更高效的推理速度和更低的显存占用,在官方的模型完成下,推理速度比较初代提升了42%,INT4量化下,6G显存支撑的对话长度由1K提升到了 8K。
- 更敞开的协议:ChatGLM2-6B权重对学术研究彻底敞开,在取得官方的书面许可后,亦答应商业运用。
布置
以下进程和ChatGLM-6根本相同。首要创立并激活环境:
conda create –name chatglm2 python=3.9 conda activate chatglm2
下载ChatGLM2-6B源码:
cd ~/workspace/ git clone github.com/THUDM/ChatG…
装置依靠:
cd ~/workspace/ChatGLM2-6B pip install -r requirements.txt
下载ChatGLM2-6B INT4量化的模型权重ChatGLM2-6B-INT4:
cd ~/workspace/models/ git lfs install #若ChatGLM-6B部分已履行,则无需再履行 git clone huggingface.co/THUDM/chatg…
履行以下Python代码,从本地地址加载模型并进行推理,对“你好”和“怎样读一本书”进行答复,代码与ChatGLM部分根本相同,仅更改模型地址:
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("/Users/xxx/workspace/models/chatglm2-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("/Users/xxx/workspace/models/chatglm2-6b-int4", trust_remote_code=True).float()
model = model.eval()
response, history = model.chat(tokenizer, "你好", history=[])
print(response)
response, history = model.chat(tokenizer, "怎样读一本书", history=history)
print(response)
履行成果如图4所示。
关于ChatGLM2-6B源码目录下的web_demo.py的修正和启动和ChatGLM-6B部分类似,修正其间的6、7两行:
tokenizer = AutoTokenizer.from_pretrained("/Users/xxx/workspace/models/chatglm2-6b-int4", trust_remote_code=True) #tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("/Users/xxx/workspace/models/chatglm2-6b-int4", trust_remote_code=True).float() #model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()
启动web_demo.py:
python web_demo.py
启动后如图5所示。
LangChain
介绍
LangChain是一个面向大言语模型的运用开发框架,假如将大言语模型比作人的大脑,那么能够将LangChain能够比作人的五官和四肢,它能够将外部数据源、东西和大言语模型连接在一起,既能够弥补大言语模型的输入,也能够承接大言语模型的输出。LangChain包括以下中心组件:
- Model,表明大言语模型,
- Prompt,表明提示;
- Tool,表明东西;
- Chain,表明将Model、Tool等组件串联在一起,乃至能够递归地将其他Chain串联在一起;
- Agent,相关于Chain已固定履行链路,Agent能够完成动态的履行链路。
布置
装置依靠
在chatglm2环境下持续装置LangChain依靠:
pip install langchain
注意,以上指令只是装置LangChain依靠的最小集,因为LangChain集成了多种模型、存储等东西,而这些东西的依靠并不会被装置,所以后续进一步运用这些东西时可能会报短少特定依靠的过错,能够运用pip进行装置,也能够这儿直接运用“pip install’langchain[all]’”装置LangChain的一切依靠,但比较耗时。
Model
承继LangChain的LLM,接入ChatGLM2,完成对话和问答,代码文件chatglm_llm.py如下所示:
from langchain.llms.base import LLM
from langchain.llms.utils import enforce_stop_tokens
from transformers import AutoTokenizer, AutoModel
from typing import List, Optional
class ChatGLM2(LLM):
max_token: int = 4096
temperature: float = 0.8
top_p = 0.9
tokenizer: object = None
model: object = None
history = []
def __init__(self):
super().__init__()
@property
def _llm_type(self) -> str:
return "ChatGLM2"
# 界说load_model办法,进行模型的加载
def load_model(self, model_path = None):
self.tokenizer = AutoTokenizer.from_pretrained(model_path,trust_remote_code=True)
self.model = AutoModel.from_pretrained(model_path, trust_remote_code=True).float()
# 完成_call办法,进行模型的推理
def _call(self,prompt:str, stop: Optional[List[str]] = None) -> str:
response, _ = self.model.chat(
self.tokenizer,
prompt,
history=self.history,
max_length=self.max_token,
temperature=self.temperature,
top_p=self.top_p)
if stop is not None:
response = enforce_stop_tokens(response, stop)
self.history = self.history + [[None, response]]
return response
if __name__ == "__main__":
llm=ChatGLM2()
llm.load_model("/Users/xxx/workspace/models/chatglm2-6b-int4")
print(llm._call("怎样读一本书"))
chatglm2_llm.py的履行成果如图6所示。
Chain
LLMChain
LLMChain是最根底的Chain,其引进一个提示模板将问题转化为提示输入模型,并输出模型的答复。
其完成原理如图7所示,包括三步:
- 输入问题;
- 拼接提示,依据提示模板将问题转化为提示;
- 模型推理,输出答案。
代码文件chain_demo.py如下所示:
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from chatglm2_llm import ChatGLM2
if __name__ == "__main__":
# 界说模型
llm = ChatGLM2()
# 加载模型
llm.load_model("/Users/xxx/workspace/models/chatglm2-6b-int4")
# 界说提示模板
prompt = PromptTemplate(input_variables=["question"], template="""
简练和专业的来答复用户的问题。
假如无法从中得到答案,请说 “依据已知信息无法答复该问题” 或 “没有供给足够的相关信息”,不答应在答案中增加假造成分,答案请运用中文。
问题是:{question}""",)
# 界说chain
chain = LLMChain(llm=llm, prompt=prompt, verbose=True)
# 履行chain
print(chain.run("怎样读一本书"))
其间模型选用自界说模型,接入本地布置的ChatGLM2。chain_demo.py运转成果如图8所示。
RetrievalQA
除了根底的链接提示和模型的LLMChain外,LangChain还供给了其他多种Chain,例如完成本地知识库功能的RetrievalQA和主动生成SQL并履行的SQLDatabaseChain。
RetrievalQA完成原理如图9所示,先构建本地知识库,包括三步:
- 加载文档,LangChain供给多种BaseLoader完成进行文档加载;
- 切分文本段,LangChain一起供给多种TextSplitter完成进行文本段切分;
- 向量化文本段,运用向量化模型将文本段转化为向量,LangChain也支撑多种方式的向量化模型,比方,OpenAIEmbeddings经过调用OpenAI的相关服务进行向量化,HuggingFaceEmbeddings能够长途或本地加载HuggingFace上的模型进行向量化;
- 对文本段向量构建向量索引,LangChain也支撑多种向量索引引擎,包括Faiss、Chroma、Milvus等。
再依据本地知识库进行模型推理,包括五步:
- 输入问题;
- 向量化问题,和文本段向量化一致,将问题转化为向量;
- 查找相关文本段,从向量索引中查找和问题相关的文本段;
- 拼接提示,依据提示模板将问题和相关文本段转化为提示;
- 模型推理,输出答案。
代码文件retrieval_qa_demo.py如下所示:
from langchain.chains import RetrievalQA
from langchain.document_loaders import UnstructuredMarkdownLoader
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
from langchain.text_splitter import MarkdownTextSplitter
from langchain.vectorstores import Chroma
from chatglm2_llm import ChatGLM2
if __name__ == "__main__":
# 加载文档
loader = UnstructuredMarkdownLoader("/Users/xxx/workspace/docs/creative.md")
documents = loader.load()
# 切分文本
text_splitter = MarkdownTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
# 初始化向量化模型
embeddings = HuggingFaceEmbeddings(model_name="/Users/xxx/workspace/models/text2vec-large-chinese",)
# 构建向量索引
db = Chroma.from_documents(texts, embeddings)
# 界说模型
llm = ChatGLM2()
# 加载模型
llm.load_model("/Users/xxx/workspace/models/chatglm2-6b-int4")
# 履行链路
qa = RetrievalQA.from_chain_type(llm, chain_type="stuff", retriever=db.as_retriever(), verbose=True)
print(qa.run("怎样创立程序化构思"))
其间,关于知识库文档,笔者运用《超级汇川程序化构思产品手册》这一文档,将其以Markdown格局下载至本地,运用UnstructuredMarkdownLoader进行加载,并运用MarkdownTextSplitter进行切分得到文本段。关于向量化模型,笔者运用HuggingFace上的GanymedeNil/text2vec-large-chinese,并下载至本地:
cd ~/workspace/models/ git lfs install #若ChatGLM-6B部分已履行,则无需再履行 git clone huggingface.co/GanymedeNil…
关于向量索引引擎,笔者运用Chroma;关于大言语模型,笔者运用之前已界说的ChatGLM2。关于问题和从向量索引回来的相关文本段,RetrievalQA按下述提示模板拼接提示:
Use the following pieces of context to answer the question at the end. If you don’t know the answer, just say that you don’t know, don’t try to make up an answer.
{context}
Question: {question} Helpful Answer:
retrieval_qa_demo.py运转成果如图10所示。
SQLDatabaseChain
SQLDatabaseChain能够经过模型主动生成SQL并履行,其完成原理如图11所示,包括五步:
- 输入问题;
- 获取数据库Schema,Schema包括数据库一切表的建表句子和数据示例,LangChain支撑多种联系型数据库,包括MariaDB、Oracle SQL、SQLite、ClickHouse、PrestoDB等;
- 拼接提示,依据提示模板将问题、数据库Schema转化为提示,而且提示中包括指示,要求模型在理解问题和数据库Schema的根底上,能够按必定的格局输出查询SQL、查询成果和问题答案等;
- 模型推理,这一步预期模型依据问题、数据库Schema推理、输出的答案中包括查询SQL,并从中提取出查询SQL;
- 履行查询SQL,从数据库中获取查询成果;
- 拼接提示,和上一次拼接的提示根本一致,只是其间的指示中包括了前两步已获取的查询SQL、查询成果;
- 模型推理,这一步预期模型依据问题、数据库Schema、查询SQL和查询成果推理出终究的问题答案。
代码文件sql_database_chain_demo.py如下所示:
from langchain import SQLDatabase, SQLDatabaseChain
from langchain.llms.fake import FakeListLLM
from chatglm2_llm import ChatGLM2
if __name__ == "__main__":
# 界说模型
# 模型先测验用ChatGLM2
llm = ChatGLM2()
llm.load_model("/Users/xxx/workspace/models/chatglm2-6b-int4")
# 模型再直接运用固定的答案,这些答案是事前依据提示由OpenAI ChatGPT3.5给出
#responses = ["SELECT COUNT() FROM Employee", "There are 8 employees."]
#llm = FakeListLLM(responses=responses, verbose=True)
# 界说数据库
# 能够参考https://database.guide/2-sample-databases-sqlite/,创立数据库、并将数据库文件Chinook.db存储至目录
# 数据库Chinook表明一个数字多媒体商店,包括了顾客(Customer)、雇员(Employee)、歌曲(Track)、订单(Invoice)及其相关的表和数据
db = SQLDatabase.from_uri("sqlite:////Users/xxx/workspace/langchain-demo/Chinook.db")
# 界说chain
chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)
# 履行chain
print(chain.run("How many employees are there?"))
其间,关于大言语模型,先测验运用之前已界说的ChatGLM2,后面会剖析,从履行成果看,ChatGLM2-6B-INT4和ChatGLM2-6B并不能输出契合格局的答案,然后无法进一步从中提取出查询SQL,所以经过FakeListLLM直接运用固定的答案,而这些答案事前依据提示由OpenAI ChatGPT3.5给出。 关于数据库引擎,运用SQLite3(Macbook原生支撑),关于数据库实例,运用Chinook,可依照上述链接中的阐明下载“Chinook_Sqlite.sql”并在本地创立数据库实例。Chinook表明一个数字多媒体商店,包括了顾客(Customer)、雇员(Employee)、歌曲(Track)、订单(Invoice)及其相关的表和数据,如图12所示。问题是“How many employees are there?”,即有多少雇员,希望模型先给出查询Employee表记载数的SQL,再依据查询成果给出终究的答案。
实际履行时,SQLDatabaseChain首要依据问题和数据库Schema生成如下的提示:
You are a SQLite expert. Given an input question, first create a syntactically correct SQLite query to run, then look at the results of the query and return the answer to the input question. Unless the user specifies in the question a specific number of examples to obtain, query for at most 5 results using the LIMIT clause as per SQLite. You can order the results to return the most informative data in the database. Never query for all columns from a table. You must query only the columns that are needed to answer the question. Wrap each column name in double quotes (“) to denote them as delimited identifiers. Pay attention to use only the column names you can see in the tables below. Be careful to not query for columns that do not exist. Also, pay attention to which column is in which table. Pay attention to use date(‘now’) function to get the current date, if the question involves “today”. Use the following format: Question: Question here SQLQuery: SQL Query to run SQLResult: Result of the SQLQuery Answer: Final answer here Only use the following tables: {数据库Schema,包括一切表的建表句子和数据示例,受限于篇幅,这儿省略} Question: How many employees are there? SQLQuery:
其间,提示的榜首部分是指示,希望模型作为SQLite的专家,依照必定的要求进行推理,并依照必定的格局输出,第二部分是数据库Schema,第三部分是问题以及希望输出的开头“SQLQuery:”,预期模型依照提示续写,给出查询SQL。 若将提示输入ChatGPT3.5,能够回来预期的答案,SQLDatabaseChain进一步提取答案中“\nSQLResult”之前的部分,然后得到查询SQL:
SELECT COUNT() FROM Employee SQLResult: COUNT() 8 Answer: There are 8 employees.
若将提示输入自界说的ChatGLM2(运用ChatGLM2-6B-INT4),则无法回来预期的答案(答案合理、但不契合格局要求):
SQLite is a language for creating and managing databases. It does not have an SQL-specific version for getting the number of employees. However, I can provide you with an SQL query that you can run using a SQLite database to get the number of employees in the “Employee” table.
SQLite:
SELECT COUNT(*) as num_employees FROM Employee;
This query will return the count of employees in the “Employee” table. The result will be returned in a single row with a single column, labeled “num_employees”.
SQLDatabaseChain的提示是针对ChatGPT逐渐优化、确定的,因而适用于ChatGPT,LangChain官方示例中运用的大言语模型是OpenAI,即底层调用ChatGPT,而ChatGLM2-6B-INT4、ChatGLM2-6B相关于ChatGPT,模型规划较小,仅有60亿参数,关于上述的长文本提示无法给出预期的答案。因为没有OpenAI的Token,因而示例代码经过FakeListLLM直接运用由ChatGPT3.5给出的答案。 在获取查询SQL后,SQLDatabaseChain会履行该SQL获取查询成果,并持续依据问题、数据库Schema、查询SQL和查询成果生成如下的提示:
You are a SQLite expert. Given an input question, first create a syntactically correct SQLite query to run, then look at the results of the query and return the answer to the input question. Unless the user specifies in the question a specific number of examples to obtain, query for at most 5 results using the LIMIT clause as per SQLite. You can order the results to return the most informative data in the database. Never query for all columns from a table. You must query only the columns that are needed to answer the question. Wrap each column name in double quotes (“) to denote them as delimited identifiers. Pay attention to use only the column names you can see in the tables below. Be careful to not query for columns that do not exist. Also, pay attention to which column is in which table. Pay attention to use date(‘now’) function to get the current date, if the question involves “today”. Use the following format: Question: Question here SQLQuery: SQL Query to run SQLResult: Result of the SQLQuery Answer: Final answer here Only use the following tables: {数据库Schema,包括一切表的建表句子和数据示例,受限于篇幅,这儿省略} Question: How many employees are there? SQLQuery:SELECT COUNT(EmployeeId) FROM Employee SQLResult: [(8,)] Answer:
比较前次提示,本次提示只是在结尾追加了查询SQL和查询成果,若将提示输入ChatGPT3.5,则能够续写“Answer”,给出正确的答案:
There are 8 employees.
这儿也经过FakeListLLM直接运用由ChatGPT3.5给出的答案,然后在本地跑通SQLDatabaseChain的流程,运转成果如图13所示。
Agent
Agent组合模型和各种东西,相关于Chain已固定履行链路,Agent能够完成动态的履行链路,完成如图14中的ReAct架构。ReAct架构是一个循环进程,关于问题,经过屡次迭代,直至获取终究答案,而每次迭代包括如下几步:
- 将问题,各东西描绘,之前每次迭代模型推理出的思考(Thought)、东西(Action)、东西输入(Action Input)、东西履行后的输出(Observation),以及希望模型输出格局,依照提示模板拼接出提示;
- 将提示输入模型,由模型推理,输出进一步的思考(Thought)、东西(Action)、东西输入(Action Input);
- 运用模型给出的东西输入履行相应东西,获取东西输出(Observation);
- 持续榜首步进程,直至获取终究答案跳出循环。
LangChain官方有个比较经典的完成ReAct架构的示例,其需求OpenAI和SerpApi的Token,针对问题,运用ChatGPT进行屡次推理,依据推理成果先运用查找东西查询相关人的年纪,再运用核算器东西核算年纪的乘方,然后得到终究的答案。感兴趣且有OpenAI和SerpApi Token的同学能够在本地履行示例代码体会,此处不再赘述。 上述示例若运用本地布置的ChatGLM2-6B-INT作为大言语模型,则和在SQLDatabaseChain中遇到的问题相同,无法依据提示给出契合预期格局的答案。可见,尽管LangChain在设计上考虑了可扩展性,将Model以接口方式对外供给服务,屏蔽底层完成细节,但各种Chain、Tool和Agent中的提示模板还是针对ChatGPT进行了专门优化。
langchain-ChatGLM
介绍
langchain-ChatGLM是一个运用LangChain思想完成的依据本地知识库的问答运用,目标希望树立一套对中文场景与开源模型支撑友好、可离线运转的知识库问答解决计划,其完成原理与LangChain官方的RetrievalQA根本一致,如图15所示:
- 加载本地知识库文档,支撑目录和文件;
- 解析文档中的文本,支撑Markdown、Words、PDF、TXT等格局;
- 切分文本得到文本段;
- 向量化文本段,向量化模型可装备,默许为GanymedeNil/text2vec-large-chinese;
- 选用Faiss构建文本段向量的向量索引;
- 输入问题,向量化问题,并运用问题向量从向量索引中查找相关的文本段向量;
- 运用提示模板组合问题和相关文本段构建提示;
- 向言语大模型中输入提示,由模型进行推理,输出终究的答案,言语大模型可装备,既能够直接接入ChatGLM-6B等大言语模型,也能够经过FastChat API方式接入Vicuna、Alpaca、LLaMA、Koala、RWKV等模型。
langchain-ChatGLM中运用的提示模板如下,其间“{question}”是发问的问题,“{context}”是将知识库中和问题相关的文本段用换行符拼接在一起:
已知信息: {context}
依据上述已知信息,简练和专业的来答复用户的问题。假如无法从中得到答案,请说 “依据已知信息无法答复该问题” 或 “没有供给足够的相关信息”,不答应在答案中增加假造成分,答案请运用中文。 问题是:{question}
布置
创立并激活环境:
conda create –name langchain-chatglm python=3.9 conda activate langchain-chatglm
下载langchain-ChatGLM源码:
cd ~/workspace/ git clone github.com/imClumsyPan…
装置依靠:
cd ~/workspace/langchain-ChatGLM pip install -r requirements.txt
装置依靠的进程中,可能会因为短少Cmake、protobuf和swig导致依靠PyMuPDF和oonx装置失败,因而对Cmake、protobuf和swig进行装置:
brew install Cmake brew install protobuf@3 #需指定版别,否则会报版别不一致过错 brew install swig
langchain-ChatGLM会运用模型进行自然言语文本的向量化,能够将这些模型下载到本地(若在RetrievalQA部分已下载,则无需再下载):
cd ~/workspace/models/ git lfs install #若ChatGLM-6B部分已履行,则无需再履行 git clone huggingface.co/GanymedeNil…
修正configs/model_config.py,修正第19行,设置文本向量化模型text2vec的本地地址:
"text2vec": "/Users/xxx/workspace/models/text2vec-large-chinese", #"text2vec": "GanymedeNil/text2vec-large-chinese",
修正第46行,设置ChatGLM2-6B-INT4的本地地址:
"local_model_path": "/Users/xxx/workspace/models/chatglm2-6b-int4", #"local_model_path": None,
修正第114行,将大言语模型由ChatGLM-6B改为ChatGLM-6B-INT4(实际运用的是ChatGLM2-6B-INT4):
LLM_MODEL = "chatglm-6b-int4" #LLM_MODEL = "chatglm-6b"
修正model/loader/loader.py第147行关于加载大言语模型的代码,删除或注释“to(self.llm_device)”:
model = (
LoaderClass.from_pretrained(
checkpoint,
config=self.model_config,
trust_remote_code=True)
.float()
#.to(self.llm_device)
)
实践中,“self.llm_device”的取值为“mps”(即运用并行处理),但若运用该设置,则会报以下过错:
File “/Users/xxx/.cache/huggingface/modules/transformers_modules/chatglm2-6b-int4/quantization.py”, line 54, in forward weight = extract_weight_to_half(quant_w, scale_w, weight_bit_width) File “/Users/xxx/.cache/huggingface/modules/transformers_modules/chatglm2-6b-int4/quantization.py”, line 261, in extract_weight_to_half assert scale_list.dtype in [torch.half, torch.bfloat16] AssertionError
预备本地知识库,笔者运用《超级汇川程序化构思产品手册》这一文档,将其以Markdown格局下载至本地,读者也能够运用该文档或其他文档。 履行cli_demo.py:
python cli_demo.py
按提示先指定本地知识库,本地知识库一起支撑目录和文件,关于目录,会扫描其间的文件。langchain-ChatGLM会对文件内容进行切分、向量化并构建向量索引。随后能够发问和本地知识库相关的问题。langchain-ChatGLM对问题进行向量化并从向量索引中寻觅语义相关的知识库内容,将问题和知识库内容按提示模板拼接在一起后作为大言语模型的输入由其进行推理,给出终究的答复,一起也列出与问题相关的知识库内容。履行成果如图16所示。
履行webui.py:
python webui.py
启动后的WEB UI如图17所示。
结语
以上记载了在本地布置ChatGLM-6B、ChatGLM2-6B、LangChain、langChain-ChatGLM并进行推理的进程,不包括模型的微调。经过进程中的不断学习,对大言语模型及其周边生态、以及在多种场景下的运用,有了必定的了解。但将大言语模型运用在真实场景、发挥真实作用,还需求在语料搜集、模型微调、提示设计等方面针对业务特点进行不断的打磨。文章内容如有过错之处,欢迎指正和沟通。另外,本地布置仅为了快速体会,现在也有很多免费的GPU云资源能够申请,例如阿里云,经过其能够在GPU云资源上进行模型的微调和推理。