当前位置:   article > 正文

langchain+chatglm阅读理解天龙八部_langchain 直接调用chatglm回答,不构造本地知识库

langchain 直接调用chatglm回答,不构造本地知识库

  上一章我们介绍了如何使用Transformers加载和运行预训练的模型,实现了与GPT模型的对话和咨询功能。然而,这种原生模型的知识是有限的,它无法对一些未知内容做出准确的回答,比如最新的时事、小众的小说,以及法院档案中的案件等。通过使用Langchain,我们有可能使GPT模型能够理解文章内容并进行分析,从而弥补这一限制。

流程理解

通过阅读langchain-ChatGLM源码,知道了langchain实现本地知识库问答的大体框架,这里通过流程图进行解说:

从上面的流程图可以看出,本地知识库问答实现流程如下:

  1. 通过langchain的CharacterTextSplitter对输入的文档进行拆分,得到文本分片;

  2. 将文本分片存入向量数据库VectorStore;

  3. 根据用户输入的自然语言在向量库中进行查询,得到相关分片文本;

  4. 结合预订的提示模板,以及用户查询,和文本分片,导入gpt中,进行问答;

  5. 将问答结果返回给用户。

代码实现

根据上面的流程,我对langchain-ChatGLM做了极简化,也实现了本地知识库的问答,这里输入天龙八部小说。可以对小说内容进行问答,代码(tlbb.py)如下:

  1. from langchain.document_loaders import TextLoader
  2. from langchain.embeddings.huggingface import HuggingFaceEmbeddings
  3. from langchain.text_splitter import CharacterTextSplitter
  4. from langchain.vectorstores import Chroma
  5. import torch.cuda
  6. import torch.backends
  7. import torch
  8. from transformers import AutoTokenizer, AutoModel
  9. model_path = "/root/prj/ChatGLM-6B/THUDM/chatglm2-6b-32k"
  10. tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
  11. model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda()
  12. model = model.eval()
  13. def torch_gc():
  14.    if torch.cuda.is_available():
  15.        # with torch.cuda.device(DEVICE):
  16.        torch.cuda.empty_cache()
  17.        torch.cuda.ipc_collect()
  18.    elif torch.backends.mps.is_available():
  19.        try:
  20.            from torch.mps import empty_cache
  21.            empty_cache()
  22.        except Exception as e:
  23.            print(e)
  24.            print("如果您使用的是 macOS 建议将 pytorch 版本升级至 2.0.0 或更高版本,以支持及时清理 torch 产生的内存占用。")
  25. # 加载文档,将其分割成块,嵌入每个块并将其加载到向量存储中。
  26. raw_documents = TextLoader('./tlbb.txt').load()
  27. text_splitter = CharacterTextSplitter(chunk_size=250, chunk_overlap=0)
  28. documents = text_splitter.split_documents(raw_documents)
  29. # 注意这里
  30. embedding_device = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
  31. embeddings = HuggingFaceEmbeddings(model_name="/root/prj/ChatGLM-6B/THUDM/text2vec-large-chinese", model_kwargs={'device': embedding_device})
  32. db = Chroma.from_documents(documents, embeddings)
  33. history = []
  34. while True:
  35.    query = input("question: ")
  36.    if test_text == "exit":
  37.        break;
  38.    embedding_vector = embeddings.embed_query(query)
  39.    docs = db.similarity_search_by_vector(embedding_vector)
  40.    #print(docs[0].page_content)
  41.    test_text = "用10个字回答" + query +":" + docs[0].page_content;
  42.    response, history = model.chat(tokenizer, test_text, history=history)
  43.    print("AI: " + response)
  44.    torch_gc()

测试效果如下,可以看到还是能回答一些问题的:

代码解析

  1. 模型加载,在上一篇中就已经学习到,如何加载模型,代码如下:

    1. model_path = "/root/prj/ChatGLM-6B/THUDM/chatglm2-6b-32k"
    2. tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
    3. model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda()
    4. model = model.eval()

  2. 文本分割,将天龙八部.txt的文本按指定长度(250)进行分割,得到分割文本集合:

    1. raw_documents = TextLoader('./tlbb.txt').load()
    2. text_splitter = CharacterTextSplitter(chunk_size=250, chunk_overlap=0)
    3. documents = text_splitter.split_documents(raw_documents)

  3. 文本嵌入向量化存储,这里使用embbedings加载text2vec-large-chinese模型执行向量化:

    1. embedding_device = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
    2. embeddings = HuggingFaceEmbeddings(model_name="/root/prj/ChatGLM-6B/THUDM/text2vec-large-chinese", model_kwargs={'device': embedding_device})
    3. db = Chroma.from_documents(documents, embeddings)

  4. 根据用户输入查询向量库分片数据:

    1. embedding_vector = embeddings.embed_query(query)
    2. docs = db.similarity_search_by_vector(embedding_vector)

  5. 组装prompt,像chatglm模型提问:

    1. test_text = "用10个字回答" + query +":" + docs[0].page_content;
    2. response, history = model.chat(tokenizer, test_text, history=history)
    3. print("AI: " + response)

总结

  使用Langchain-ChatGLM框架进行本地知识库问答的体验令人满意且有价值。通过该框架,GPT模型能更好地理解和回答与特定文章相关的问题,克服了原生模型在未知领域或主题上的限制。在实际测试中,我以天龙八部小说为例进行了尝试,效果尚可。

  框架的流程清晰,通过分割和向量化嵌入文本,模型能理解并提取文章的关键信息。结合查询和分片文本,经过预训练模型处理后,可以获得相对准确的回答。需要注意的是,模型的回答在某些情况下可能稍有偏差,但总体而言,在理解和回答方面表现令人满意。

  然而,框架的性能受实际文本质量和内容影响。对于更复杂的问题或更专业的领域,需要更精细的文本分割和知识库构建,以提升回答质量。总之,Langchain-ChatGLM为扩展GPT模型应用领域提供了一种有趣方式,使其能更好地处理不同领域和主题的问答需求。

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

闽ICP备14008679号