当前位置:   article > 正文

深度学习:Langchain-ChatGLM项目介绍_langchain chatglm提取知识图谱

langchain chatglm提取知识图谱

一、chatGLM

  1. chatGLM-6B是一个开源的、支持中英双语的 对话语言模型 ,基于General Language Model(GLM)架构,具有62亿参数。
    更新v1.1版本checkpoint,训练数据增加英文指令微调数据以平衡中英文数据比例,解决英文回答中夹杂中文的现象。
  2. chatGLM-6B具备的能力:
      自我认知(你是谁?介绍一下你的优点)
      提纲写作(帮我写一个介绍)
      文案写作(写10条热品论文案)
      信息抽取(从上述信息中抽取人,时间,事件)

二、langChain

  1. 是一个用于开发 由语言模型驱动的应用程序的框架(即构建LLM应用)。
  2. 主要功能:
      调用语言模型
      将不同数据源接入到语言模型的交互中
      允许语言模型与运行模型交互
  3. 应用场景:
      文档问答(在特定文档上回答问题,指利用这些文档中的信息来构建答案)
      个人助理
      查询表格数据
      与API交互(使语言模型和API交互非常强大,它允许他们访问最新信息,并允许它们采取行动)
      信息提取(从文本中提取结构化信息)
      文档总结

