昨天和前天,我們使用網頁資料和CSV資料作為外部的資料源,今天我們會介紹使用txt檔案,或者是副檔名為py的檔案來進行匯入轉成向量,並作為資料源給LLM提示,利用py或txt檔案皆可,這會和我們之後的應用有關係!
這是我們讀取的資料,叫做day11-data.py 主要是基於OpenCV的一個應用,來作為學習的範本
# 載入外部模組
import numpy as np
import cv2
# Create a black image
img = np.zeros((512,512,3), np.uint8)
# 畫矩形rectangle(影像矩陣,左上xy座標,右下xy座標,顏色(B,G,R),粗細)
cv2.rectangle(img, (100,0), (400,200), (255,255,0), 3)
# 畫矩形rectangle(影像矩陣,左上xy座標,右下xy座標,顏色(B,G,R),填滿)
cv2.rectangle(img, (100,400), (400,500), (0,0,255), -1)
#顯示圖形
cv2.imshow('img', img)
# 用waitKey等待視窗,當按下任意鍵時繼續下一部
cv2.waitKey(0)
# 關閉所有視窗
cv2.destroyAllWindows()
# 1. Create model
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
import os
os.environ["OPENAI_API_KEY"] = "你的OpenAI API key"
model = ChatOpenAI(model="gpt-4o")
embeddingmodel = OpenAIEmbeddings(model="text-embedding-ada-002")
# 2. 製作loader並載入
class CustomDocumentLoader(BaseLoader):
def __init__(self, file_path: str) -> None:
self.file_path = file_path
def lazy_load(self) -> Iterator[Document]:
with open(self.file_path, encoding="utf-8") as f:
line_number = 0
for line in f:
yield Document(
page_content=line,
metadata={"line_number": line_number,
"source": self.file_path},
)
line_number += 1
loader = CustomDocumentLoader("day11-data.py")
docs = list(loader.lazy_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 = """你是一個文件分析大師,可以根據使用者提供的資訊來對文件內進行分析
文件有可能是程式碼 或者是單純的txt檔案
以下為文件的內容
{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 day11.py
文件長度: 416
chunk長度: 400
看起來你提供的文件內包含了四個註解,這些註解似乎是用來描述程式碼中不同部分的功能。根據這些註解,我可以推測這應該是一個用於處理和顯示圖像的程式碼,
可能使用了OpenCV庫。以下是根據這些註解編寫的一個簡單的Python範例程式碼,並且我會提供更多相關的範例來幫助你學習。
### 範例1:基本圖像顯示
這個範例展示了如何使用OpenCV載入和顯示一張圖像。
```python
import cv2
# 載入外部模組
image_path = 'path_to_your_image.jpg'
image = cv2.imread(image_path)
# 顯示圖形
cv2.imshow('Displayed Image', image)
# 用waitKey等待視窗,當按下任意鍵時繼續下一部
cv2.waitKey(0)
# 關閉所有視窗
cv2.destroyAllWindows()
```
### 範例2:顯示攝像頭影像
這個範例展示了如何使用OpenCV從攝像頭中捕捉和顯示影像。
```python
import cv2
# 載入外部模組
cap = cv2.VideoCapture(0)
while True:
# 讀取影像
ret, frame = cap.read()
# 顯示圖形
cv2.imshow('Camera Feed', frame)
# 用waitKey等待視窗,當按下任意鍵時繼續下一部
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 釋放攝像頭並關閉所有視窗
cap.release()
cv2.destroyAllWindows()
```
### 範例3:影像處理(灰度轉換)
這個範例展示了如何將彩色影像轉換為灰度影像並顯示。
```python
import cv2
# 載入外部模組
image_path = 'path_to_your_image.jpg'
image = cv2.imread(image_path)
# 轉換為灰度影像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 顯示灰度影像
cv2.imshow('Gray Image', gray_image)
# 用waitKey等待視窗,當按下任意鍵時繼續下一部
cv2.waitKey(0)
# 關閉所有視窗
cv2.destroyAllWindows()
```
### 範例4:影像邊緣檢測(Canny Edge Detection)
這個範例展示了如何對影像進行邊緣檢測並顯示結果。
```python
import cv2
# 載入外部模組
image_path = 'path_to_your_image.jpg'
image = cv2.imread(image_path)
# 轉換為灰度影像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 進行Canny邊緣檢測
edges = cv2.Canny(gray_image, 100, 200)
# 顯示邊緣檢測結果
cv2.imshow('Edge Detection', edges)
# 用waitKey等待視窗,當按下任意鍵時繼續下一部
cv2.waitKey(0)
# 關閉所有視窗
cv2.destroyAllWindows()
```
這些範例應該可以幫助你更好地理解OpenCV在Python中的基本使用方法。你可以根據自己的需求和興趣進一步修改和擴展這些範例。希望這些範例對你有幫助!