基於GPT搭建私有知識庫聊天機器人(四)問答實現

2023-07-13 12:00:18

前文連結:

基於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/<question>")
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介面進行擬人化回答,我們可以構建一個具備垂直領域知識的問答系統。