三、基于本地知识的文档问答

  1. 用户输入问题:
    Langchain能够接入那些数据类型?
    加工后的提问内容格式:
    已知信息:Langchain能够加载文本、ppt、图片、html、pdf等非结构化文件并转换为文本信息
      根据已知信息回答问题:Langchain能够接入那些数据类型?

    其中,已知信息是由本地文档中抽取的相关信息,并将 提出的问题和匹配出来的相关的信息 按照 模板的形式 形成最终输入给语言模型的一整套 提示词
    (以上可以在ChatPhaLaw项目代码中找到该种格式的提问内容)
  2. 步骤:
      加载本地文档: 读取本地文档加载为文本
      文本拆分:将文本按照字符、长度、语义进行拆分(进行文本拆分:是因为语言模型输入是有长度限制的,无法将一整片文档全输入给语言模型,所以我们要筛选出有用信息,并和提问一起给语言模型)
      根据提问匹配文本: 根据用户提问对拆分后的文本进行 字符匹配(关键字模糊匹配) 或者 语义检索(将文本向量化之后进行一个向量空间的检索(老鼠吃奶酪 和 老鼠吃香油 一个意思)
      构建Prompt: 将匹配文本、用户提问加入Prompt模板
      LLM生产回答: 将Promp发送隔给LLM获取基于文档内容的回答。该步骤为为单一文件的文档问答,知识库是多个文件,要针对多个文档上传后形成的一整个知识库进行文本匹配和问答
  3. 原理图:
    (https://github.com/chatchat-space/Langchain-Chatchat/blob/master/img/langchain+chatglm.png)
    text spliter将加载进来的原始文本切分成更短的段落
    Embedding模型将文本段落向量化
    VectorStore向量数据库(本地知识库的本体) 1-6过程就是构建向量数据库
    query也经过Embedding向量化后去向量数据库跟已有的文段向量进行匹配,取出一个或多个相关度最高的,形成相关文段
    Prompt进入语言模型
  4. 简单使用:
  5. 加载模型
    from tansformers import AutoTokenizer, AutoModel
    tokenizer = AutoTokenizer.from_pretrained(“THUDM/chatglm-6b”, trust_remote_code=True) 第一个参数为模型地址,若已下载到本地,则改为本地地址即可
    model = AutoModel.from_pretrained(“THUDM/chatglm-6b”, trust_remote_code=True).half().cuda()
    chatglm = model.eval()
     
    response, hitstory = model.chat(tokenizer, ‘你好’, history=[]) 直接对话
    print(response)
     
    加载知识库
    path=‘’ 知识库需要的文件路径
    loader = UnstructuredFile Loader(path) 加载文件
    docs = loader.load()
    CharacterTextSplitter(chunk_size, chunk_overlap) 文本切割类
          chunk_size:每段文本长度
          chunk_overlap:相邻两端文本之间的有多少个字符的重复(防止完整的一个句子被切开导致语义不完整)
    docs = 文本切割对象.split_text(docs)
    embedding = OpenAIEmbeddings()
    vextor_store = FAISS.from_documents(docs, embedding) 构建向量库
          docs: 切好的文本
          embedding: 向量化模型
     
    和LLM模型对话
    query=‘问题’
    docs = vextor_store.similarity_search(query) 根据提问匹配上下文
    context = [doc.page_conetent for doc in docs]
         doc为lang_chain包装的document对象。
         注意此处的context有点点问题,应该为字符串,并用换行符连接
    prompt = f"已知信息:\n{context}\n根据已知信息回答问题:\n{query}"
    chatglm.chat(tokenizer, prompt, history=[]) 进行对话,llm生成回答
          history: 对话历史信息

四、Langchain-ChatGLM项目

  1. 特点:
      依托于chatGLM等开源模型实现,可离线部署
      基于langchain实现,可快速实现接入多种数据源(不同类型的Documentloader来处理不同类型文件数据·)
      在分句、文档读取方面,针对中文使用场景进行了优化
      支持pdf, txt, md, docx,有文本的jpg, png等文件类型接入,具备命令行demo、webui和vue前端

  2. 项目结构:
      models: llm开源模型的接口类与实现类,针对开源模型提高流式输出支持(二次开发者对接口进行了重新定义,因为原本langchain对开源模型不支持流式输出)
      loader: 文档加载器的实现类(对pdf做了重新设计,扫描类的pdf需要进行ocr识别时,对中文的支持更好了一些)
      textsplitter:文本切分的实现类
      chains: 工作链路实现,如chains/local_doc_qa实现了基于本地文档的问答。目前作者也只实现了本地文档问答,后面作者还会实现基于库表、知识图谱等不同类型的chain, 放在该文件夹下
      content:存储上传的原始文件
      vector_store: 存储向量库文件,即本地知识库本体
    使用FIASS存储方式(项目中默认的存储方式),会在本地路径下存储一个文件夹,包括.index在内有两个文件共同表示向量库具体存储信息
    config: 项目中用到的各类配置项信息

  3. 涉及模型主要有 Embedding模型 和 自然语言模型LLM
    注意:
    在上述代码中,OpenAIEmbeddings可以处理500字的字段,但对其他一些开源的本地的模型来说一般一次处理100字的文本。所以在Langchain-ChatGLM项目中,将文本分的更细一些(是100字限制)

  4. Langchain-ChatGLM的实现原理图及文本划分:
    https://github.com/chatchat-space/Langchain-Chatchat/blob/master/img/langchain%2Bchatglm2.png
    在图中可以发现,进行vector search时,找到对应的匹配文本后,并不是将该已知信息文本返回,还要将它的上一个和下一个分段也扩充一起返回(防止语义丢失,原本只有100字限制,经过上下文扩充后达到250字左右),并与query提问组成了prompt,交给LLM自然语言模型
    注意:匹配的文本可能不是只取top1,而是top5取前五个。这时有多个上下文分段了,需要再处理,可能会有上下文分段扩充多遍的情况,此时会再进行 重新排序+去重 , 避免不同段扩充之后,扩充了相同内容,浪费了语言模型的字符总数
    当以符号划分文本时,超过一百个词的话会有重复,防止语义丢失,或者以’。'划分文本时,当一句话超过100个字,他就会再根据逗号,分号等划分

  5. web-ui界面:
      LLM对话:直接和LLM语言模型进行对话
      知识库问答: 基于本地知识库进行对话,LLM总结内容并结合自己的理解回答
      bing搜索问答: 将问题交给bing搜索之后,将搜索内容提供给LLM,LLM再进行回答

  6. 未来二次开发者可以优化的方向:
      模型微调:对llm和embedding基于专业领域数据进行微调
      文档加工:再文本分段后,对每段分别进行总结,基于总结内容语义进行匹配
      借助不同模型能力:在text2sql, text2cpyher场景下需要产生代码时,可以借助不同模型能力???
      …

  7. 后续作者开发方向:
      扩充数据源(知识图谱,网页,库表)
      知识库管理(完善知识库中增删改查功能,并支持更多向量库类型)
      扩充文本划分方式(针对中文场景,提高更多文本划分和上下文扩充方式)
      探索Agent应用(利用开源模型LLM探索Agent的实现与应用)

  8. 该项目图片目前用的是paddleOCR的包 图片提取文字 -》 保存 txt-》 再加载

  9. add_doucments() 本地知识库新增文本(知识库中已有文本)
    from_documents() 本地知识库新增文本(知识库中无文本)

  10. get_knowledge_based_conent_test函数,可传入一个score_threshold参数,值越高,相关度越低
      0,不设置该值
      500左右时,匹配结果更好,会舍去一些相关度低的文本,防止影响answer
    理解:根据问题,从向量库中匹配出6句话,而score 高于 score_threshold的社区,只保留相关度高的文本段交给llm模型

五、Chat GLM+ LangChain视频地址:

https://www.bilibili.com/video/BV13M4y1e7cN/?share_source=copy_web&vd_source=e6c5aafe684f30fbe41925d61ca6d514

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

闽ICP备14008679号