最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)RAG檢索增強(qiáng)生成的完整教學(xué)

 更新時(shí)間:2026年05月26日 09:11:44   作者:程序猿の搬磚日記  
檢索增強(qiáng)生成(Retrieval-Augmented?Generation,?RAG)是當(dāng)下最熱門(mén)的?AI?應(yīng)用架構(gòu)之一,本文用?Python?從零實(shí)現(xiàn)一個(gè)完整的?RAG?系統(tǒng),讓大模型基于你的私有知識(shí)精準(zhǔn)回答,希望對(duì)大家有所幫助

一、為什么需要 RAG

大模型的兩個(gè)致命限制:

限制具體表現(xiàn)后果
知識(shí)截止訓(xùn)練數(shù)據(jù)有時(shí)間窗口不知道最新發(fā)生的事
私有數(shù)據(jù)盲區(qū)只見(jiàn)過(guò)公開(kāi)數(shù)據(jù)不懂你公司的業(yè)務(wù)

解決思路有兩種:

方案A:微調(diào)(Fine-tuning)方案B:RAG
重新訓(xùn)練模型不改模型,外 掛知識(shí)庫(kù)
成本高、周期長(zhǎng)成本低、即插即用
知識(shí)"燒進(jìn)"權(quán)重知識(shí)實(shí)時(shí)檢索
更新知識(shí)需要重新訓(xùn)練隨時(shí)增刪文檔

90% 的場(chǎng)景,RAG 是更好的選擇。

二、RAG 核心原理:三步走

RAG 的工作流程 可以用一句話(huà)概括:先檢索,再生成。

┌──────────┐     ┌──────────┐     ┌──────────┐
│  第一步   │     │  第二步   │     │  第三步   │
│  文檔處理  │────?│  向量檢索  │────?│  增強(qiáng)生成  │
│          │     │          │     │          │
│ 文檔切分  │     │ 問(wèn)題向量化 │     │ 拼接上下文 │
│ 向量化存儲(chǔ) │     │ 相似度匹配  │     │ 大模型生成  │
└──────────┘     └──────────┘     └──────────┘

詳細(xì)流程:

  • 索引階段(離線(xiàn)):把文檔切成小塊 → 轉(zhuǎn)成向量 → 存入向量數(shù)據(jù)庫(kù)
  • 檢索階段(在線(xiàn)):用戶(hù)提問(wèn) → 問(wèn)題轉(zhuǎn)向量 → 在向量庫(kù)中找最相似的文檔塊
  • 生成階段(在線(xiàn)):把檢索到的文檔塊 + 用戶(hù)問(wèn)題一起交給大模型 → 生成回答

三、環(huán)境準(zhǔn)備

pip install openai chromadb sentence-transformers numpy

說(shuō)明:chromadb 是輕量級(jí)向量數(shù)據(jù)庫(kù),sentence-transformers 用于本地文本向量化(不依賴(lài) API)。

四、實(shí)戰(zhàn) 1:最小 RAG 系統(tǒng) ——50 行代碼搞定

先看一個(gè)最簡(jiǎn)版,理解核心邏輯:

# mini_rag.py
import numpy as np
from openai import OpenAI
client = OpenAI()
# ========== 知識(shí)庫(kù) ==========
documents = [
    "公司的年假政策:入職滿(mǎn)1年有5天年假,滿(mǎn)3年有10天年假,滿(mǎn)5年有15天年假。",
    "報(bào)銷(xiāo)流程:填寫(xiě)報(bào)銷(xiāo)單 → 部門(mén)主管審批 → 財(cái)務(wù)審核 → 打款,一般3-5個(gè)工作日完成。",
    "上班時(shí)間為周一至周五 9:00-18:00,午休時(shí)間 12:00-13:30。",
    "遠(yuǎn)程辦公政策:每周可申請(qǐng)最多2天遠(yuǎn)程辦公,需提前一天在OA系統(tǒng)申請(qǐng)。",
    "試用期薪資為正式薪資的80%,試用期一般為3個(gè)月,表現(xiàn)優(yōu)秀可提前轉(zhuǎn)正。",
    "公司提供五險(xiǎn)一金,公積金繳納比例為12%,個(gè)人和公司各承擔(dān)一半。",
    "年終獎(jiǎng)發(fā)放規(guī)則:入職滿(mǎn)一年的員工可獲得1-3個(gè)月薪資的年終獎(jiǎng)。",
    "加班政策:工作日加班按1.5倍計(jì)算,周末加班按2倍計(jì)算,法定節(jié)假日按3倍計(jì)算。",
]
def simple_embed(texts: list[str]) -> list[list[float]]:
    """使用 OpenAI API 生成文本向量"""
    response = client.embeddings.create(
        model="text-embedding-3-small",
        input=texts
    )
    return [item.embedding for item in response.data]
