近来,聊天机器人已成为我们数字生活中不可或缺的一部分,简化了客户服务,增强了用户体验,甚至提供了陪伴。随着人工智能和自然语言处理技术的进步不断涌现,开发人员越来越多地寻求创新的解决方案,以创建更复杂、更人性化的聊天机器人。在本文中,我们将深入研究支持开发聊天机器人技术:使用LangChain框架构建的Alpaca,为有兴趣创建自己的聊天机器人或改进现有聊天机器人的人提供参考。准备好踏上聊天机器人创建技术领域的旅程,我们将揭开 Alpaca 非凡对话能力背后的秘密。
首先,您需要从HuggingFace安装Transformers库。通过 pip 使用 Python 包索引 (PyPI) 提供的版本,我建议直接从 GitHub 上的主分支安装它。这可确保您有权访问此项目所需的最新版本和模型。
要从 GitHub 安装转换器,只需运行以下命令:
pip install git+https://github.com/huggingface/transformers.git
现在,让我们谈谈将Hugging Face LLM(大型语言模型)包装器与LangChain框架集成在一起。LangChain允许无缝集成各种AI模型和标记器,使其成为构建Alpaca的完美选择。
以下是在 LangChain 中使用HuggingFace LLM 所涉及的步骤的概述:
- 导入所需的库和模块,例如 Transformer 和 LangChain。
- 使用适当的embedding模型和向量库,构建个性化知识库 。
- LangChain 来处理和生成响应。
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.chains import RetrievalQA
from langchain.indexes import VectorstoreIndexCreator
from langchain.text_splitter import CharacterTextSplitter
from langchain.text_splitter import TokenTextSplitter
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.document_loaders import TextLoader
from langchain.document_loaders import DirectoryLoader
import torch
EMBEDDING_DEVICE = "cuda" if torch.cuda.is_available() else "mps" #我没有N卡,只能将就使用M1的mps加速
一、建立知识库
1.1 中文 embedding
这里使用 text2vec-large-chinese 模型实现embedding https://huggingface.co/GanymedeNil/text2vec-large-chinese
embedding_model_name='./EmbeddingsModel/text2vec-large-chinese'
embeddings = HuggingFaceEmbeddings(model_name=embedding_model_name,
model_kwargs={'device': EMBEDDING_DEVICE})
1.2 本地目录下的知识库加载
loader = DirectoryLoader('./docs/', glob='**/*.txt',show_progress=True)
# 将数据转成 document 对象,每个文件会作为一个 document
documents = loader.load()
# 初始化加载器
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
# 切割加载的 document
split_docs = text_splitter.split_documents(documents)
100%|█████████████████████████████████████████████| 4/4 [00:00<00:00, 9.61it/s]
1.3 使用Chroma向量库,将Embedding数据持久化到磁盘
persist_directory = './db'
docsearch = Chroma.from_documents(split_docs, embeddings,persist_directory=persist_directory)
docsearch.persist()
Using embedded DuckDB with persistence: data will be stored in: ./db
1.4 Chroma向量库加载
# 加载数据
docsearch = Chroma(persist_directory=persist_directory, embedding_function=embeddings)
Using embedded DuckDB with persistence: data will be stored in: ./db
1.5 尝试查询向量库
尝试用一个提问来查询向量库的关联内容
query = "介绍下姚明"
docs = docsearch.similarity_search(query, k=1)
docs
可以看到通过查询,返回相关库最高的记录
[Document(page_content='姚明(Yao Ming),男,汉族,无党派人士,1980年9月12日出生于上海市徐汇区,祖籍江苏省苏州市吴江区震泽镇,前中国职业篮球运动员,司职中锋,现任亚洲篮球联合会主席、中国篮球协会主席、中职联公司董事长兼总经理, [1-3] 十三届全国青联副主席, [4] 改革先锋奖章获得者。 [5] 第十四届全国人大代表 [108] 。 1998年4月,姚明入选王非执教的国家队,开始篮球生涯。2001夺得CBA常规赛MVP,2002年夺得CBA总冠军以及总决赛MVP,分别3次当选CBA篮板王以及盖帽王,2次当选CBA扣篮王。在2002年NBA选秀中,他以状元秀身份被NBA的休斯敦火箭队选中,2003-09年连续6个赛季(生涯共8次)入选NBA全明星赛阵容,2次入选NBA最佳阵容二阵,3次入选NBA最佳阵容三阵。2009年,姚明收购上海男篮,成为上海久事大鲨鱼俱乐部老板。2011年7月20日,姚明宣布退役。 2013年,姚明当选为第十二届全国政协委员。2015年2月10日,姚明正式成为北京申办冬季奥林匹克运动会形象大使之一。2016年4月4日,姚明正式入选2016年奈史密斯篮球名人纪念堂,成为首位获此殊荣的中国人;10月,姚明成为中国“火星大使”;11月,当选CBA公司副董事长。 [6] 2017年10月20日,姚明已将上海哔哩哔哩俱乐部全部股权转让。 [7] 2018年9月,荣获第十届“中华慈善奖”慈善楷模奖项。 [8] 2019年10月28日,胡润研究院发布《2019胡润80后白手起家富豪榜》,姚明以22亿元排名第48。', metadata={'source': 'docs/姚明.txt'})
]
二、LLM 语言模型
我使用LlamaCpp加载Alpaca 13B的4bit量化模型,如果你有独立GPU,可以尝试加载更大的模型,在我的M1 Air上,13B的4bit量化模型已经是极限。
from langchain.llms import LlamaCpp
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
from langchain import PromptTemplate,LLMChain
from langchain.vectorstores import Chroma
加载向量库
persist_directory = './db'
db = Chroma(persist_directory=persist_directory, embedding_function=embeddings)
Using embedded DuckDB with persistence: data will be stored in: ./db
callbacks = [StreamingStdOutCallbackHandler()]
2.1 加载LLM模型
Mac M系列芯片 加载模型后,如果NEON = 1显示 ,则表示正常;NEON = 0说明没有按照arm64架构正确安装。
local_llm = LlamaCpp(model_path="./zh-models/13B/ggml-model-q4_0.bin",
n_ctx=2048,
callbacks=callbacks,
verbose=False)
llama.cpp: loading model from /Users/fupengcheng/Documents/llama.cpp/zh-models/13B/ggml-model-q4_0.bin
llama_model_load_internal: format = ggjt v3 (latest)
llama_model_load_internal: n_vocab = 49954
llama_model_load_internal: n_ctx = 2048
llama_model_load_internal: n_embd = 5120
llama_model_load_internal: n_mult = 256
llama_model_load_internal: n_head = 40
llama_model_load_internal: n_layer = 40
llama_model_load_internal: n_rot = 128
llama_model_load_internal: ftype = 2 (mostly Q4_0)
llama_model_load_internal: n_ff = 13824
llama_model_load_internal: n_parts = 1
llama_model_load_internal: model size = 13B
llama_model_load_internal: ggml ctx size = 0.09 MB
llama_model_load_internal: mem required = 9130.33 MB (+ 1608.00 MB per state)
.
llama_init_from_file: kv self size = 1600.00 MB
AVX = 0 | AVX2 = 0 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 0 | NEON = 1 | ARM_FMA = 1 | F16C = 0 | FP16_VA = 1 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 0 | VSX = 0 |
2.2 直接提问
output = local_llm("Q: “问问他问什么问题”这句话是什么意思 A: ") #, max_tokens=512, stop=["Q:", "\n"], echo=True)
意思是“询问某人某件事情”。
2.3 结合向量库的内容提问
retriever = db.as_retriever(search_kwargs={"k": 2})
qa = RetrievalQA.from_chain_type(llm=local_llm, chain_type="stuff", retriever=retriever, return_source_documents= True)
res = qa("姚明是谁?")
Llama.generate: prefix-match hit
姚明(Yao Ming)是前中国职业篮球运动员、现任亚洲篮球联合会主席、中国篮球协会主席、中职联公司董事长兼总经理,1993年入选国少队,1998年进入休斯敦火箭队。
answer, docs = res['result'], res['source_documents']
这里我们查看一下,通过RetrievalQA的返回,answer是llm的答案,docs是向量库相关性搜索后提供给llm的prompt
answer
' 姚明(Yao Ming)是前中国职业篮球运动员、现任亚洲篮球联合会主席、中国篮球协会主席、中职联公司董事长兼总经理,1993年入选国少队,1998年进入休斯敦火箭队。'
docs
[Document(page_content='姚明(Yao Ming),男,汉族,无党派人士,1980年9月12日出生于上海市徐汇区,祖籍江苏省苏州市吴江区震泽镇,前中国职业篮球运动员,司职中锋,现任亚洲篮球联合会主席、中国篮球协会主席、中职联公司董事长兼总经理, [1-3] 十三届全国青联副主席, [4] 改革先锋奖章获得者。 [5] 第十四届全国人大代表 [108] 。 1998年4月,姚明入选王非执教的国家队,开始篮球生涯。2001夺得CBA常规赛MVP,2002年夺得CBA总冠军以及总决赛MVP,分别3次当选CBA篮板王以及盖帽王,2次当选CBA扣篮王。在2002年NBA选秀中,他以状元秀身份被NBA的休斯敦火箭队选中,2003-09年连续6个赛季(生涯共8次)入选NBA全明星赛阵容,2次入选NBA最佳阵容二阵,3次入选NBA最佳阵容三阵。2009年,姚明收购上海男篮,成为上海久事大鲨鱼俱乐部老板。2011年7月20日,姚明宣布退役。 2013年,姚明当选为第十二届全国政协委员。2015年2月10日,姚明正式成为北京申办冬季奥林匹克运动会形象大使之一。2016年4月4日,姚明正式入选2016年奈史密斯篮球名人纪念堂,成为首位获此殊荣的中国人;10月,姚明成为中国“火星大使”;11月,当选CBA公司副董事长。 [6] 2017年10月20日,姚明已将上海哔哩哔哩俱乐部全部股权转让。 [7] 2018年9月,荣获第十届“中华慈善奖”慈善楷模奖项。 [8] 2019年10月28日,胡润研究院发布《2019胡润80后白手起家富豪榜》,姚明以22亿元排名第48。', metadata={'source': 'docs/姚明.txt'}),
Document(page_content='科比·布莱恩特(Kobe Bryant,1978年8月23日—2020年1月26日),全名科比·比恩·布莱恩特·考克斯(Kobe Bean Bryant Cox),出生于美国宾夕法尼亚州费城,美国已故篮球运动员,司职得分后卫/小前锋。 [5] [24] [84] 1996年NBA选秀,科比于第1轮第13顺位被夏洛特黄蜂队选中并被交易至洛杉矶湖人队,整个NBA生涯都效力于洛杉矶湖人队;共获得5次NBA总冠军、1次NBA常规赛MVP、2次NBA总决赛MVP、4次NBA全明星赛MVP、2次NBA赛季得分王;共入选NBA全明星首发阵容18次、NBA最佳阵容15次(其中一阵11次、二阵2次、三阵2次)、NBA最佳防守阵容12次(其中一阵9次、二阵3次)。 [9] [24] 2007年,科比首次入选美国国家男子篮球队,后帮助美国队夺得2007年美洲男篮锦标赛金牌、2008年北京奥运会男子篮球金牌以及2012年伦敦奥运会男子篮球金牌。 [91] 2015年11月30日,科比发文宣布将在赛季结束后退役。 [100] 2017年12月19日,湖人队为科比举行球衣退役仪式。 [22] 2020年4月5日,科比入选奈·史密斯篮球名人纪念堂。 [7] 美国时间2020年1月26日(北京时间2020年1月27日),科比因直升机事故遇难,享年41岁。 [23]', metadata={'source': 'docs/科比.txt'})]
2.4 其它尝试
res = qa("姚明什么时候退役?")
Llama.generate: prefix-match hit
2011年7月20日,姚明宣布退休。
res = qa("姚明担任过政协委员吗?")
Llama.generate: prefix-match hit
是的,根据资料,2013年11月14日,政协第十一届全国委员会常务委员会第一次会议通过了政协副主席王家瑞代表提案,决定选出第十三届中国人民大会员。姚记篮球俱乐部,姚明当选政协委员。
res = qa("姚明几次入选全明星赛阵容?")
Llama.generate: prefix-match hit
姚明在职业生涯中共获得了5次NBA全明星赛的出场资格。
res=qa("介绍一下马保国")
Llama.generate: prefix-match hit
马保国(1958年-)是中国武术表演艺术家、混元太极拳协会创始人,自称“浑元形意太极拳掌门人”。