AI的关于RAG的操作

3 阅读2分钟

1. 文件读取与文档封装 (Document Loading)

将本地的非结构化数据(如 txt)读取出来,并赋予“元数据”(Metadata),这是后续追溯信息来源的关键。

  • 对应引入

    from pathlib import Path
    from langchain_core.documents import Document
    
  • 常规操作
    读取纯文本,实例化 Document 对象。page_content 存正文,metadata 存出处(如文件名、页码、作者等)。

    text = file_path.read_text(encoding="utf-8")
    doc = Document(page_content=text, metadata={"source": file_path.name})
    

2. 文本切片 (Chunking / Splitting)

大模型有上下文窗口限制,且整篇文档直接向量化会丢失细节。我们需要将长文本切分成合适的块(Chunk)。

  • 对应引入

    from langchain_text_splitters import RecursiveCharacterTextSplitter
    
  • 常规操作
    设定 chunk_size(块大小)和 chunk_overlap(块与块之间的重叠字数,防止一句话被生硬截断导致语义丢失),然后执行切分。

    text_splitter = RecursiveCharacterTextSplitter(chunk_size=50, chunk_overlap=10)
    split_docs = text_splitter.split_documents(documents)
    

3. 加载向量化模型 (Embedding)

将人类阅读的自然语言,转换成计算机能理解的高维向量(一串浮点数数组)。语义相近的句子,它们在多维空间中的距离也越近。

  • 对应引入

    from langchain_community.embeddings import HuggingFaceBgeEmbeddings
    
  • 常规操作
    加载本地或开源的 Embedding 模型(如智源的 BGE 模型是中文领域表现极佳的开源模型)。

    embedding_model = HuggingFaceBgeEmbeddings(model_name="BAAI/bge-small-zh-v1.5")
    

4. 向量库构建与检索 (Vector Store & Retrieval)

将切好的 Chunk 和它们对应的向量存入专门的数据库(如 FAISS)。当用户提问时,将问题也向量化,然后去库里计算距离(如余弦相似度),找出最接近的 Chunk。

  • 对应引入

    from langchain_community.vectorstores import FAISS
    
  • 常规操作
    用文档和模型初始化数据库,并调用 similarity_search 进行 Top-K 检索。

    # 建库
    vector_db = FAISS.from_documents(split_docs, embedding_model)
    # 检索
    results = vector_db.similarity_search(query, k=1)