def cosine_similarity(a, b):
    """計(jì)算余弦相似度"""
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
def rag_query(question: str, top_k: int = 2) -> str:
    """最簡(jiǎn) RAG 查詢(xún)"""
    # 1. 檢索:找最相關(guān)的文檔
    doc_vectors = simple_embed(documents)
    question_vector = simple_embed([question])[0]
    # 計(jì)算相似度并排序
    scores = [cosine_similarity(question_vector, dv) for dv in doc_vectors]
    top_indices = np.argsort(scores)[-top_k:][::-1]
    # 2. 拼接上下文
    context = "\n".join([f"[文檔{i+1}] {documents[idx]}" for i, idx in enumerate(top_indices)])
    # 3. 生成回答
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": f"根據(jù)以下參考文檔回答用戶(hù)問(wèn)題。如果文檔中沒(méi)有相關(guān)信息,請(qǐng)說(shuō)明。\n\n參考文檔:\n{context}"},
            {"role": "user", "content": question}
        ]
    )
    return response.choices[0].message.content
# 測(cè)試
if __name__ == "__main__":
    questions = [
        "我入職半年了,能休多少天年假?",
        "我想報(bào)銷(xiāo)一筆費(fèi)用,流程是什么?",
        "加班工資怎么算?",
        "公司年終獎(jiǎng)怎么發(fā)的?",
    ]
    for q in questions:
        print(f"? 問(wèn):{q}")
        answer = rag_query(q)
        print(f"?? 答:{answer}")
        print("-" * 60)

運(yùn)行效果:

? 問(wèn):我入職半年了,能休多少天年假?
?? 答:根據(jù)公司政策,入職滿(mǎn)1年才有5天年假。您目前入職半年,還未滿(mǎn)1年,
暫時(shí)還不能享受年假。建議您在入職滿(mǎn)1年后再申請(qǐng)年假。
--------------------------------------------------
? 問(wèn):加班工資怎么算?
?? 答:工作日加班按1.5倍計(jì)算,周末加班按2倍計(jì)算,法定節(jié)假日按3倍計(jì)算。
--------------------------------------------------

可以看到,模型不是在"瞎編",而是嚴(yán)格基于檢索到的文檔回答。

五、實(shí)戰(zhàn) 2:生產(chǎn)級(jí) RAG —— 完整知識(shí)庫(kù)問(wèn)答系統(tǒng)

最小版本夠理解原理,但生產(chǎn)環(huán)境需要更健壯的實(shí)現(xiàn)。

5.1 文檔加載與切分

# chunker.py
import re
from dataclasses import dataclass
@dataclass
class Chunk:
    """文檔塊"""
    content: str
    metadata: dict  # 存儲(chǔ)來(lái)源、頁(yè)碼等元信息
def split_text(
    text: str,
    chunk_size: int = 300,
    chunk_overlap: int = 50,
    separator: str = "\n"
) -> list[Chunk]:
    """
    智能文本切分
    Args:
        text: 原始文本
        chunk_size: 每個(gè)塊的最大字符數(shù)
        chunk_overlap: 相鄰塊的重疊字符數(shù)
        separator: 切分分隔符
    Returns:
        切分后的文檔塊列表
    """
    # 按分隔符先切分
    segments = text.split(separator)
    segments = [s.strip() for s in segments if s.strip()]
    chunks = []
    current_chunk = ""
    for segment in segments:
        # 如果單個(gè)段落就超長(zhǎng),按句子再切
        if len(segment) > chunk_size:
            sentences = re.split(r'[。???;\.\!\?;]', segment)
            sentences = [s.strip() for s in sentences if s.strip()]
        else:
            sentences = [segment]
        for sentence in sentences:
            if len(current_chunk) + len(sentence) + 1 > chunk_size:
                if current_chunk:
                    chunks.append(Chunk(
                        content=current_chunk,
                        metadata={"char_count": len(current_chunk)}
                    ))
                # 保留重疊部分
                overlap_text = current_chunk[-chunk_overlap:] if chunk_overlap > 0 else ""
                current_chunk = overlap_text + sentence
            else:
                current_chunk = current_chunk + separator + sentence if current_chunk else sentence
    if current_chunk:
        chunks.append(Chunk(
            content=current_chunk,
            metadata={"char_count": len(current_chunk)}
        ))
    return chunks

