我們已經介紹HTML、csv、txt、py檔案作為外部資料源,使得LLM可以得到額外的資訊,並且獲得更為精準的回應,那麼我們要介紹最後一個常見的外部資料源PDF。
開始前先安裝一下函式庫
pip install pypdf
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
import os
# 1. Create model
os.environ["OPENAI_API_KEY"] = "你的OpenAI API key"
model = ChatOpenAI(model="gpt-4o")
embeddingmodel = OpenAIEmbeddings(model="text-embedding-ada-002")
-第二步引入PyPDFLoader
from langchain_community.document_loaders import PyPDFLoader
# 2. 載入文件
Loader = PyPDFLoader("day12-data.pdf")
docs = Loader.load()
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 3. 切分成數個chunk,自定切割大小,自訂overlap
all_text = "".join(doc.page_content for doc in docs)
print("文件長度: ", end="")
print(len(all_text))
print("chunk長度: ", end="")
chunk_size = 400
print(chunk_size)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=chunk_size, chunk_overlap=100)
splits = text_splitter.split_documents(docs)
from langchain_chroma import Chroma
# 4. 轉換成embedding,儲存進Chroma向量資料庫.
vectorstore = Chroma.from_documents(
documents=splits, embedding=embeddingmodel)
retriever = vectorstore.as_retriever()
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
# 5. 做成chain.
template = """你是一個文件分析大師,可以根據使用者提供的資訊來對文件內進行分析
以下為文件的內容
{context}
使用者提供的額外資訊:
{user_input}
"""
custom_rag_prompt = PromptTemplate.from_template(template)
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
rag_chain = (
{"context": retriever | format_docs, "user_input": lambda x: x}
| custom_rag_prompt
| model
| StrOutputParser()
)
# 6. 呼叫
result = rag_chain.invoke(
"""請幫我總結文件的內容""")
print(result)
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
import os
from langchain_community.document_loaders import PyPDFLoader
from langchain_chroma import Chroma
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
# model
# 1. Create model
os.environ["OPENAI_API_KEY"] = "你的OpenAI API key"
model = ChatOpenAI(model="gpt-4o")
embeddingmodel = OpenAIEmbeddings(model="text-embedding-ada-002")
# 2. 載入文件
Loader = PyPDFLoader("day12-data.pdf")
docs = Loader.load()
# 3. 切分成數個chunk,自定切割大小,自訂overlap
all_text = "".join(doc.page_content for doc in docs)
print("文件長度: ", end="")
print(len(all_text))
print("chunk長度: ", end="")
chunk_size = 400
print(chunk_size)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=chunk_size, chunk_overlap=100)
splits = text_splitter.split_documents(docs)
# 4. 轉換成embedding,儲存進Chroma向量資料庫.
vectorstore = Chroma.from_documents(
documents=splits, embedding=embeddingmodel)
retriever = vectorstore.as_retriever()
# 5. 做成chain.
template = """你是一個文件分析大師,可以根據使用者提供的資訊來對文件內進行分析
以下為文件的內容
{context}
使用者提供的額外資訊:
{user_input}
"""
custom_rag_prompt = PromptTemplate.from_template(template)
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
rag_chain = (
{"context": retriever | format_docs, "user_input": lambda x: x}
| custom_rag_prompt
| model
| StrOutputParser()
)
# 6. 呼叫
result = rag_chain.invoke(
"""請幫我總結文件的內容""")
print(result)
python day12.py
文件長度: 3761
chunk長度: 400
根據所提供的文件內容,以下是文件的總結:
### 國立臺灣科技大學 113學年度第 一學期註冊須知 (舊生適用)
#### 上課前需要辦理的事項:
1. **學生團體保險**
- 負責單位:生活輔導組
- 聯絡人:陳小姐,電話:02-27376317
2. **僑生健保**
- 負責單位:生活輔導組
- 聯絡人:謝教官,電話:02-27376291
3. **外籍生健保**
- 負責單位:國際事務處
- 電話:02-27301118
4. **兵役相關事務**
- 兵役緩徵、儘召申請、役期折抵:復學生及延修生需於註冊後親洽學務處生輔組或Email辦理。
- 查詢網址:https://reurl.cc/gGE23R
- 聯絡人:黃先生,電話:02-27301233
5. **抵免學分**
- 申請依據:本校學生抵免學分辦法
- 網址:https://reurl.cc/1YX9qY
- 選課網址:https://reurl.cc/7r4ab9
6. **學生宿舍申請**
- 新生床位分配後若有剩餘床位,將於9月下旬公告短期遞補登記辦法。
- 網址:https://reurl.cc/4a6xbY
- 聯絡人:尚小姐,電話:02-27376319
7. **就學貸款 (富邦銀行對保手續)**
- 申貸辦法請查閱公告。
- 網址:https://reurl.cc/kZM69q
8. **繳交學雜費**
- 繳費與列印繳費單日期:113年8月14日至8月30日
- 下載、列印與查詢繳費單網址:https://reurl.cc/qgnEGp
- 繳費方式:中國信託商業銀行、郵局臨櫃、ATM轉帳、超商及信用卡繳款
#### 特別注意事項:
1. **延長修業年限學生**
- 註冊前需繳交平安保險費與電腦軟體網路使用費,未繳費視同未註冊。
- 修習學分在9學分以下(含9學分)者,需另加收1/2雜費;9學分以上者需繳全額學雜費。
2. **成績不及格有退學之虞者**
- 請暫勿繳費,待成績確定符合註冊資格後再行繳費。
這是文件的重點內容,涵蓋了上課前需要辦理的各項事務、聯絡方式、相關網址及特別注意事項。