這次使用python來撰寫將文件匯入、訊息處理,以及問答系統介面配置的流程,並且將語言模型版本存在json配置檔案裡。實際執行後發現訊息顯示找不到模式的檔案,不知道是哪邊出了問題,但還是想把程式碼寫出來。
# 匯入所需的套件
import json
import gradio as gr
from langchain_community.chat_models import ChatOllama
from langchain_core.prompts import PromptTemplate
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import FastEmbedEmbeddings
from langchain_community.vectorstores.utils import filter_complex_metadata
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
這段程式碼匯入了需要的函式庫,包括 json 用於處理 JSON 文件,gradio 用於構建用戶界面,和 LangChain 社區提供的其他庫,用於處理聊天模型、文件加載、向量存儲和嵌入。
# 創建提示模板
promptTemplate = """Answer the question as precise as possible using the provided context. If the answer is
not contained in the context, say "answer not available in context" \n\n
Context: {context}
Question: {question}
Answer:
"""
modelSel = ""
這裡定義了一個提示模板,將用於生成回答問題的提示。模板中包含上下文和問題,並指定如何回答問題。
# 將 PDF 文件載到 ChromaDB
def loadDataFromPDFFile(filePath):
loader = PyPDFLoader(filePath)
pages = loader.load_and_split()
chunks = filter_complex_metadata(pages)
vector_store = Chroma.from_documents(documents=chunks, embedding=FastEmbedEmbeddings())
return vector_store
這段程式碼定義了loadDataFromPDFFile
函數,從指定的 PDF 文件中加載數據。它使用 PyPDFLoader
加載和拆分頁面,然後過濾元數據,最後將結果存儲到 Chroma 向量存儲中。
# 生成模型的回應
def modelResponse(message , history):
llm = ChatOllama(model = conf["model"])
prompt = PromptTemplate(template=promptTemplate , input_variables=["context","question"])
# 初始化檢索器
#網址改成自己pdf檔的檔案位址
dbLoaded = loadDataFromPDFFile("~/Desktop/網球社期初社大成果報告書.pdf")
retriever = dbLoaded.as_retriever(search_type="similarity_score_threshold" , search_kwargs = {
"k": 5,
"score_threshold": 0.2
})
# 準備上下文訊息
context = retriever # 假設這裡獲取上下文作為字串
# 準備消息
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": context},
{"role": "user", "content": message},
]
# 用消息調用模型
response = llm.invoke(messages)
return StrOutputParser().parse(response)
這段程式碼定義了一個函數,負責處理用戶的訊息並生成回應。首先,通過 ChatOllama
創建聊天模型,然後從 PDF 文件中加載數據並建立檢索器。接著,構建包含系統和用戶訊息的消息列表,最後調用模型並解析其回應。
if __name__ == "__main__":
# 讀取模型配置文件
conf = {}
with open("config.json" , "r") as confFile:
conf = json.load(confFile)
print(conf["model"])
# 問答系統標題
chatUI = gr.ChatInterface(fn=modelResponse , title="網球社成果報告 Q&A", type='messages')
chatUI.launch()
這部分程式碼檢查是否在主執行環境中運行。如果是,則讀取配置文件,並加載模型設定。接著,使用 Gradio
創建一個聊天介面,並啟動該介面,讓用戶可以進行互動。
建構的config.json
程式碼是放model的名稱,如下:
{
"model": "llama2"
}