5.2 向量數(shù)據(jù)庫(kù)

# vector_store.py
import chromadb
from chromadb.config import Settings
class KnowledgeBase:
    """基于 ChromaDB 的知識(shí)庫(kù)"""
    def __init__(self, collection_name: str = "my_knowledge"):
        self.client = chromadb.PersistentClient(path="./chroma_db")
        self.collection = self.client.get_or_create_collection(
            name=collection_name,
            metadata={"hnsw:space": "cosine"}  # 使用余弦相似度
        )
        self.embed_fn = None
    def set_embed_function(self, embed_fn):
        """設(shè)置向量化函數(shù)"""
        self.embed_fn = embed_fn
    def add_documents(self, chunks: list):
        """添加文檔塊到知識(shí)庫(kù)"""
        if not self.embed_fn:
            raise ValueError("請(qǐng)先設(shè)置向量化函數(shù)")
        contents = [chunk.content for chunk in chunks]
        embeddings = self.embed_fn(contents)
        ids = [f"doc_{i}" for i in range(self.collection.count(), self.collection.count() + len(chunks))]
        metadatas = [chunk.metadata for chunk in chunks]
        self.collection.add(
            ids=ids,
            documents=contents,
            embeddings=embeddings,
            metadatas=metadatas
        )
        print(f"? 已添加 {len(chunks)} 個(gè)文檔塊,知識(shí)庫(kù)總量:{self.collection.count()}")
    def search(self, query: str, top_k: int = 3) -> list[dict]:
        """檢索最相關(guān)的文檔塊"""
        query_embedding = self.embed_fn([query])[0]
        results = self.collection.query(
            query_embeddings=[query_embedding],
            n_results=top_k,
            include=["documents", "metadatas", "distances"]
        )
        return [
            {
                "content": doc,
                "metadata": meta,
                "score": 1 - dist  # 距離轉(zhuǎn)相似度
            }
            for doc, meta, dist in zip(
                results["documents"][0],
                results["metadatas"][0],
                results["distances"][0]
            )
        ]

5.3 本地向量化模型 (免費(fèi)、無(wú)需 API)

# embedder.py
from sentence_transformers import SentenceTransformer
class LocalEmbedder:
    """使用本地模型生成向量,完全免費(fèi)"""
    def __init__(self, model_name: str = "shibing624/text2vec-base-chinese"):
        """
        中文文本向量化模型
        Args:
            model_name: 模型名稱(chēng),首次使用會(huì)自動(dòng)下載
                       推薦:shibing624/text2vec-base-chinese(中文,1024維)
                       備選:BAAI/bge-small-zh-v1.5(中文,512維,更快)
        """
        print(f"正在加載向量化模型:{model_name}...")
        self.model = SentenceTransformer(model_name)
        print("模型加載完成!")
    def embed(self, texts: list[str]) -> list[list[float]]:
        """批量生成文本向量"""
        embeddings = self.model.encode(texts, show_progress_bar=False)
        return embeddings.tolist()

5.4 完整 RAG 問(wèn)答系統(tǒng)

