AIAgent 初探-向量資料庫加強搜尋精度 : 檢索增強生成(RAG)(3)
在前一章節我們使用 LangChain 展示了幾個便利的整合功能,讓AIAgent可以夠有效率地進行開發,本章會介紹如何透過向量資料庫,來加強搜尋的精準度,會使用 Chroma 以及 LangChain 作為範例演示。
AIAgent 初探-向量資料庫加強搜尋精度 : 檢索增強生成(RAG)(3)
在前一章節我們使用 LangChain 展示了幾個便利的整合功能,讓AIAgent可以夠有效率地進行開發,本章會介紹如何透過向量資料庫,來加強搜尋的精準度,會使用 Chroma 以及 LangChain 作為範例演示。
以往我們向 GPT 或其他 LLM 詢問特定領域的問題時,可能會因為 LLM 的訓練資料不包含最新的、特定的、或私有的資訊,而無法得到準確的回覆。
檢索增強生成 (RAG) 的出現,彌補了這方面的不足,透過從外部文檔庫中檢索相關內容並提供給 LLM,讓 LLM 能夠基於這些上下文生成更準確、更符合實際情況的回答。
RAG 中文是「檢索增強生成」,也有人稱為「擷取擴增生成」、「擷取擴增產生」,英文全名是 Retrieval Augmented Generation。
RAG 的運作方式:
- 檢索(Retrieval):從文檔庫中找出相關片段
- 增強(Augmented):將片段加入 prompt 作為上下文
- 生成(Generation):LLM 基於上下文生成回答

