当前位置:   article > 正文

ChatGLM3 Langchain模式修炼知识库外挂_langchain大模型如何外挂知识库

langchain大模型如何外挂知识库

基于chatGLM3,应用langchain模式外挂知识库进行问答训练。

主要思路:将外挂知识库文本制成文本向量库,与提问文本做相似度比对,选出高相似度信息进行回答。

一 环境平台配置

可参考网上教程,注册阿里云,免费获取3个月的GPU资源。

二 langchain本地部署

1. 知识库文本加载&文本切割

  1. //文本加载库
  2. from langchain.document_loaders import DirectoryLoader
  3. //文本切割库
  4. from langchain.text_splitter import CharacterTextSplitter
  5. //directory中用文本路径替换
  6. def load_documents(directory = "books"):
  7. loader = DirectoryLoader(directory)
  8. documents = loader.load()
  9. # for d in documents:
  10. # print(d)
  11. text_spliter = CharacterTextSplitter(chunk_size = 256, chunk_overlap = 1) //切分的文本长度为256,交叠部分为1,根据GPU资源大小,可以增大该参数,使训练更加精准
  12. split_docs = text_spliter.split_documents(documents)
  13. # print(split_docs[:2])
  14. return split_docs

2 文本词嵌入

国内需下载相关模型进行本地化调用,可使用模型清单包括:ernie-3.0-nano-zh、ernie-3.0-mediu-zh、text2vec-large-chinese、sbert-bert-chinese-nli、text2vec-base-chinese、

  1. //词嵌入模型列表
  2. # embedding
  3. embedding_model_dict = {
  4. "ernie-tiny": "nghuyong/ernie-3.0-nano-zh", //国内禁用,可修改成本地路径
  5. "ernie-medium": "/mnt/workspace/ChatGLM3/openai_api_demo/ernie-3.0-medium-zh",
  6. "text2vec": "/mnt/workspace/ChatGLM3/text2vec-large-chinese",
  7. "text2vec2": "uer/sbert-base-chinese-nli",
  8. "text2vec3": "/mnt/workspace/ChatGLM3/text2vec-base-chinese"
  9. }
  10. def load_embedding_mode(model_name = "ernie-tiny"):
  11. encode_kwargs = {"normalize_embeddings":False}
  12. model_kwargs = {"device":"cuda:0"}
  13. return HuggingFaceEmbeddings(
  14. model_name = embedding_model_dict[model_name]
  15. model_kwargs = model_kwargs,
  16. encode_kwargs = encode_kwargs,
  17. cache_folder = "/mnt/workspace/ChatGLM3"
  18. )
  19. embeddings = load_embedding_mode('text2vec')

3 向量数据库构建

可选用chroma或FAISSS,此处以chroma为例。同样方式可使用faiss,且建议使用FAISS,chroma容易产生embedding dimensity错误。

  1. from langchain.vectorstores import Chroma
  2. def store_chroma(docs, embeddings,persist_directory = 'VectorStore'):
  3. db = Chroma.from_documents(docs, embeddings, persist_directory = persist_directory)
  4. db.persist()
  5. return db

4. 模型加载

  1. MODEL_PATH = os.environ.get('MODEL_PATH', '/mnt/workspace/ChatGLM3/chatglm3-6b')
  2. model_config = AutoConfig.from_pretrained(
  3. MODEL_PATH,
  4. trust_remote_code=True
  5. )
  6. tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_code=True)
  7. model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True, device='cuda').half().quantize(4).cuda()
  8. model = model.eval()

5 使用词向量相似度进行答案检索

(1)通过相似度比对,可找到相似的K个文本,再次作为大模型的输入进行答案检索。且可输入固定格式的prompt,以便提高模型识别率。

(2)通过history参数的设置,可稳定较为关键固定的答案,提升模型回答的准确率。比如:某些规则。

  1. hist = [
  2. {'role': 'user','content':"基于下面给出的资料,回答问题。如果资料不足,回答不了,就回复不知道,下面是资料。\n小王子来自哪里\n1.小王子来自B612星星"},
  3. {'role': 'user','content':"基于下面给出的资料,回答问题。如果资料不足,回答不了,就回复不知道,下面是资料。\n狐狸告诉小王子的秘密是什么\n1.狐狸告诉小王子的秘密是:只有用心才能看得清,重要的东西,用眼睛是看不见的"},
  4. {'role': 'user','content':"基于下面给出的资料,回答问题。如果资料不足,回答不了,就回复不知道,下面是资料。\n小王子是谁\n1.小王子是一个虚构的人物,出自法国作家安托万·德·圣埃克苏佩里的作品《小王子》"}
  5. ]
  6. while True:
  7. query = input('Human:')
  8. similar_docs = db.similarity_search(query,include_metadata = True,k = 3)
  9. prompt = f'基于下面给出的资料,回答问题。基于下面给出的资料,回答问题。如果资料不足,回答不了,就回复不知道,下面是资料。\n'
  10. for idx, doc in enumerate(similar_docs):
  11. prompt += f'{idx+1}. {doc.page_content}\n'
  12. prompt += f'下面是问题:{query}'
  13. # print(prompt)
  14. response, history = model.chat(tokenizer, prompt, history=hist)
  15. print(response)
  16. print('\n')
  17. print(f'history:{history}')
  18. print('\n')

二 API方式调用

通过API方式,可支持多个模块并行调用,提高模型使用效能

1. API启动:demo中有个API接口,可直接进行启动。但此处建议将之前的词向量库替换成FAISS,否则embedding维度会报错。

2. 模型接口能力调用

  1. from langchain.chains import RetrievalQA
  2. from langchain.llms import ChatGLM
  3. //API接口调用
  4. llm = ChatGLM(
  5. endpoint = 'http://127.0.0.1:8000/v1/chat/completions',
  6. max_token = 80000,
  7. top_p =0.9
  8. )
  9. //
  10. retriever = db.as_retriever()
  11. qa = RetrievalQA.from_chain_type(
  12. llm = llm,
  13. chain_type = 'stuff',
  14. retriever = retriever
  15. )
  16. def chat(question,history):
  17. response = qa.run(question)
  18. return(response)
  19. //使用gradio界面化
  20. demo = gr.ChatInterface(chat)
  21. demo.launch(inbrowser = True)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/255453
推荐阅读
相关标签
  

闽ICP备14008679号