# rag_system.py
import json
from openai import OpenAI
from chunker import Chunk, split_text
from vector_store import KnowledgeBase
from embedder import LocalEmbedder
client = OpenAI()
class RAGSystem:
    """完整的 RAG 問(wèn)答系統(tǒng)"""
    def __init__(self):
        # 初始化向量化模型
        self.embedder = LocalEmbedder()
        # 初始化知識(shí)庫(kù)
        self.kb = KnowledgeBase()
        self.kb.set_embed_function(self.embedder.embed)
    def ingest(self, text: str, source: str = "unknown"):
        """將文檔導(dǎo)入知識(shí)庫(kù)"""
        chunks = split_text(text, chunk_size=300, chunk_overlap=50)
        # 添加來(lái)源信息
        for chunk in chunks:
            chunk.metadata["source"] = source
        self.kb.add_documents(chunks)
    def query(self, question: str, top_k: int = 3, show_context: bool = False) -> str:
        """
        問(wèn)答主函數(shù)
        Args:
            question: 用戶(hù)問(wèn)題
            top_k: 檢索的文檔塊數(shù)量
            show_context: 是否顯示檢索到的上下文
        Returns:
            模型回答
        """
        # 1. 檢索相關(guān)文檔
        results = self.kb.search(question, top_k=top_k)
        if not results:
            return "抱歉,知識(shí)庫(kù)中暫無(wú)相關(guān)文檔。"
        # 過(guò)濾低相關(guān)度結(jié)果
        results = [r for r in results if r["score"] > 0.3]
        if show_context:
            print("\n?? 檢索到的相關(guān)文檔:")
            for i, r in enumerate(results):
                print(f"  [{i+1}] (相似度: {r['score']:.3f}) {r['content'][:100]}...")
        # 2. 拼接上下文
        context_parts = []
        for i, r in enumerate(results):
            context_parts.append(f"[參考資料{i+1}](來(lái)源:{r['metadata'].get('source', '未知')})\n{r['content']}")
        context = "\n\n".join(context_parts)
        # 3. 調(diào)用大模型生成回答
        response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[
                {
                    "role": "system",
                    "content": f"""你是一個(gè)精準(zhǔn)的知識(shí)庫(kù)問(wèn)答助手。請(qǐng)嚴(yán)格根據(jù)以下參考資料回答用戶(hù)問(wèn)題。
規(guī)則:
1. 只根據(jù)參考資料中的信息回答,不要編造
2. 如果參考資料中沒(méi)有相關(guān)信息,明確說(shuō)明
3. 引用信息時(shí)標(biāo)注出處(如"根據(jù)參考資料1")
4. 回答要簡(jiǎn)潔準(zhǔn)確
參考資料:
{context}"""
                },
                {"role": "user", "content": question}
            ],
            temperature=0.1  # 低溫度,減少"幻覺(jué)"
        )
        return response.choices[0].message.content
# ========== 使用示例 ==========
if __name__ == "__main__":
    # 初始化 RAG 系統(tǒng)
    rag = RAGSystem()
    # 導(dǎo)入知識(shí)文檔
    company_docs = """
    公司員工手冊(cè) 2026版
    第一章 考勤管理
    上班時(shí)間為周一至周五 9:00-18:00,午休時(shí)間 12:00-13:30。
    遲到15分鐘以?xún)?nèi)扣50元,超過(guò)15分鐘按曠工半天處理。
    每月全勤獎(jiǎng)200元,需當(dāng)月無(wú)遲到早退記錄。
    第二章 休假制度
    年假:入職滿(mǎn)1年5天,滿(mǎn)3年10天,滿(mǎn)5年15天,滿(mǎn)10年20天。
    病假:每年帶薪病假5天,需提供醫(yī)院證明。
    事假:需提前申請(qǐng),每年事假不超過(guò)10天,超過(guò)部分按曠工處理。
    婚假:法定婚假3天,晚婚增加7天。
    產(chǎn)假:女員工產(chǎn)假158天,男員工陪產(chǎn)假15天。
    第三章 薪酬福利
    薪資結(jié)構(gòu):基本工資 + 績(jī)效獎(jiǎng)金 + 餐補(bǔ)(500元/月) + 交通補(bǔ)貼(300元/月)。
    五險(xiǎn)一金:公積金繳納比例12%,社保按國(guó)家標(biāo)準(zhǔn)繳納。
    年終獎(jiǎng):入職滿(mǎn)一年可獲1-3個(gè)月薪資,根據(jù)年度績(jī)效評(píng)定。
    調(diào)薪:每年4月和10月各有一次調(diào)薪窗口。
    第四章 培訓(xùn)發(fā)展
    新員工入職培訓(xùn)為期3天,包含公司文化、制度規(guī)范、安全教育。
    每季度有一次內(nèi)部技術(shù)分享會(huì)。
    每年可申請(qǐng)最高5000元的外部培訓(xùn)費(fèi)用報(bào)銷(xiāo)。
    晉升評(píng)審每半年一次,分別在1月和7月。
    """.strip()
    rag.ingest(company_docs, source="公司員工手冊(cè)2026版")
    # 測(cè)試問(wèn)答
    questions = [
        "我剛?cè)肼?,可以?qǐng)年假嗎?",
        "遲到會(huì)怎樣?",
        "我想?yún)⒓油獠颗嘤?xùn),公司有補(bǔ)貼嗎?",
        "公司什么時(shí)候調(diào)薪?",
    ]
    for q in questions:
        print(f"\n{'='*60}")
        print(f"? 問(wèn):{q}")
        print(f"{'='*60}")
        answer = rag.query(q, show_context=True)
        print(f"\n?? 答:{answer}")

