DeepSeek-R1 + LlamaIndex:基于推理模型的RAG/RAT应用新玩法

各位朋友们,新年好!

春节期间,科技界最火爆出圈的恐怕非国产大模型DeepSeek莫属,特别是其在V3后推出的对标OpenAI o1的推理模型DeepSeek-R1,以其强大的性能与低廉的成本震惊了全球。

在这里插入图片描述

不过,再强大的模型终究要服务于上层,让我们来关注基于DeepSeek-R1的RAG应用及其特别的玩法。

  • 基于DeepSeek-R1+LlamaIndex的RAG

  • 将RAG转化为RAT(检索增强思维)

基于DeepSeek-R1的RAG

首先我们来快速构建一个DeepSeek-R1的RAG原型,以了解其不同之处。

原料

  • 模型:开源DeepSeek-R1+Ollama本地推理

  • RAG框架:LlamaIndex

  • UI原型:Streamlit

准备Ollama与模型服务

  • 下载Ollama:https://ollama.com/

  • 安装后运行:ollama run deepseek-r1

等待模型下载完成后,我们就拥有了可完全离线使用的本地deepseek-r1模型(根据硬件条件选择不同的参数大小,默认为7b)

基于LlamaIndex的RAG管道

1. 设置模型

在LlamaIndex中使用Ollama模型很简单:

...
llm = Ollama(model="deepseek-r1")
embed_model = OllamaEmbedding(model_name="milkey/dmeta-embedding-zh:f16")

Settings.llm = llm
Settings.embed_model = embed_model

2. 上传文档处理

提供一个上传知识文档的地方并做处理(为了测试方便,这里允许重新上传):

...
# 上传文件(这里允许上传的类型为 txt/ PDF)
uploaded_file = st.file_uploader("", type=["pdf", "txt"])

if uploaded_file is not None:
    
    # 计算文件内容的哈希值
    file_content = uploaded_file.getvalue()
    new_file_hash = hashlib.md5(file_content).hexdigest()

    # 如果文件发生变化或第一次上传,则重新创建 query_engine
    if st.session_state.file_hash != new_file_hash:
        st.session_state.file_hash = new_file_hash

        with st.spinner("正在处理文档..."):

            st.session_state.messages = []

            # 将上传的文件保存到临时位置
            with open("temp.pdf", "wb") as f:
                f.write(file_content)
...

3. 创建基于LlamaIndex的RAG管道

然后用最简洁的方式创建LlamaIndex的RAG管道,采用默认的内存向量存储:

...
            # 加载并处理文档
            docs = SimpleDirectoryReader(input_files=["temp.pdf"]).load_data()
            
            # 创建向量存储索引
            index = VectorStoreIndex.from_documents(docs)

            # 使用自定义提示创建查询引擎
            query_prompt = """
            1. 使用以下上下文来回答最后的问题。
            2. 如果你不知道答案,请直接说"我不知道",不要编造答案。
            3. 保持答案简洁,限制在3-4句话内。
            上下文:{context_str}
            问题:{query_str}
            答案:"""
            
            st.session_state.query_engine = index.as_query_engine(
                text_qa_template=PromptTemplate(query_prompt),
                similarity_top_k=3,
            )

4. 显示聊天历史并输入

接下来就可以接收问题输入,并生成响应,同时添加到对话历史:

...
    # 显示聊天历史
    for message in st.session_state.messages:
        with st.chat_message(message["role"]):
            st.write(message["content"])

    # 聊天输入
    if prompt := st.chat_input("请输入您的问题"):
        # 显示用户问题
        with st.chat_message("user"):
            st.write(prompt)
        st.session_state.messages.append({"role": "user", "content": prompt})

        # 生成回答
        with st.chat_message("assistant"):
            with st.spinner("思考中..."):
                response = st.session_state.query_engine.query(prompt)
                st.markdown(response.response)
                st.session_state.messages.append({"role": "assistant", "response": response.response})
else:
    st.write("上传 PDF 文件以开始对话。")

5. 清除历史记录按钮

为了方便测试,添加一个清除对话历史的按钮:

