外观
RAG
RAG,全称Retrieval-Augmented Generation,即检索增强生成。
过去的模型都是基于已有的数据训练的,没有实时性,无法回答最新的问题,也没有能力回答企业私有的知识。
为了处理私有知识,我们可以利用它们,通过开源大模型进行二次微调,也可以通过大模型搭建 RAG 系统。
流程

有两个主要步骤:语义搜索和生成输出。在语义搜索步骤中,从知识库中找到与要回答的查询最相关的部分内容。然后,在生成步骤中,将使用这些内容来生成响应。
完整的RAG应用流程主要包含两个阶段:
数据准备阶段:数据提取——>文本分割——>向量化(embedding)——>数据入库 应用阶段:用户提问——>数据检索(召回)——>注入Prompt——>LLM生成答案
代码
将pdf转换为向量数据库
from langchain_community.document_loaders import PyMuPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import FAISS # 向量数据库
def get_vector():
# 第一步:加载文档
loader = PyMuPDFLoader("物流信息.pdf")
# 将文本转成 Document 对象
data = loader.load()
print(f'data-->{data}')
print(f'len(data):{len(data)}')
# # 第二步:切分文本
text_splitter = RecursiveCharacterTextSplitter(chunk_size=50, chunk_overlap=20)
# # 切割加载的 document
split_docs = text_splitter.split_documents(data)
print("split_docs size:", len(split_docs))
print(split_docs)
#
# # 第三步:初始化 hugginFace 的 embeddings 对象
embeddings = OllamaEmbeddings(model="mxbai-embed-large")
#
#
# # 第四步:将 document通过embeddings对象计算得到向量信息并永久存入FAISS向量数据库,用于后续匹配查询
db = FAISS.from_documents(split_docs, embeddings)
db.save_local("./faiss/wuliu")
if __name__ == '__main__':
result = get_vector()构建RAG本地问答系统
# coding:utf-8
# 导入必备的工具包
import time
from local_db import *
from langchain import PromptTemplate
from langchain_community.llms import Ollama
# 加载FAISS向量库
embeddings = OllamaEmbeddings(model="mxbai-embed-large", temperature=0)
db = FAISS.load_local("faiss/wuliu", embeddings, allow_dangerous_deserialization=True)
# db = FAISS.load_local("faiss/wuliu", embeddings)
start_time = time.time()
def get_related_content(related_docs):
# print(f'related_docs--》{related_docs}')
related_content = []
for doc in related_docs:
# print(f'doc.page_content--》{doc.page_content}')
related_content.append(doc.page_content.replace("\n\n", "\n"))
# print(f'related_content列表状态--》{related_content}')
return "\n".join(related_content)
def define_prompt():
question = '我的快递出发地是哪?预计几天的时间到达?'
docs = db.similarity_search(question, k=2)
related_content = get_related_content(docs)
# print('*' * 80)
# print(f'related_content字符串状态-->{related_content}')
# print('*'*80)
PROMPT_TEMPLATE = """
基于以下已知信息,简洁和专业的来回答用户的问题。不允许在答案中添加编造成分。
已知内容:
{context}
问题:
{question}"""
prompt = PromptTemplate(
input_variables=["context", "question"],
template=PROMPT_TEMPLATE,)
my_pmt = prompt.format(context=related_content,
question=question)
return my_pmt
def qa():
model = Ollama(model="qwen2.5:7b")
# print(f'model-->{model}')
my_pmt = define_prompt()
print(f'my_pmt--》{my_pmt}')
# result = model.invoke(my_pmt)
# return result
if __name__ == '__main__':
result = qa()
print(result)
end_time = time.time()
print(end_time-start_time)