跳转至

RAG (Retrieval-Augmented Generation)

约 562 个字 6 行代码 6 张图片 预计阅读时间 2 分钟

Resources: https://github.com/ksm26/LangChain-for-LLM-Application-Development/

检索增强生成,用于解决大语言模型的幻觉问题

Querying a LLM w/ RAG

  • User Input 转化为向量,在外部向量数据库(External Vector Database)中进行相似性检索(Retrieval),得到的信息成为 Query 的 Context
  • 将 Query 和 Context 嵌入 Prompt 模板,输入 LLM 进行生成
相似性检索
  • 计算 Query 向量与向量数据库中每个 Text Chunk 向量的相似度
    • 欧氏距离:\(\sqrt{\sum_{i=1}^n (x_i-y_i)^2}\)
    • 余弦相似度\(\frac{\sum_{i=1}^n x_i y_i}{\sqrt{\sum_{i=1}^n x_i^2} \sqrt{\sum_{i=1}^n y_i^2}}\),余弦值越大,表示两个向量越相似
    • 点积:\(\sum_{i=1}^n x_i y_i\)

向量数据库

文本不直接存入向量数据库中(传统数据库就是这么做的),而是经过下列步骤

  • 将知识库文档切分成小块(Text Chunks)
  • 对每个 Text Chunk 输入嵌入模型进行高维向量化操作,这一步需要利用另一个模型,称为 Embedding Model
    • embeddingmodel
    • 向量数据库可以存储非结构化数据,类似图片、音频、视频
  • 得到的高维向量存入向量数据库中
    • vector database

进行 Retrieval 后,提取出相似度最高的 k 个 Text Chunks(称为 Top-k Chunks),对它们进行一些操作,使这些 Chunk 参与到最终答案的生成(可以看作是参与到 Context 中),有以下几种方式:

  • Stuffing
    • 直接把 Top-k Chunks 全部添加到 Context 中
    • 可能导致超过模型的 Context Size
  • Map reduce
    • 每个 Chunk 都输入一个 LLM 进行处理,得到若干个结果
    • 利用另一个 LLM 进行总结得到最终回答
  • Refine
    • 不同于 Map reduce 的并行,refine 更像迭代,每个 LLM 基于前一个 LLM 的输出和下一个 Chunk 进行处理,得到新的输出,直到所有 Chunk 都被处理完,得到最终回答
  • Re-ranking(利用的模型称为 Reranking Model)
    • 类似 Map reduce,但每个 LLM 输出时还会顺带给出一个 Score,选择 Score 最高的输出作为最终回答(或者是 Context?IDK)
    • 需要每个模型都了解评分标准

几种方法图示

stuffing

additionalmethods

得到最终的 Context

LangChain

TBD

Models, Prompts and Parsers

Memory

Chains

Sequencial Chain

Router_Chain

RAG w/ LangChain

QA_chain = (
    { "Context" : retriever | docsq, "Question": RunnablePassthrough()}
        | prompt
        | llm
        | StrOutputParser() 
) # Stuff Method

评论