網頁

2024年1月18日 星期四

LangChain實作:用ChatPDF找出文件重點

本篇是利用LangChain框架的ChatPDF工具,讀入pdf file,然後透過提問的方式,快速進行文件摘要總結,甚至請它提供建議。

1.首先 import 相關套件:

! pip install -U langchain-openai
from langchain_openai import OpenAIEmbeddings
!pip install kaleido
!pip install langchain pypdf sentence_transformers chromadb tiktoken openai
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.document_loaders import TextLoader, PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationalRetrievalChain
 

2.準備你的openAI API key (或是去申請):

import os
os.environ["OPENAI_API_KEY"] = 'sk-kxz......'

3.因為我是用 Colab線上編輯器,所以先掛載雲端硬碟,然後才能讀取雲端硬碟的檔案:

from google.colab import drive
drive.mount('/content/drive')

3.使用LangChain提供的讀檔方式讀取PDF檔案:
檔案是 索甲仁波切的 "西藏生死書",第六章演化業與輪迴

# 讀取檔案
file_path = "/content/drive/My Drive/Colab Notebooks/openai/西藏生死書_第六章演化業與輪迴.pdf"
loader = file_path.endswith(".pdf") and \
        PyPDFLoader(file_path) or \
        TextLoader(file_path)

如果是 txt 文字檔,可以這樣:

# txt文字檔的讀取方式
loader = TextLoader("/content/drive/My Drive/Colab Notebooks/openai/臨終的恐懼.txt")

4.由於語言模型一次能讀取的文字數量有限,因此需要將文件切分成數個小區塊:
每個區塊(chunk) 200個字元

# 利用 splitter 將文字切分成多個 chunk
splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=0)
texts = loader.load_and_split(splitter)

5.透過Chroma (一個專門為LLM embedding database設計的工具)
將剛剛的文字轉換成向量,最後儲存成一個本地的vector store。

# 建立本地 db
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)

6.最後建立對話chain,使用LangChain的ConversationalRetrievalChain:

# 對話 chain
qa = ConversationalRetrievalChain.from_llm(ChatOpenAI(temperature=0), 
        vectorstore.as_retriever()
    )
chat_history = []
while True:
query = input('\nQ: ')
if not query:
break
result = qa({"question": query + ' (用繁體中文回答)', "chat_history": chat_history})
print('A:', result['answer'])
chat_history.append((query, result['answer']))

7.結果:

Q: 意識來自何方?

A: 從佛教的觀點來看,意識來自於前一刻意識的連續。意識是一個持續不斷的過程,
每一刻的意識都是由前一刻的意識所產生。因此,意識沒有一個特定的來源,而是由無窮盡
的過去意識所連續形成的。

Q: 用300字總結這文件的重點
A: 這份文件的重點是,瀕死經驗中的人會經歷全景式的生命回顧,看到自己的行為對他人產生的影響,
並感受到業的真理。他們意識到每一個思想、語言和行為都對周圍的人和環境產生影響,
並且認識到負責任的重要性。他們也明白逃脫不了業的自然律,並意識到未來世的存在。
最終,他們希望通過觀察業的法則、淨化心靈和喚醒智慧,成為真正的人並證悟。 
 
另外,我再用 索甲仁波切的 "西藏生死書"的 臨終的恐懼篇 來測試一下:
# 讀取檔案
file_path = "/content/drive/My Drive/Colab Notebooks/openai/臨終的恐懼.pdf"
loader = file_path.endswith(".pdf") and PyPDFLoader(file_path) or TextLoader(file_path)
結果:

Q: 如何面對臨終前未完成的事
A: 面對臨終前未完成的事,可以遵循以下方法:

1. 深入思考:花時間反思自己的生活,找出那些未完成的事情。這可能包括個人目標、夢想、
關係或者其他重要的事情。

2. 優先排序:將這些未完成的事情按照重要性和緊迫性進行排序。確定哪些事情是最重要的,
並優先處理它們。

3. 與親友溝通:與親友分享自己的未完成事項,並尋求他們的理解和支持。他們可能能夠提供幫助、
建議或者陪伴你完成這些事情。

4. 接受現實:有些事情可能無法在臨終前完成,這是現實。學會接受這些無法改變的情況,
並尋找其他方式來處理或者放下這些事情。

5. 尋求心理支持:如果你感到壓力、焦慮或者情緒困擾,尋求心理專業人士的幫助是很重要的。
他們可以提供情緒支持和指導,幫助你處理這些未完成的事情。

6. 尋找內心寧靜:在臨終前,尋找內心的寧靜和平靜是非常重要的。這可以通過冥想、呼吸練習、
寫日記或者其他自我反省的方式來實現。

7. 培養感恩之心:感恩自己所擁有的一切,並將注意力轉移到當下的幸福和滿足感上。
這有助於減輕對未完成事情的焦慮和壓力。

重要的是要記住,每個人的情況和處理方式都不同。找到適合自己的方法,並尋求支持和幫助,
以幫助你面對臨終前的未完成事情。
Q: 用200字總結這文件的重點
A: 這份文件的重點是關於如何在臨終關懷中放下過去的困難,並與臨終者進行對話和溝通。
文件提到了寫下自己的感覺和對話,直到沒有保留的話為止。同時,文件呼籲醫界人士以善意和關懷,
讓臨終者能夠在寧靜和安詳中離世。此外,文件還提到了保留愛和美好回憶的重要性,
以及家人也應該學習如何放下並面對悲痛和未來的不安全感。

2024年1月3日 星期三

用 Python 製作股票績效比較圖表

程式碼如下:

 
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
 
# 製作美股代碼與名稱的字典
tickers_dict = {'NVDA':'Nvidia', 'META':'Meta', 'TSLA':'Tesla',
'AMZN':'Amazon', 'AAPL':'Apple', 'MSFT':'MicroSoft',
'GOOGL':'Google'}
 
tickers_list = list(tickers_dict.keys())
legend_text = []
list(map(lambda x:legend_text.append(tickers_dict[x]), tickers_list))
 
# 下載股價收盤價格,區間從2023/01/01~2023/12/31 
df = yf.download(tickers_list, start="2023-01-01", end="2023-12-31")['Close']
print(df.tail())
 
# 利用cumprod函數畫出回報率圖表
((df.pct_change() + 1).cumprod()-1).plot(figsize=(10, 7))
# 圖表名稱
plt.title('1 Years Returns', fontsize=16)
 
# 定義 X軸 Y軸 的名稱
plt.ylabel('Cumulative Returns', fontsize=14)
plt.xlabel('Year', fontsize=14)

# 圖表要呈現格線
plt.grid(which="major", color='k', linestyle='-.', linewidth=0.5)
plt.show()
 

 輸出結果:

看起來2023年度績效最好的是Nvidia,最差的是Apple。

如果Y軸要以百分比來表示可以將:

 
 (df.pct_change() + 1).cumprod()-1).plot(figsize=(10, 7))
 

改成:

 
data = ((df.pct_change() + 1).cumprod() -1 )
ax = data.plot(figsize=(10, 7))
vals = ax.get_yticks()
ax.set_yticklabels(['{:.0%}'.format(x) for x in vals])
 

輸出結果:

以Nvidia (美股代號:NVDA) 2023/01/03收盤價143.15,到2023/12/29收盤價495.22來算

回報率為245.94%