運(yùn)行效果:

? 問(wèn):我想?yún)⒓油獠颗嘤?xùn),公司有補(bǔ)貼嗎?
?? 檢索到的相關(guān)文檔:
  [1] (相似度: 0.872) 晉升評(píng)審每半年一次,分別在1月和7月。每年可申請(qǐng)最高5000元的外部培訓(xùn)費(fèi)用報(bào)...
  [2] (相似度: 0.845) 新員工入職培訓(xùn)為期3天,包含公司文化、制度規(guī)范、安全教育。每季度有一次內(nèi)部技...

?? 答:根據(jù)參考資料1,公司每年可申請(qǐng)最高5000元的外部培訓(xùn)費(fèi)用報(bào)銷(xiāo)。(來(lái)源:公司員工手冊(cè)2026版)

六、Chunk 切分策略詳解

切分策略直接影響檢索質(zhì)量:

策略適用場(chǎng)景優(yōu)點(diǎn)缺點(diǎn)
固定長(zhǎng)度切分通用場(chǎng)景簡(jiǎn)單高效可能切斷語(yǔ)義
按段落切分結(jié)構(gòu)化文檔保持語(yǔ)義完整塊大小不均勻
按句子切分短文檔粒度精細(xì)上下文可能不足
遞歸切分復(fù)雜文檔自適應(yīng)實(shí)現(xiàn)較復(fù)雜
語(yǔ)義切分高質(zhì)量需求效果最好計(jì)算成本高

推薦做法:先用按段落切分,再對(duì)超長(zhǎng)段落做固定長(zhǎng)度切分 + 重疊(本文的實(shí)現(xiàn)方式)。

關(guān)鍵參數(shù)選擇:

# 推薦參數(shù)
chunk_size = 300     # 中文場(chǎng)景 200-500 字符
chunk_overlap = 50   # 重疊 10%-20%
top_k = 3            # 檢索 3-5 個(gè)塊

七、向量檢索 vs  關(guān)鍵詞檢索

維度關(guān)鍵詞檢索(BM25)向量檢索(Embedding)混合檢索
原理詞頻匹配語(yǔ)義相似度兩者結(jié)合
精確匹配強(qiáng)強(qiáng)
語(yǔ)義理解無(wú)強(qiáng)強(qiáng)
專(zhuān)有名詞
推薦場(chǎng)景簡(jiǎn)單搜索問(wèn)答系統(tǒng)生產(chǎn)環(huán)境

生產(chǎn)環(huán)境建議使用混合檢索:

def hybrid_search(query: str, kb, bm25_results: list, alpha: float = 0.7) -> list:
    """
    混合檢索:結(jié)合向量檢索和關(guān)鍵詞檢索
    Args:
        alpha: 向量檢索的權(quán)重(0-1),1.0表示純向量檢索
    """
    vector_results = kb.search(query, top_k=5)
    # 簡(jiǎn)單的分?jǐn)?shù)融合
    combined = {}
    for r in vector_results:
        key = r["content"]
        combined[key] = combined.get(key, 0) + alpha * r["score"]
    for r in bm25_results:
        key = r["content"]
        combined[key] = combined.get(key, 0) + (1 - alpha) * r["score"]
    # 按綜合分?jǐn)?shù)排序
    return sorted(combined.items(), key=lambda x: -x[1])

