RAG:
RAG(检索-增强-生成,Retrieval-Augmented Generation)是一种结合了信息检索与文本生成的技术框架,旨在通过动态引入外部知识提升生成模型的效果。
RAG 的核心原理
-
检索(Retrieval):当输入问题或任务时,系统从外部知识库(如文档、数据库、网页等)中检索相关段落或信息。例如,使用语义搜索或关键词匹配找到最相关的文档。
-
增强(Augmentation):将检索到的信息与原始输入结合,为生成模型提供上下文支持。例如,将检索到的文本拼接在用户问题后,形成增强的输入。
-
生成(Generation):基于增强后的上下文,生成模型(如GPT、BART)输出更准确、信息丰富的回答。
实例
加载文档
loader = TextLoader("./data/**.txt")
documents = loader.load()
创建拆分器
# Split
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
chunk_size=300,
chunk_overlap=50)
# Make splits
splits_documents = text_splitter.split_documents(documents)
词向量嵌入 Embedding
model_kwargs = {"device": "cpu"}
encode_kwargs = {"normalize_embeddings": True}
embedding_model = HuggingFaceBgeEmbeddings(
model_name="BAAI/bge-large-en-v1.5", model_kwargs=model_kwargs, encode_kwargs=encode_kwargs
)
指定 persist_directory 将会把嵌入存储到磁盘上
persist_directory = 'db'
db = Chroma.from_documents(splits_documents, embedding_model, persist_directory='./RAG/vectors_embedding')
retriever = db.as_retriever( )###search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.2}
询问的问题
query = "What is the FLAVOR WINE?"
###加载模型
llm = ChatDeepSeek(
model="deepseek-chat",
temperature=0,
max_tokens=None,
timeout=None,
max_retries=2,
api_key="****************",
# other params...
)
template = """Answer the question based only on the following context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
rag_chain = ( {"context": retriever, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser() )
response = rag_chain.invoke(query)
结果:
可参考:langchain官网 https://python.langchain.com/v0.1/docs/modules/data_connection/retrievers/vectorstore/