學習LLM大語言模型之路(五) - 結合 RAG技術,建立API

更新 發佈閱讀 11 分鐘

目標

建立 FastAPI API,讓應用可以透過 REST API 進行 LLM 查詢

結合 RAG 技術,提高 LLM 回應的準確度

存入及查詢 FAISS 向量資料庫,讓 LLM 檢索外部知識庫

何謂RAG

RAG(Retrieval-Augmented Generation)是一種結合檢索(Retrieval)與生成(Generation)的技術,主要應用於提升大型語言模型(LLM)的回答準確性。它的核心原理是先從外部知識庫檢索相關資訊,再將檢索結果與預先訓練的模型結合,生成更具參考價值的回答。

RAG 的應用場景

  • 問答系統:透過檢索技術獲取準確的背景資料,使回答更具可靠性。
  • 企業內部知識庫:整合企業內部文件,使員工能直接向 AI 查詢相關資訊。
  • 法律、醫療等專業領域:確保生成的內容基於專業文獻,提高可信度。


📁 專案結構

llm_rag_api/
├── app/
│ ├── main.py
│ ├── rag.py
│ ├── vectorstore.py
│ └── schemas.py
├── data/
│ └── docs.txt
├── requirements.txt
└── README.md

🔧 1. 安裝套件與環境需求 requirements.txt

fastapi
uvicorn
openai
faiss-cpu
tqdm
python-dotenv
pydantic

🧠 2. 向量庫建構 vectorstore.py

import faiss
import numpy as np
from typing import List
from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

class VectorStore:
def __init__(self, dim=1536):
self.index = faiss.IndexFlatL2(dim)
self.documents = []

def embed_text(self, texts: List[str]) -> np.ndarray:
response = client.embeddings.create(
input=texts,
model="text-embedding-3-small"
)
return np.array([r.embedding for r in response.data])

def add_documents(self, texts: List[str]):
embeddings = self.embed_text(texts)
self.index.add(embeddings)
self.documents.extend(texts)

def query(self, text: str, top_k=3) -> List[str]:
embedding = self.embed_text([text])
D, I = self.index.search(embedding, top_k)
return [self.documents[i] for i in I[0]]

🔍 3. RAG 主流程 rag.py

from .vectorstore import VectorStore
from openai import OpenAI
import os
from dotenv import load_dotenv

load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

store = VectorStore()

# 初始化資料
def load_documents():
with open("data/docs.txt", "r", encoding="utf-8") as f:
texts = [line.strip() for line in f if line.strip()]
store.add_documents(texts)

#生成答案
def generate_answer(question: str) -> str:
relevant_docs = store.query(question)
prompt = "根據以下資料回答問題:\n\n"
prompt += "\n".join(relevant_docs)
prompt += f"\n\n問題:{question}\n回答:"

response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content

🌐 4. FastAPI API 實作 main.py

from fastapi import FastAPI

from contextlib import asynccontextmanager

from .rag import load_documents, generate_answer

from .schemas import QuestionRequest, AnswerResponse

@asynccontextmanager

async def lifespan(app: FastAPI):

    # 啟動階段:載入向量資料庫

    load_documents()

    yield

    # 關閉階段(如有需要可釋放資源)

app = FastAPI(lifespan=lifespan)

@app.post("/ask", response_model=AnswerResponse)

def ask_question(payload: QuestionRequest):

    answer = generate_answer(payload.question)

    return {"answer": answer}

📦 5. 輸入/輸出格式定義 schemas.py

from pydantic import BaseModel

class QuestionRequest(BaseModel):
question: str

class AnswerResponse(BaseModel):
answer: str

📄 6. 測試資料 data/docs.txt

OpenAI 是一家專注於人工智慧研究的公司。
FAISS 是 Facebook AI 提出的向量相似度搜尋工具。
FastAPI 是一個高效能的 Python Web 框架,適合建構 AI 應用程式。

📘 7. README.md 範例

# LLM RAG API with FastAPI
本專案展示如何使用 FastAPI 建立結合 RAG(檢索增強生成)的 LLM API,並整合 FAISS 向量資料庫。

## Features

- 支援 `/ask` 問答 API
- FAISS 快速檢索最相關段落
- OpenAI GPT-3.5 回答查詢問題
- FastAPI Swagger UI 介面

## 快速開始

1. 建立虛擬環境
```powershell
python -m venv venv



2. 啟動虛擬環境:
```powershell
.\venv\Scripts\Activate.ps1



3. 安裝依賴
```powershell
pip install -r requirements.txt



4.設定 OpenAI 金鑰
建立 .env 檔案:
```powershell
OPENAI_API_KEY=your_key_here


