RAG的基础知识总结

200 阅读4分钟

1.何为RAG ?

RAG是一种结合信息检索与生成式AI的技术框架,旨在通过从外部知识检索相关信息,增强大模型的生成能力,从而提高上下文的相关性和回答准确性。
当大模型面对一个问题时,通过RAG可以访问外部知识库和文档集,从中检索出与当前问题相关的知识片段,将这些外部信息纳入思考过程,再生成回答。
大模型集合RAG,使其知识库不单单受限于训练过程中记住的知识,同时可以实时查阅资料库,扩展知识信息,将静态、受限的语言模型转换为能够动态获取信息、实时扩展知识的智能体。

2.RAG的核心组件

RAG的核心组件包括知识嵌入、检索器和生产器。
 知识嵌入:读取外部知识库的内容并将其拆分成块,通过嵌入模型将文本或其他形式的知识库转换为向量表示,使其能够能够在高维语义空间中进行比较。
 检索器:负责从外部知识库(向量表示的存储)中查找与用户输入相关的信息。检索器通过采用嵌入向量技术,通过计算语义相似性快速匹配相关文档。
 生成器:利用检索器返回的相关信息生成上下文相关的答案。

3.RAG的工作流程

RAG的工作流程可分为如下步骤:
1.  嵌入与索引:对文档进行分块处理,并转换为嵌入向量存入到向量数据库中(如milvus、chromadb等)。
2.   用户向系统提出一个问题或查询。
3.   系统根据用户的问题生成相应的查询向量,并在向量数据库中检索最相关的文本块(这是RAG的核心步骤)。
4.   生成并输出:将用户的原始问题和检索结果一并传递给大模型,大模型收到上下文之后整合用户问题和检索到的信息生产答案。这个过程中大模型不仅依赖自己的训练数据,还结合了从外部读取的资料。

4.如何快速搭建RAG系统 ?

以LlamaIndex为例,快速搭建一个RAG demo:
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader 
# 第二行代码:加载数据
documents = SimpleDirectoryReader(input_files=[你的文件路径]).load_data() 
# 第三行代码:构建索引
index = VectorStoreIndex.from_documents(documents, embed_model=model)##这里的embed_model可以替换成你的嵌入模型,比如zhipu、阿里的qianwen等。
# 第四行代码:创建问答引擎
query_engine = index.as_query_engine(llm=你的大模型)##这里llm可以为openai,也可以是deepseek、qianwen
# 第五行代码: 开始问答
print(query_engine.query(你的问题))

5.使用langchain搭建RAG demo

from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
#1.加载网络数据
loader = WebBaseLoader(
    web_paths=("https:…………",)
)
docs = loader.load()

# 2. 文档分块


text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
all_splits = text_splitter.split_documents(docs)

# 3. 设置嵌入模型
#这里的嵌入使用ali的:
embeddings=DashScopeEmbedding(
        model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,
        api_key="sk-"
    )
# 4. 创建向量存储
vector_store = InMemoryVectorStore(embeddings)
vector_store.add_documents(all_splits)

# 5. 构建用户查询
question = "黑悟空有哪些游戏场景?"

# 6. 在向量存储中搜索相关文档,并准备上下文内容
retrieved_docs = vector_store.similarity_search(question, k=3)
docs_content = "\n\n".join(doc.page_content for doc in retrieved_docs)

# 7. 构建提示模板
prompt = ChatPromptTemplate.from_template("""
                基于以下上下文,回答问题。如果上下文中没有相关信息,
                请说"我无法从提供的上下文中找到相关信息"。
                上下文: {context}
                问题: {question}
                回答:"""
                                          )

# 8. 使用大语言模型生成答案

llm = ChatOpenAI(
    model="deepseek-reasoner",  # DeepSeek API 支持的模型名称
    base_url="https://api.deepseek.com/v1",
    temperature=0.7,        # 控制输出的随机性(0-1之间,越大越随机)
    max_tokens=2048,        # 最大输出长度
    top_p=0.95,            # 控制输出的多样性(0-1之间)
    presence_penalty=0.0,   # 重复惩罚系数(-2.0到2.0之间)
    frequency_penalty=0.0,  # 频率惩罚系数(-2.0到2.0之间)
    api_key=os.getenv("DEEPSEEK_API_KEY")  # 从环境变量加载API key
)
answer = llm.invoke(prompt.format(question=question, context=docs_content))
print(answer)

6.常见的向量之间的相似度度量指标

1. 欧几里得距离:测量两点之间的直线距离,值越小相似度越大,取值范围是0到正无穷
2. 曼哈顿距离:沿着坐标方向分段测量两点之间的距离(不常用)
3. 余弦相似度:两个向量之间的余弦值,值越大,相似度越大,取值范围-1到1.
4. 点积或内积:测量一个向量在另一个向量上的投影。欧几里得空间中,点积和内积等价。值越大,相似度越大,取值范围-1到1.