圖片來源:https://medium.com/@mayssamayel4/building-a-rag-system-with-gpt-4-a-step-by-step-guide-291711342f0d
首先,我們需要一個文檔庫用來放入文件,而 python 中可使用 Chroma 作為向量資料庫使用,關於 Chroma 的詳情可以看該篇介紹,我們在此處以簡單的範例實作 檢索(Retrieval)功能 :
def example_embedded_mode():
try:
import chromadb
from chromadb.config import Settings
# 創建 Chroma 客戶端(內嵌模式)
client = chromadb.Client()
# 創建或取得一個集合(Collection)
# 集合 = 類似資料庫中的表,用來存放相關的文件
collection = client.get_or_create_collection(
name="my_documents", metadata={"description": "我的文件集合"} # 集合名稱
)
documents = [
"Python 是一種高級程式語言,適合初學者學習。",
"JavaScript 是網頁開發的主要語言,用於前端和後端。",
]
# 添加文件到集合
collection.add(
documents=documents, # 文件內容
ids=["doc1", "doc2", "doc3"], # 每個文件的唯一 ID
metadatas=[ # 可選:元數據(額外資訊)
{"type": "programming", "language": "python"},
{"type": "programming", "language": "javascript"},
{"type": "ai", "topic": "machine learning"},
],
)
# 步驟 2: 查詢(相似度搜尋)
query_text = "我想學習程式設計,應該學什麼語言?"
results = collection.query(
query_texts=[query_text], n_results=2 # 查詢文字 # 返回最相似的 2 個結果
)
print(f"查詢問題: {query_text}")
print(f"\n找到 {len(results['documents'][0])} 個相似文件:\n")
# 步驟 3: 查看集合資訊
print(f"集合名稱: {collection.name}")
print(f"文件數量: {collection.count()}")
except ImportError:
print("✗ 請先安裝 chromadb:pip install chromadb")
print(" 然後再執行這個範例")
except Exception as e:
print(f"✗ 錯誤: {e}")
import traceback
traceback.print_exc()
Chroma 與 Ollama 一樣,需要手動處理各自Response等問題,而 LangChain 可以整合 Chroma 與 Ollama 進而實現 RAG 功能 。
首先將文件寫入向量資料庫內,Chroma 會將文件轉為向量並存入原有的 Embedding 當中。
## 透過 langchin 使用 Chroma
from langchain_community.vectorstores import Chroma
## 使用 Ollama 的 Embedding 模型
from langchain_community.embeddings import OllamaEmbeddings
documents = [
"Python 是一種高級程式語言,由 Guido van Rossum 創建。",
"Python 適合初學者學習,語法簡潔易讀。"
]
# 使用 Ollama 的 Embedding 模型
embeddings = OllamaEmbeddings(
model=EMBEDDING_MODEL, base_url=OLLAMA_BASE_URL # 從配置讀取
)
# 創建 Chroma 向量資料庫(使用 LangChain 封裝)
vectorstore = Chroma.from_documents(
documents=texts,
embedding=embeddings,
persist_directory="./chroma_langchain_db", # 持久化目錄
)
# 相似度搜尋
docs = vectorstore.similarity_search_with_score(query, k=2)
print("找到的相關文件片段:")
for i, doc in enumerate(docs, 1):
print(f"\n{i}. {doc.page_content}")
接著透過 RetrievalQA 來整合向量資料庫與LLM,透過 from_chain_type 整合,相當便利。
from langchain_community.llms import Ollama #呼叫 LLM
from langchain.chains import RetrievalQA ## 整合
llm = Ollama(model=LLM_MODEL, base_url=OLLAMA_BASE_URL)
qa_chain = RetrievalQA.from_chain_type(
llm=llm, chain_type="stuff", retriever=vectorstore.as_retriever()
)
result = qa_chain.run(query)
print(f"問題: {query}")
print(f"回答: {result}\n")
你也可以透過 docker 建立 chroma 進行管理,設置 port 呼叫 client。
# docker-compose.yml
chroma:
image: ghcr.io/chroma-core/chroma:latest
container_name: chroma
ports:
- "8002:8000" # 外部端口:內部端口
app:
environment:
- CHROMA_CONTAINER_HOST=chroma
- CHROMA_CONTAINER_PORT=8000
---
## code
client_settings = Settings(
chroma_api_impl="chromadb.api.fastapi.FastAPI",
chroma_server_host=CHROMA_CONTAINER_HOST, # "chroma"
chroma_server_http_port=CHROMA_CONTAINER_PORT, # 8000
)
self.vectorstore = Chroma(
embedding_function=self.embeddings,
client_settings=client_settings,
)
總結一下,RAG 的優點 :
- 能夠存取的資訊,可能比用來訓練 LLM 的資料還要新
- 而RAG 知識儲存庫中的資料可以持續更新,而不會產生高昂成本。
- 可以找到 RAG 向量資料庫中的資訊來源。而且因為知道資料來源,所以可以更正或刪除 RAG 中不正確的資訊。
而 LangChain 可以快速的整合 Chroma 與 LLM ,達成 RAG 的效果,但我們依然需要有一個方式來控管文件,下一章節我們會使用到 Object & Bucket 的方式來進行文件的控管,讓整個系統更加完善。
메타데이터
- post_id
- 0f1bcc7aafc3
- slug
- aiagent-初探-向量資料庫加強搜尋精度-檢索增強生成-rag-3-0f1bcc7aafc3
- url
- https://medium.com/@a0931992912/aiagent-%E5%88%9D%E6%8E%A2-%E5%90%91%E9%87%8F%E8%B3%87%E6%96%99%E5%BA%AB%E5%8A%A0%E5%BC%B7%E6%90%9C%E5%B0%8B%E7%B2%BE%E5%BA%A6-%E6%AA%A2%E7%B4%A2%E5%A2%9E%E5%BC%B7%E7%94%9F%E6%88%90-rag-3-0f1bcc7aafc3
- canonical_url
- https://medium.com/@a0931992912/aiagent-%E5%88%9D%E6%8E%A2-%E5%90%91%E9%87%8F%E8%B3%87%E6%96%99%E5%BA%AB%E5%8A%A0%E5%BC%B7%E6%90%9C%E5%B0%8B%E7%B2%BE%E5%BA%A6-%E6%AA%A2%E7%B4%A2%E5%A2%9E%E5%BC%B7%E7%94%9F%E6%88%90-rag-3-0f1bcc7aafc3
- author_url
- https://medium.com/@a0931992912
- status
- ok
- fetched_at
- 2026-06-21 22:26:41