程式運行詳細步驟
以下以 Jupyter Notebook 格式,記錄如何使用 LangChain 框架結合 Ollama Embeddings 與 ChromaDB,實現 PDF 文件的檢索式問答。
詳細程式參考:GitHub 範例程式
1. 載入必要套件與初始化 Embedding 模型
from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_ollama import OllamaEmbeddings
from langchain_chroma import Chroma
# 初始化 Ollama Embeddings
embeddings_model = OllamaEmbeddings(
base_url='http://dandelion-ollama-1:11434',
model="bge-m3:567m",
)
2. 載入 PDF 文件並分割文本
# 載入 PDF
loader = PyPDFLoader('./data/PDF_file.pdf')
docs = loader.load_and_split()
# 設定分段參數
chunk_size = 256
chunk_overlap = 128
text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
documents = text_splitter.split_documents(docs)
3. 建立 Chroma 向量資料庫
db = Chroma.from_documents(
documents,
embedding=embeddings_model,
persist_directory="./story-db"
)
4. 啟動檢索式問答鏈 (RetrievalQA Chain)
from langchain_ollama import OllamaLLM
from langchain.chains import RetrievalQA
ollama_llm = OllamaLLM(
base_url='http://dandelion-ollama-1:11434',
model="llama3.1:8b",
temperature=0.0,
num_predict=512
)
qa_chain = RetrievalQA.from_chain_type(
llm=ollama_llm,
retriever=db.as_retriever(),
)
5. 問答範例及模型回答
以下僅列出部分問答範例,其餘可自行嘗試:
query = "玫瑰是誰?"
result = qa_chain.invoke(query)
print(result)
模型回答:
{'query': '玫瑰是誰?', 'result': '玫瑰是小王子的玫瑰花,還有園中其他五千朵玫瑰花(但小王子的玫瑰花是獨一無二的)。'}
qa_chain.invoke('小王子的來歷是什?')
模型回答:
{'query': '小王子的來歷是什?', 'result': '小王子所來自的那個星球是小行星B612。'}
qa_chain.invoke('你覺得小王子是個怎樣的人?')
模型回答:
{'query': '你覺得小王子是個怎樣的人?', 'result': '根據文中描述,小王子的性格可以看出來。他似乎是一個敏感、浪漫、獨立的年輕人。他對他所遇到的陌生人的評價很細致,能夠看穿別人的真實面目。他也顯示出對自由和自主的渴望。'}
更多問題可依據文本內容自由發揮,探索不同答案。
筆記重點
- 透過
PyPDFLoader讀取 PDF,並用RecursiveCharacterTextSplitter分割文本,利於後續檢索。 - 使用 Ollama Embeddings 將文本轉為向量,存入 ChromaDB。
- 結合 Ollama LLM 與 RetrievalQA Chain,實現自然語言問答。
- 可針對文本內容進行多樣化提問,快速獲得答案。