...
# 添加清除对话历史的按钮
if st.button("清除对话历史"):
    st.session_state.messages = []
    st.rerun()

6. 测试效果

在当前目录下运行streamlit run xxx.py,会自动打开浏览器访问应用,能够看到类似如下界面:

在这里插入图片描述

现在上传一个简单的PDF文件,开始对话。效果如下:

图片

这里我们可以看到,DeepSeek-R1这样的推理模型在输出时会带有一个“思考”过程,这个逐步推理过程会放在输出内容的标签内:

图片

7. 优化显示

实际应用时,可以对中的内容进行简单处理,比如隐藏。这里我们用简单的方法将这部分内容用不同的样式显示,并在保存历史消息时去除这部分。把上面代码中的响应处理部分做如下修改:

...
                # 处理回答中的<think>标签
                text = response.response
                text = re.sub(
                    r'<think>([\s\S]*?)</think>', 
                    lambda m: f'<div style="display: inline;"><span style="color: gray; font-size: 0.9em">{m.group(1)}</span></div>',
                    text,
                    flags=re.DOTALL
                )
                st.markdown(text, unsafe_allow_html=True)
                clean_text = re.sub(r'<think>[\s\S]*?</think>', '', response.response).strip()
                st.session_state.messages.append({"role": "assistant", "content": clean_text})

现在显示效果如下,你可以快速的区分出“思考”与“答案”部分:

图片

如果你使用一些开源的RAG构建平台或类似open-webui这样开箱即用的应用来对接R1,则需要自行对的部分进行处理,比如做折叠显示等。

DeepSeek-R1将RAG转化为RAT

将DeepSeek-R1这样的推理模型用于RAG的另一种改进思路是:将DeepSeek-R1卓越的推理能力与其他模型(如GPT-4o)的生成能力结合,生成更具思考深度与准确性的答案。 这种改进形式也被称为RAT(Retrieval Augmented Thoughts),****检索增强思维。

什么是RAT

RAT是 RAG的一种改进,它结合了 CoT(Chain of Thought,思维链)推理,让模型在回答问题时不仅能够参考外部知识,还能更好地进行深度的推理与思维。

RAT的标准流程为:

1. 生成初步的思维链(CoT): 即推理时的一步步思考过程,通常会分成n个步骤,直到生成最终答案,但此时的CoT可能不够完善或者有错误。

2. 迭代完善思维链: 根据已有CoT的步骤来检索外部知识,并用来不断修正CoT中的错误或遗漏,使CoT更加精准与丰富。经过多次这样的迭代,最终形成一个完善的CoT思维过程。

3. 生成最终答案: 将最终的CoT,即更完善的思维过程,交给负责生成最终答案的LLM,获得最终响应。

整个过程可以下图表示:

图片

在推理模型之前,你只能借助Prompt来生成CoT步骤,后来出现了o1但价格昂贵,现在DeepSeek-R1的开源给了我们一种新的选择:

让DeepSeek- R1来负责生成与完善CoT,以“提取”其思维过程。

RAT的特点

在理解了RAT的工作流程后,可以总结出RAT的特点:

  • 基于CoT生成: 借助CoT模式生成更加深思熟虑与完善的答案。

  • 迭代推理: 通过多次迭代推理精细化CoT,借助外部知识完善。

  • 动态检索: 每次根据新的迭代推理结果,来调整检索的上下文。

由于RAT的流程复杂度增高,所以会带来一定程度的响应速度下降。因此,也并非所有的场景都适用RAT,其更适用于需要长距推理、需要借助外部知识(本地知识库或网络搜索)的一些复杂应用

  • 综合问答:比如一些需要结合多个关联内容的对比、计算、总结等

  • 编程任务: 借助CoT可以让LLM更准确的理解需求并生成更精准的代码

  • 数学推理、游戏步骤推理、机器人路径规划等

图片

RAT的简单实现

参考RAT的流程,我们在上面的RAG代码增加一个“思考”的核心步骤:即借助deepseek迭代生成一个CoT结果。流程稍作简化:

  • 迭代完善CoT时,使用上一次的CoT结果进行检索,并把检索出的上下文交给DeepSeek,用来再次完善CoT