八、評(píng)估 RAG 系統(tǒng)效果

怎么知道你的 RAG 系統(tǒng)好不好?需要從兩個(gè)維度評(píng)估:

8.1 檢索質(zhì)量

def evaluate_retrieval(test_cases: list[dict], rag_system) -> dict:
    """
    評(píng)估檢索質(zhì)量
    test_cases 格式:
    [
        {"question": "年假多少天", "expected_keywords": ["5天", "10天", "15天"]},
        ...
    ]
    """
    results = {"total": len(test_cases), "hit": 0, "details": []}
    for case in test_cases:
        search_results = rag_system.kb.search(case["question"], top_k=3)
        retrieved_text = " ".join([r["content"] for r in search_results])
        # 檢查關(guān)鍵詞是否被檢索到
        hit = any(kw in retrieved_text for kw in case["expected_keywords"])
        if hit:
            results["hit"] += 1
        results["details"].append({
            "question": case["question"],
            "hit": hit,
            "expected": case["expected_keywords"],
            "retrieved": retrieved_text[:200]
        })
    results["recall"] = results["hit"] / results["total"]
    return results
# 使用示例
test_data = [
    {"question": "年假多少天", "expected_keywords": ["5天", "10天", "15天"]},
    {"question": "遲到怎么扣錢(qián)", "expected_keywords": ["15分鐘", "50元"]},
    {"question": "培訓(xùn)報(bào)銷(xiāo)額度", "expected_keywords": ["5000"]},
]
eval_result = evaluate_retrieval(test_data, rag)
print(f"檢索召回率:{eval_result['recall']:.1%}")

8.2 生成質(zhì)量(人工評(píng)估更可靠)

評(píng)估維度說(shuō)明評(píng)分標(biāo)準(zhǔn)
準(zhǔn)確性回答是否正確1-5分
完整性信息是否全面1-5分
忠實(shí)性是否忠于原文1-5分
簡(jiǎn)潔性是否廢話(huà)少1-5分

九、常見(jiàn)問(wèn)題與優(yōu)化

Q1:檢索不到相關(guān)內(nèi)容?

原因:Chunk 太大或太小,或向量化模型不適合中文。

解決方案:

# 1. 調(diào)整 chunk_size
chunk_size = 200  # 試試更小的塊
# 2. 增加 top_k
top_k = 5  # 檢索更多候選
# 3. 換一個(gè)更好的向量化模型
# BAAI/bge-large-zh-v1.5(中文最佳)

Q2:回答出現(xiàn)"幻覺(jué)"(編造信息)?

解決方案:

# 1. 降低 temperature
temperature = 0.0
# 2. 強(qiáng)化系統(tǒng)提示詞
system_prompt = """嚴(yán)格根據(jù)參考資料回答。如果參考資料中沒(méi)有相關(guān)信息,
必須回答"根據(jù)現(xiàn)有資料,我無(wú)法回答這個(gè)問(wèn)題",絕不可編造。"""
# 3. 添加來(lái)源引用要求
system_prompt += "\n每個(gè)回答必須標(biāo)注參考資料的編號(hào)。"

Q3:多輪對(duì)話(huà)如何處理?

def multi_turn_rag(messages: list[dict], rag_system) -> str:
    """支持多輪對(duì)話(huà)的 RAG"""
    # 用最后一條用戶(hù)消息檢索
    last_question = messages[-1]["content"]
    # 如果是追問(wèn),結(jié)合上下文改寫(xiě)問(wèn)題
    if len(messages) > 1:
        rewrite_prompt = f"根據(jù)對(duì)話(huà)歷史,將用戶(hù)的最新提問(wèn)改寫(xiě)為獨(dú)立問(wèn)題:\n"
        for msg in messages:
            rewrite_prompt += f"{msg['role']}: {msg['content']}\n"
        rewrite = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[{"role": "user", "content": rewrite_prompt}]
        )
        search_query = rewrite.choices[0].message.content
    else:
        search_query = last_question
    return rag_system.query(search_query)

Q4:知識(shí)庫(kù)很大怎么辦?

