基于书生·浦语大语言模型和langchain构建知识库

1、大模型的局限性

通用大模型可以在多个领域上解答简单问题,但对于垂直领域的专业问题有限, 打造垂直大模型是大模型发展的重要方向

2、大语言模型的开发范式

目前有两种核心的大模型开发范式,可以拓展大模型的能力,解决其面临的局限性。这两种开发范式分别是RAG检索增强生成和延承传统自然语言处理算法的微调

RAG的核心思想是给大模型外挂一个知识库,通过匹配相关文档和提问来生成回答。

funturn的核心思想是在较小的训练集上进行轻量级的训练微调,提升模型在新数据集上的能力

RAG的核心优势在于成本低且可实时更新,但能力受基座模型影响大

fineturn的核心优势在于可个性化微调,且知识覆盖面广,但需要在新的数据集上进行训练且更新成本高

那么,如何打造使用RAG打造一个个人专属的大模型应用呢。

3、LangChain介绍

LangChain是一个第三方开源框架,用于开发大模型应用程序。LangChain提供了通用接口,可以简化大模型应用程序的开发流程, 现在已经封装了许多组件,可以构建不同类型的RAG应用。 开发者可以将私有数据嵌入到LangChain中的组件,并通过组合构建适用于自己业务场景的RAG应用。LangChain的核心组成部分是链,也就是chains,通过链可以封装大模型操作。

1. 使用Unstructed Loader组件加载本地文档,将不同格式的本地文档转换为纯文本格式

2. 通过Text Splitter组件对纯文本进行分割,存储到基于chroma的向量数据库中

3. 使用 sentence transformer将用户输入转化为向量格式,存储到向量数据库中

4. 通过向量数据库中的相似度匹配,找到与用户输入相关的文本段,嵌入到prompt template中

5. 使用大模型进行最后的回答,整个过程被封装在检索问答面中,可以构建属于自己的RAG应用

4、构建向量库

1. 向量数据库的构建包括加载原文档、文档分块和文档向量化三个部分

2. 加载原文档需要确定原文档的类型,并选用适当的加载器

3. 文档分块需要对加载的文本进行切分,以实现问答文本分割

4. 可以手动控制分割块的长度和重叠区域的长度,提升向量数据库的检索效果

5. 向量数据库的最后一步是将文档向量化并存入向量数据库,可以使用任意一种 embedding模型进行向量化,并使用开源词向量sentence transformer。

5、搭建知识库助手

from langchain.llms.base import LLM
from typing import Any, List, Optional
from langchain.callbacks.manager import CallbackManagerForLLMRun
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

class InternLM_LLM(LLM):
    # 基于本地 InternLM 自定义 LLM 类
    tokenizer : AutoTokenizer = None
    model: AutoModelForCausalLM = None

    def __init__(self, model_path :str):
        # model_path: InternLM 模型路径
        # 从本地初始化模型
        super().__init__()
        print("正在从本地加载模型...")
        self.tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
        self.model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True).to(torch.bfloat16).cuda()
        self.model = self.model.eval()
        print("完成本地模型的加载")

    def _call(self, prompt : str, stop: Optional[List[str]] = None,
                run_manager: Optional[CallbackManagerForLLMRun] = None,
                **kwargs: Any):
        # 重写调用函数
        system_prompt = """You are an AI assistant whose name is InternLM (书生·浦语).
        - InternLM (书生·浦语) is a conversational language model that is developed by Shanghai AI Laboratory (上海人工智能实验室). It is designed to be helpful, honest, and harmless.
        - InternLM (书生·浦语) can understand and communicate fluently in the language chosen by the user such as English and 中文.
        """
        
        messages = [(system_prompt, '')]
        response, history = self.model.chat(self.tokenizer, prompt , history=messages)
        return response
        
    @property
    def _llm_type(self) -> str:
        return "InternLM"

1. 知识库助手的问答性能受限于检索精度和prompt的性能

2. 可以基于语义而不是字符长度进行创客的切分,保证语义完整性

3. 可以给每个创客生成概括性的索引,提高检索召回的精度

4. 可以迭代优化promt的策略,提高回答的性能

5. 可以将应用构建成一个web demo并部署在网页上


from langchain.vectorstores import Chroma
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
import os
from LLM import InternLM_LLM
from langchain.prompts import PromptTemplate
from langchain.chains import RetrievalQA

def load_chain():
    # 加载问答链
    # 定义 Embeddings
    embeddings = HuggingFaceEmbeddings(model_name="/root/data/model/sentence-transformer")

    # 向量数据库持久化路径
    persist_directory = 'data_base/vector_db/chroma'

    # 加载数据库
    vectordb = Chroma(
        persist_directory=persist_directory,  # 允许我们将persist_directory目录保存到磁盘上
        embedding_function=embeddings
    )

    # 加载自定义 LLM
    llm = InternLM_LLM(model_path = "/root/data/model/Shanghai_AI_Laboratory/internlm-chat-7b")

    # 定义一个 Prompt Template
    template = """使用以下上下文来回答最后的问题。如果你不知道答案,就说你不知道,不要试图编造答
    案。尽量使答案简明扼要。总是在回答的最后说“谢谢你的提问!”。
    {context}
    问题: {question}
    有用的回答:"""

    QA_CHAIN_PROMPT = PromptTemplate(input_variables=["context","question"],template=template)

    # 运行 chain
    qa_chain = RetrievalQA.from_chain_type(llm,retriever=vectordb.as_retriever(),return_source_documents=True,chain_type_kwargs={"prompt":QA_CHAIN_PROMPT})
    
    return qa_chain

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值