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)
query_engine = index.as_query_engine(llm=你的大模型)
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
loader = WebBaseLoader(
web_paths=("https:…………",)
)
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
all_splits = text_splitter.split_documents(docs)
embeddings=DashScopeEmbedding(
model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,
api_key="sk-"
)
vector_store = InMemoryVectorStore(embeddings)
vector_store.add_documents(all_splits)
question = "黑悟空有哪些游戏场景?"
retrieved_docs = vector_store.similarity_search(question, k=3)
docs_content = "\n\n".join(doc.page_content for doc in retrieved_docs)
prompt = ChatPromptTemplate.from_template("""
基于以下上下文,回答问题。如果上下文中没有相关信息,
请说"我无法从提供的上下文中找到相关信息"。
上下文: {context}
问题: {question}
回答:"""
)
llm = ChatOpenAI(
model="deepseek-reasoner",
base_url="https://api.deepseek.com/v1",
temperature=0.7,
max_tokens=2048,
top_p=0.95,
presence_penalty=0.0,
frequency_penalty=0.0,
api_key=os.getenv("DEEPSEEK_API_KEY")
)
answer = llm.invoke(prompt.format(question=question, context=docs_content))
print(answer)
6.常见的向量之间的相似度度量指标
1. 欧几里得距离:测量两点之间的直线距离,值越小相似度越大,取值范围是0到正无穷
2. 曼哈顿距离:沿着坐标方向分段测量两点之间的距离(不常用)
3. 余弦相似度:两个向量之间的余弦值,值越大,相似度越大,取值范围-1到1.
4. 点积或内积:测量一个向量在另一个向量上的投影。欧几里得空间中,点积和内积等价。值越大,相似度越大,取值范围-1到1.