← Back to list

AIAgent 初探-向量資料庫加強搜尋精度 : 檢索增強生成(RAG)(3)

在前一章節我們使用 LangChain 展示了幾個便利的整合功能,讓AIAgent可以夠有效率地進行開發,本章會介紹如何透過向量資料庫,來加強搜尋的精準度,會使用 Chroma 以及 LangChain 作為範例演示。

Johnny Chen · 2025-11-18 08:26 · 0 claps · 7.4 min read
#ai-agent #langchain #chroma #ollama
Open on Medium ↗
Wiki topics: LLM · Large Language Models RAG · RAG & Retrieval AGT · AI Agents

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

圖片來源: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