3分钟创建基于私有文档的本地问答系统[无需联网]

2023-05-22 16:07:06 浏览数 (1)

背景

在当前信息爆炸的时代,越来越多的企业、组织甚至个人都面临着处理和管理大量的信息的挑战。其中,对于问题和答案的管理尤其重要,因为它可以直接影响到企业或组织的运作和效率。

为了有效地管理问题和答案,许多企业都已经基于ChatGPT能力开始或者正在使用基于文档的问题跟踪系统。这种系统可以让企业或组织记录和追踪问题,包括问题的来源、紧急程度、处理进度以及最终的解决方案等信息。但是,为了更好地保护企业或组织的私密信息,有时需要一个私有化的基于私有文档的问题系统。

私有化的基于私有文档的问题系统可以帮助企业或组织更好地管理他们的问题和答案,同时保护他们的私密信息。

那么为何我们需要保护私密信息?

总所周知,三星在使用ChatGPT时,因为不当使用,导致机密信息泄露,造成了非常不良的影像,如果存在和外网交互,那么就存在泄露的风险。而使用一个私有化且基于私有文档的问题系统,可以确保这些私密信息只有被授权的人员才能够访问,这就避免了信息泄露,同时也兼顾了工作效率。

如何在三分钟搭建一个私有化的文档问答系统,代码仓库见文末

要做到这一点,大体上来讲需要有2步:

1/对文档进行embedding

2/基于embedding后的文档进行问答

直接看下效果,这里有一个文档,关于https://pub.dev/packages/flex_color_scheme的说明文档,我交给 privateGpt 进行学习:

学习完毕之后,我就基于文档的内容来问答了

我的第一个问题是什么是 what is FlexColorScheme

它就很准确的给出了这个库是做啥的,而且还给出了引用了文档中的哪些处的内容。

他的实现原理是啥

1、首先是学习文档,主要代码逻辑如下,就是基于提供的文档,来进行学习,这个工具链时之前介绍过的工具langchain 实现的,当然 embedding 使用的不是openAi 的那个,而是使用的 HuggingFaceEmbeddings。

代码语言:txt复制
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.docstore.document import Document
from constants import CHROMA_SETTINGS

2、是基于文档内容进行问答的实现

代码语言:python代码运行次数:0复制
 args = parse_arguments()
    embeddings = HuggingFaceEmbeddings(model_name=embeddings_model_name)
    db = Chroma(persist_directory=persist_directory, embedding_function=embeddings, client_settings=CHROMA_SETTINGS)
    retriever = db.as_retriever()
    # activate/deactivate the streaming StdOut callback for LLMs
    callbacks = [] if args.mute_stream else [StreamingStdOutCallbackHandler()]
    # Prepare the LLM
    match model_type:
        case "LlamaCpp":
            llm = LlamaCpp(model_path=model_path, n_ctx=model_n_ctx, callbacks=callbacks, verbose=False)
        case "GPT4All":
            llm = GPT4All(model=model_path, n_ctx=model_n_ctx, backend='gptj', callbacks=callbacks, verbose=False)
        case _default:
            print(f"Model {model_type} not supported!")
            exit;
    qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever, return_source_documents= not args.hide_source)
    # Interactive questions and answers
    while True:
        query = input("nEnter a query: ")
        if query == "exit":
            break

        # Get the answer from the chain
        res = qa(query)
        answer, docs = res['result'], [] if args.hide_source else res['source_documents']

实现起来,也比较好理解,首先是还在大模型,这里默认是使用的GPT4All,数据源就是我们刚才基于自己的本地文档 embedding之后的db,当然,还差一个基础的模型,这个模型可以提供下载,直接参考项目吧 https://github.com/imartinez/privateGPT。

注意事项

1、对中文是支持的,注意,如果是中文文档,需要以utf8导入,不然学习环节会报错。

2、macOS电脑,使用 ARCHFLAGS="-arch x86_64" pip3 install -r requirements.txt 安装依赖,m1 芯片可以直接安转。

0 人点赞