• 基于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接口进行拟人化回答,我们可以构建一个具备垂直领域知识的问答系统。

  • 相关阅读:
    PWA 踩坑 - 第一次加载页面后无法获取CacheStorage某些资源
    AirTest
    设计模式:迭代器模式(C++实现)
    [附源码]SSM计算机毕业设计在线购物商城JAVA
    软件工程导论概述-----MP微软编程和MSF
    Python中dataframe.groupby()根据数据属性对数据分组
    针对Java API格式
    TMS Logging提供了短日志输出
    AOSP10 替换系统launcher
    Fortinet Universal SASE能力再度进化!保障用户访问任意应用程序便捷无忧
  • 原文地址:https://www.cnblogs.com/myshare/p/17549835.html