iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0

前言

我們已經介紹HTML、csv、txt、py檔案作為外部資料源,使得LLM可以得到額外的資訊,並且獲得更為精準的回應,那麼我們要介紹最後一個常見的外部資料源PDF。

正文

安裝

開始前先安裝一下函式庫

pip install pypdf

資料


程式碼

  • 第一步先定義model
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()

  • 第三步切成chunk
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()

  • 第五步 製作chain
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. **成績不及格有退學之虞者**
   - 請暫勿繳費,待成績確定符合註冊資格後再行繳費。

這是文件的重點內容,涵蓋了上課前需要辦理的各項事務、聯絡方式、相關網址及特別注意事項。
  • 我們之後會做一個文件分析的介面,來讓使用者可以上傳檔案!

上一篇
day11 文字程式檔的智慧學習:讓LLM成為你的程式碼教學助手
下一篇
day13 chatDocument 文件分析器(一):智能CSV分析與StreamLit前端介面
系列文
智能雲端架構圖生成:結合LangChain&LangGrpah與Rag的創新應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言