知識(shí)庫(kù)規(guī)模推薦方案
< 1000 篇文檔ChromaDB(輕量本地)
1000-10萬(wàn) 篇Milvus / Qdrant(專(zhuān)業(yè)向量數(shù)據(jù)庫(kù))
> 10萬(wàn) 篇Elasticsearch + 向量檢索混合方案

總結(jié)

RAG 的核心三步走:

文檔切分 → 向量化存儲(chǔ) → 檢索 + 生成

組件作用推薦選擇
文檔切分控制檢索粒度按段落 + 固定長(zhǎng)度
向量化模型將文本轉(zhuǎn)為向量text2vec-base-chinese / BGE
向量數(shù)據(jù)庫(kù)存儲(chǔ)和檢索向量ChromaDB / Milvus
大語(yǔ)言模型生成最終回答GPT-4o-mini / DeepSeek

RAG 讓大模型擁有了你的私有知識(shí),是 AI 落地企業(yè)應(yīng)用的第一步。掌握了它,你就可以構(gòu)建智能客服、文檔問(wèn)答、知識(shí)助手等各種應(yīng)用。

以上就是Python實(shí)現(xiàn)RAG檢索增強(qiáng)生成的完整教學(xué)的詳細(xì)內(nèi)容,更多關(guān)于Python RAG檢索增強(qiáng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python使用urllib2模塊抓取HTML頁(yè)面資源的實(shí)例分享

    Python使用urllib2模塊抓取HTML頁(yè)面資源的實(shí)例分享

    這篇文章主要介紹了Python使用urllib2模塊抓取HTML頁(yè)面資源的實(shí)例分享,將要抓取的頁(yè)面地址寫(xiě)在單獨(dú)的規(guī)則列表中方便組織和重復(fù)使用,需要的朋友可以參考下
    2016-05-05
  • Python格式化css文件的方法

    Python格式化css文件的方法

    這篇文章主要介紹了Python格式化css文件的方法,實(shí)例分析了Python操作文件的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • 使用Python將多種圖像格式統(tǒng)一轉(zhuǎn)換為JPG的代碼實(shí)現(xiàn)

    使用Python將多種圖像格式統(tǒng)一轉(zhuǎn)換為JPG的代碼實(shí)現(xiàn)

    本文將詳細(xì)解析一個(gè)專(zhuān)業(yè)的Python腳本,它能夠?qū)⒅付ㄎ募A中的所有非JPG格式圖像批量轉(zhuǎn)換為JPG格式,這個(gè)腳本雖然代碼量不大,但包含了文件操作、圖像處理、異常處理等多個(gè)重要編程概念,非常適合初學(xué)者系統(tǒng)學(xué)習(xí),需要的朋友可以參考下
    2025-07-07
  • Python生成隨機(jī)MAC地址

    Python生成隨機(jī)MAC地址

    這篇文章主要介紹了Python生成隨機(jī)MAC地址的相關(guān)資料,需要的朋友可以參考下
    2015-03-03
  • Python文本終端GUI框架示例詳細(xì)講解

    Python文本終端GUI框架示例詳細(xì)講解

    GUI,全稱(chēng)為圖形用戶(hù)界面,又稱(chēng)為圖形用戶(hù)接口,是一種人與計(jì)算機(jī)通信的界面顯示格式。那么Python常用GUI框架有哪些呢?我們來(lái)看看具體介紹
    2022-11-11
  • Pandas中DataFrame中.iloc 屬性

    Pandas中DataFrame中.iloc 屬性

    Pandas的iloc屬性是基于整數(shù)位置的數(shù)據(jù)選擇方法,它允許用戶(hù)通過(guò)整數(shù)位置來(lái)選擇DataFrame中的行和列,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01
  • 最新評(píng)論

    吐鲁番市| 比如县| 普安县| 湟源县| 天台县| 沧州市| 连城县| 德江县| 馆陶县| 阳谷县| 治多县| 崇礼县| 宜兰县| 仲巴县| 垣曲县| 饶河县| 包头市| 肇源县| 宁南县| 青浦区| 锡林浩特市| 龙岩市| 黄山市| 稷山县| 崇州市| 伽师县| 嘉定区| 龙州县| 毕节市| 基隆市| 三河市| 三亚市| 比如县| 岫岩| 浠水县| 太康县| 四川省| 皋兰县| 铜鼓县| 息烽县| 丹巴县|