文件上傳、向量嵌入、語義搜尋與知識增強生成
RAG (Retrieval-Augmented Generation) 是結合檢索與生成的技術
.txt - 純文字檔.md - Markdown 檔.pdf - PDF 文件(PyPDF2).docx - Word 文件(python-docx)
def _chunk_text(self, text: str) -> List[str]:
"""滑動視窗分段演算法"""
chunks = []
start = 0
while start < len(text):
end = start + self.chunk_size # 500 字元
chunk = text[start:end]
chunks.append(chunk)
start += (self.chunk_size - self.chunk_overlap) # 重疊 50 字元
return chunks
paraphrase-multilingual-MiniLM-L12-v2
from sentence_transformers import SentenceTransformer
model = SentenceTransformer(
'paraphrase-multilingual-MiniLM-L12-v2'
)
# 將文本轉換為向量
embeddings = model.encode([
"Flask API 開發",
"Python 網頁應用",
"資料庫設計"
])
# 結果:(3, 384) 的向量矩陣
# 儲存向量
collection.add(
ids=["doc_001_chunk_0", "doc_001_chunk_1"],
embeddings=embeddings.tolist(),
documents=["Flask 是一個輕量級...", "使用 route 裝飾器..."],
metadatas=[{"filename": "flask.md", "chunk": 0}, ...]
)
# 語義搜尋
results = collection.query(
query_embeddings=query_embedding, # 查詢向量
n_results=5 # 返回前 5 個
)
# 結果包含:documents, distances, metadatas
搜尋「內容管理」可能找到「部落格系統」的文件,因為語義相關
def generate_with_rag(self, requirements, query):
# 1. 先進行 RAG 檢索
related_chunks = rag_service.search(query, top_k=5)
# 2. 將檢索結果整合到 AI prompt
context = "以下是相關的提示詞範本供參考:\n\n"
for i, chunk in enumerate(related_chunks):
context += f"範本 {i+1}:\n{chunk['content']}\n\n"
# 3. 增強後的 prompt
enhanced_prompt = f"""
{context}
請參考這些範本的風格和結構,根據以下需求生成新的提示詞:
{requirements}
"""
# 4. 呼叫 AI 生成
return ai_service.generate(enhanced_prompt)