5.執行 API
```powershell
uvicorn app.main:app --reload

🚀 執行指令

uvicorn app.main:app --reload

打開瀏覽器進入 http://127.0.0.1:8000/docs Swagger UI測試 API。

FastAPI自帶Swagger UI,Swagger是一個API的可視化介面,可能直接在網頁上查看和測試API,是一個很方便的工具,而FastAPI本身就內建了,只需要在網址的後面加上"/docs"就能進入Swagger UI介面了。

📄 8. 測試

raw-image

使用FastAPI自帶Swagger UI來測試,輸入"OpenAI 是一家什麼樣的公司?",回傳200 "answer:"OpenAI 是一家專注於人工智慧研究的公司。"


raw-image

使用Postman,URL輸入"http://127.0.0.1:8000/ask",選擇POST,Body輸入"question": "OpenAI 是一家什麼樣的公司?",一樣回傳了"answer": "OpenAI 是一家專注於人工智慧研究的公司。"。

此篇學習了使用RAG技術來建立一個簡單的API,RAG可以是向量資料庫,也可以是從外部引用的word、PDF、文字檔,可以讓AI回答更為精準,目前是使用了外部文字檔,API使用了python常用的FastAPI,我覺得FastAPI很好,因為本身結合了swagger是個蠻好用的,這個RAG和FastAPI確實都可以再更深入的學習,等之後的篇幅再繼續研究。


留言
avatar-img
留言分享你的想法!
avatar-img
宅D嘉的開發人生
21會員
50內容數
加密貨幣很有趣,遊戲開發也很有趣,AI也有點意思,身為一個跨多領域的軟體工程師,喜歡研究新鮮的事物,歡迎來到我的世界,一起坐上這艘開往未來探索新奇的列車。
宅D嘉的開發人生的其他內容
2025/05/31
AI幻覺(AI Hallucination)是指人工智慧(AI)生成的內容包含錯誤、不準確或完全虛構的資訊,但卻表現得像是真實可靠的答案。這種現象通常發生在大型語言模型(LLM)或其他生成式AI系統中,並可能導致誤導性的結果。
2025/05/31
AI幻覺(AI Hallucination)是指人工智慧(AI)生成的內容包含錯誤、不準確或完全虛構的資訊,但卻表現得像是真實可靠的答案。這種現象通常發生在大型語言模型(LLM)或其他生成式AI系統中,並可能導致誤導性的結果。
2025/05/24
本篇探討 Prompt Engineering 的策略與應用,並介紹一個 Prompt Engineering 實驗平臺專案,平臺允許使用者輸入任務敘述、選擇風格和提示策略,比較不同 Prompt 的回應結果,有助於學習如何設計 Prompt 模板來影響 LLM 行為及比較不同提示策略對結果的影響。
Thumbnail
2025/05/24
本篇探討 Prompt Engineering 的策略與應用,並介紹一個 Prompt Engineering 實驗平臺專案,平臺允許使用者輸入任務敘述、選擇風格和提示策略,比較不同 Prompt 的回應結果,有助於學習如何設計 Prompt 模板來影響 LLM 行為及比較不同提示策略對結果的影響。
Thumbnail
2025/05/17
學習內容: 了解 Tokenization、Embedding、向量搜索(FAISS、Chroma) 學習如何微調 LLM(LoRA、PEFT) 準備數據集(清理、標註、格式化)
Thumbnail
2025/05/17
學習內容: 了解 Tokenization、Embedding、向量搜索(FAISS、Chroma) 學習如何微調 LLM(LoRA、PEFT) 準備數據集(清理、標註、格式化)
Thumbnail
看更多
你可能也想看
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 129 中說,Bidirectional Encoder Representations from Transformers (BER
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 129 中說,Bidirectional Encoder Representations from Transformers (BER
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 總結一下目前有的素材: AI說書 - 從0開始 - 103:資料集載入 AI說書 - 從0開始 - 104:定義資料清洗的函數 AI說書 - 從0開始 - 105
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 總結一下目前有的素材: AI說書 - 從0開始 - 103:資料集載入 AI說書 - 從0開始 - 104:定義資料清洗的函數 AI說書 - 從0開始 - 105
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 目前我們已經有資料集在 AI說書 - 從0開始 - 103 ,必要的清理函數在 AI說書 - 從0開始 - 104 ,現在把它們湊在一起,如下: # load Eng
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 目前我們已經有資料集在 AI說書 - 從0開始 - 103 ,必要的清理函數在 AI說書 - 從0開始 - 104 ,現在把它們湊在一起,如下: # load Eng
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 延續 AI說書 - 從0開始 - 93 介紹了 The Corpus of Linguistic Acceptability (CoLA),其核心思想為:如果該句子在語
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 延續 AI說書 - 從0開始 - 93 介紹了 The Corpus of Linguistic Acceptability (CoLA),其核心思想為:如果該句子在語
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 以下陳述任務 (Task)、模型 (Model)、微調 (Fine-Tuning)、GLUE (General Language Understanding Evalu
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 以下陳述任務 (Task)、模型 (Model)、微調 (Fine-Tuning)、GLUE (General Language Understanding Evalu
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 我們已經在AI說書 - 從0開始 - 32中,展示了OpenAI的API如何使用,儘管 API 可以滿足許多需求,但它們也有其限制,例如,多用途 API 可能在所有任務
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 我們已經在AI說書 - 從0開始 - 32中,展示了OpenAI的API如何使用,儘管 API 可以滿足許多需求,但它們也有其限制,例如,多用途 API 可能在所有任務
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 延續AI說書 - 從0開始 - 22解釋Foundation Model與Engines意涵後,我們來試用看看ChatGPT。 嘗試問以下問題:Provide a
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 延續AI說書 - 從0開始 - 22解釋Foundation Model與Engines意涵後,我們來試用看看ChatGPT。 嘗試問以下問題:Provide a
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News