• 第一章: LangChain 生成与加载知识库并根据匹配内容回答问题


    LangChain——让文本大模型更加智能化系列文章目录

    第一章 langchain生成与加载向量库并根据匹配内容回答问题



    前言

    LangChain 是一个用于开发由语言模型驱动的应用程序的框架。我们相信,最强大和不同的应用程序不仅将通过 API 调用语言模型,还将:

    • 数据感知:将语言模型与其他数据源连接在一起。
    • 主动性:允许语言模型与其环境进行交互。

    因此,LangChain 框架的设计目标是为了实现这些类型的应用程序。

    LangChain 框架提供了两个主要的价值主张:

    • 组件:LangChain 为处理语言模型所需的组件提供模块化的抽象。LangChain
      还为所有这些抽象提供了实现的集合。这些组件旨在易于使用,无论您是否使用 LangChain 框架的其余部分。
    • 用例特定链:链可以被看作是以特定方式组装这些组件,以便最好地完成特定用例。这旨在成为一个更高级别的接口,使人们可以轻松地开始特定的用例。这些链也旨在可定制化。

    LangChain 提供了对几个主要模块的支持。这些模块按照逐渐增加的复杂性排列如下:

    • 模型(models) : LangChain 支持的各种模型类型和模型集成。
    • 提示(prompts) : 包括提示管理、提示优化和提示序列化。
    • 内存(memory) :内存是在链/代理调用之间保持状态的概念。LangChain提供了一个标准的内存接口、一组内存实现及使用内存的链/代理示例。
    • 索引(indexes) : 与您自己的文本数据结合使用时,语言模型往往更加强大——此模块涵盖了执行此操作的最佳实践。
    • 链(chains) : 链不仅仅是单个 LLM 调用,还包括一系列调用(无论是调用 LLM还是不同的实用工具)。LangChain提供了一种标准的链接口、许多与其他工具的集成。LangChain提供了用于常见应用程序的端到端的链调用。
    • 代理(agents) :代理涉及 LLM做出行动决策、执行该行动、查看一个观察结果,并重复该过程直到完成。LangChain提供了一个标准的代理接口,一系列可供选择的代理,以及端到端代理的示例。

    文章简介

    本文主要介绍了基于LangChain的文本内容切分、向量生成、存储、加载以及Prompt拼接与文本大模型输出连接的方法。LangChain是一种用于文本大模型的框架,通过对文本内容进行切分,生成向量,存储向量,加载向量等步骤,实现文本内容的处理和建模。在LangChain框架下,我们可以将文本内容切分为多个片段,并使用向量表示每个片段。这些向量可以存储在计算机内存中,也可以存储在磁盘上。我们可以将问题与匹配到的知识与Prompt进行拼接,并将其输入到文本大模型中进行处理和输出。通过这种方式,我们可以使用LangChain框架和ChatGLM2-6B文本大模型来处理和建模文本内容,从而实现对一些领域的专业知识进行准确的回答。

    一、使用步骤

    1.引入库

    from chatglm_llm import *
    from transformers import AutoTokenizer, AutoModel
    from langchain.document_loaders import UnstructuredFileLoader
    from langchain.text_splitter import CharacterTextSplitter
    from langchain.embeddings import HuggingFaceEmbeddings
    from langchain.vectorstores import FAISS
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.LLM加载

    # ChatGLM2-6B 模型加载
    tokenizer = AutoTokenizer.from_pretrained("/workspace/models/chatglm2-6b", trust_remote_code=True)
    model = AutoModel.from_pretrained("/workspace/models/chatglm2-6b", trust_remote_code=True).float()
    chatglm = model.eval()
    
    • 1
    • 2
    • 3
    • 4

    3.数据加载

    # 非结构化数据路径
    filepath = "demo.txt"
    # 向量存储路径
    vs_path = "knowledge_base/vector_store"
    # 读取非结构化数据
    loader = UnstructuredFileLoader(filepath)
    docs = loader.load()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.数据切分与转换向量

    # 定义文本切分
    text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=200)
    docs = text_splitter.split_documents(docs)
    # 加载Embedding模型
    embeddings = HuggingFaceEmbeddings(model_name="/workspace/models/text2vec-base-chinese")
    # 使用langchain的FAISS构建向量库
    vector_store = FAISS.from_documents(docs, embeddings)
    # 存储为本地向量库
    vector_store.save_local(vs_path)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5.构建prompt

    prompt = f"""基于以下已知信息,请简洁并专业地回答用户的问题。
                如果无法从中得到答案,请说 "根据已知信息无法回答该问题""没有提供足够的相关信息"。不允许在答案中添加编造成分。另外,答案请使用中文。
                已知内容:
                {context}
                问题:
                {query}"""
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5.查询知识库并将结果传入LLM中

    query = " 什么是知识图谱?"
    # 匹配query相似语句
    docs = vector_store.similarity_search(query)
    # 将相似语句循环写入context列表
    context = [doc.page_content for doc in docs]
    # 将prompt模板传入模型中,生成答案
    answer = chatglm.chat(tokenizer, prompt1, history=[])
    print(answer)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    总结

    工作随笔,希望可以帮助到大家!
    如有不足之处,请多多指教!

    如需获取完整代码,请添加公众号,发送“langchain”

    在这里插入图片描述

  • 相关阅读:
    【leetcode】【剑指offer Ⅱ】048. 序列化与反序列化二叉树
    SQL SERVER连接oracle数据库几种方法
    RPA主要有那些特征,多久可以学会?
    win10音量调节不起作用
    解密Linux中的通用块层:加速存储系统,提升系统性能
    MISC:压缩包取证(zip爆破、明文攻击、伪加密、CRC32碰撞)
    Go语言结构体指针
    Rancher 2.6 全新 Logging 快速入门(2)
    上门服务小程序系统|多元化服务和高效便捷的服务体验
    ACL 2019 - AMR Parsing as Sequence-to-Graph Transduction
  • 原文地址:https://blog.csdn.net/black_lightning/article/details/134021712