...
THINK_PROMPT = """
    请结合下面提供的上下文(context字段),仔细思考我的问题(question字段),完善之前的推理过程(thoughts字段)。
    如果上下文与问题并不相关,请忽略context字段,直接思考问题。
    注意你只需思考该问题,不需要输出答案,答案部分直接输出"Reasoning Done"即可。
"""

# 初始化组件
reasoning_llm = Ollama(model="deepseek-r1:1.5b")

class DeepSeek:
    def __init__(self, reasoning_llm, reasoning_times=1):
        self.reasoning_llm = reasoning_llm
        self.reasoning_times = reasoning_times

    #检索相关上下文
    def retrieve(self, query):
        nodes = st.session_state.query_engine.retrieve(query["question"])
        return {
            "context": nodes,
            "question": query["question"]
        }

    #迭代推理,并返回最终COT
    def think(self, input: str) -> str:

        thoughts = input
        for _ in range(self.reasoning_times):

            retrieved_docs = self.retrieve({"question": thoughts})
            docs_content = "\n\n".join(
                node.text for node in retrieved_docs["context"]
            )

            prompt_json = {
                "context": docs_content,
                "question": input,
                "thoughts": thoughts
            }

            response = self.reasoning_llm.complete(THINK_PROMPT + '\n\n' + dumps(prompt_json, ensure_ascii=False))

            think = re.findall(r'<think>(.*?)</think>', response.text, re.DOTALL)
            if not think:
                return thoughts or "No reasoning available."
            thoughts = think[0]

            st.write(f"thoughts: {thoughts}")

        return thoughts

测试这里的代码,每次迭代都可以获得一个CoT的“思维”结果。比如:

图片

如果知识库很完善,那么经过多次的迭代,这里的CoT将会更完善,最后就可以交给LLM生成更精准的响应结果。

以上研究了DeepSeek-R1推理模型在RAG中的应用、特点,以及一种新的改进形式:RAT,我们也期待有更多的应用形式让DeepSeek-R1这种优秀的国产模型发挥更大的作用与潜能。

DeepSeek无疑是2025开年AI圈的一匹黑马,在一众AI大模型中,DeepSeek以低价高性能的优势脱颖而出。DeepSeek的上线实现了AI界的又一大突破,各大科技巨头都火速出手,争先抢占DeepSeek大模型的流量风口。

DeepSeek的爆火,远不止于此。它是一场属于每个人的科技革命,一次打破界限的机会,一次让普通人也能逆袭契机。

DeepSeek的优点

read-normal-img

掌握DeepSeek对于转行大模型领域的人来说是一个很大的优势,目前懂得大模型技术方面的人才很稀缺,而DeepSeek就是一个突破口。现在越来越多的人才都想往大模型方向转行,对于想要转行创业,提升自我的人来说是一个不可多得的机会。

那么应该如何学习大模型

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。

大模型岗位需求越来越大,但是相关岗位人才难求,薪资持续走高,AI运营薪资平均值约18457元,AI工程师薪资平均值约37336元,大模型算法薪资平均值约39607元。

read-normal-img

掌握大模型技术你还能拥有更多可能性:

• 成为一名全栈大模型工程师,包括Prompt,LangChain,LoRA等技术开发、运营、产品等方向全栈工程;

• 能够拥有模型二次训练和微调能力,带领大家完成智能对话、文生图等热门应用;

• 薪资上浮10%-20%,覆盖更多高薪岗位,这是一个高需求、高待遇的热门方向和领域;

• 更优质的项目可以为未来创新创业提供基石。

可能大家都想学习AI大模型技术,也想通过这项技能真正达到升职加薪,就业或是副业的目的,但是不知道该如何开始学习,因为网上的资料太多太杂乱了,如果不能系统的学习就相当于是白学。为了让大家少走弯路,少碰壁,这里我直接把都打包整理好,希望能够真正帮助到大家。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费在这里插入图片描述

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

read-normal-img

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

read-normal-img

👉大模型视频和PDF合集👈
观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

read-normal-img

read-normal-img

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

read-normal-img

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值