• 基于GPT搭建私有知识库聊天机器人(四)问答实现


    前文链接:

    基于GPT搭建私有知识库聊天机器人(一)实现原理

    基于GPT搭建私有知识库聊天机器人(二)环境安装

    基于GPT搭建私有知识库聊天机器人(三)向量数据训练


    在前面的文章中,我们介绍了如何使用GPT模型搭建私有知识库聊天机器人的基本原理、环境安装、数据向量化。本文将进一步介绍如何使用langchain框架实现问答功能。

    1、使用langchain框架

    langchain是一个强大的框架,可以帮助我们构建基于GPT的问答系统。首先,我们需要导入所需的库和模块:

    from langchain import PromptTemplate
    from langchain.chains import RetrievalQA
    from langchain.embeddings.openai import OpenAIEmbeddings
    from langchain.vectorstores import Milvus
    

    2、向量处理和检索

    在实现问答功能之前,我们需要将问题进行向量处理,并从向量数据库中检索最相似的数据。首先,我们与Milvus向量数据库建立连接,并设置检索前N条最相似数据:

    embeddings = OpenAIEmbeddings()
    vector_store = Milvus(
        embedding_function=embeddings,
        connection_args={"host": MILVUS_HOST, "port": MILVUS_PORT}
    )
    retriever = vector_store.as_retriever(search_kwargs={"k": target_source_chunks})
    

    3、定义prompt模板

    接下来,我们定义一个prompt模板,用于生成回答。这个模板包含了已知的信息和用户的问题:

    prompt_template = """基于以下已知信息,简洁和专业的来回答用户的问题。
            如果无法从中得到答案,请说 "根据已知信息无法回答该问题",不允许在答案中添加编造成分,答案请使用中文。
            已知内容:
            {context}
            问题:
            {question}"""
    
    promptA = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
    

    4、调用OpenAI接口进行问答

    现在,我们可以调用OpenAI接口进行问答了。我们使用RetrievalQA类,并将之前定义的retriever和promptA传入,获取答案:

    qa = RetrievalQA.from_chain_type(llm=openaiLlm, retriever=retriever, chain_type="stuff",
                                     chain_type_kwargs={"prompt": promptA}, return_source_documents=True)
    res = qa(question)
    answer, docs = res['result'], res['source_documents']
    print("question:[%s], answer:[%s]" % (question, answer))
    

    5、全部代码

    from langchain import PromptTemplate
    from langchain.chains import RetrievalQA
    from langchain.embeddings.openai import OpenAIEmbeddings
    from langchain.vectorstores import Milvus
    
    @llm_blue.route("/ans/")
    def ans(question: str) -> str:
        embeddings = OpenAIEmbeddings()
        vector_store = Milvus(
            embedding_function=embeddings,
            connection_args={"host": MILVUS_HOST, "port": MILVUS_PORT}
        )
        retriever = vector_store.as_retriever(search_kwargs={"k": target_source_chunks})
    
        prompt_template = """基于以下已知信息,简洁和专业的来回答用户的问题。
            如果无法从中得到答案,请说 "根据已知信息无法回答该问题",不允许在答案中添加编造成分,答案请使用中文。
            已知内容:
            {context}
            问题:
            {question}"""
    
        promptA = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
        chain_type_kwargs = {"prompt": promptA}
        qa = RetrievalQA.from_chain_type(llm=openaiLlm, retriever=retriever, chain_type="stuff",
                                         chain_type_kwargs=chain_type_kwargs, return_source_documents=True)
    
        res = qa(question)
        answer, docs = res['result'], res['source_documents']
        print("question:[%s], answer:[%s]" % (question, answer))
        return answer
    

    6、总结

    本文介绍了如何使用langchain框架实现基于GPT的私有知识库聊天机器人的问答功能。通过将问题进行向量处理并从向量数据库中检索相似数据,再结合OpenAI接口进行拟人化回答,我们可以构建一个具备垂直领域知识的问答系统。

  • 相关阅读:
    promise defer的使用方法
    相比Angular和React,Vue.js插件有哪些优势?
    第二十一条:为传诸后世而设计接口
    SAP-QM-采购过程模式与特性检验不匹配QD244
    【教3妹学算法-每日3题(1)】最大重复子字符串
    Spring: @ComponentScan注解,不设置basePackages时,为什么会扫描该注解所在的包?
    VUE:key属性的作用
    RabbitMQ部署指南
    Hugging News #0918: Hub 加入分类整理功能、科普文本生成中的流式传输
    基于Elasticsearch + Fluentd + Kibana(EFK)搭建日志收集管理系统
  • 原文地址:https://www.cnblogs.com/myshare/p/17549835.html