各位朋友们,新年好!
春节期间,科技界最火爆出圈的恐怕非国产大模型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的优点
掌握DeepSeek对于转行大模型领域的人来说是一个很大的优势,目前懂得大模型技术方面的人才很稀缺,而DeepSeek就是一个突破口。现在越来越多的人才都想往大模型方向转行,对于想要转行创业,提升自我的人来说是一个不可多得的机会。
那么应该如何学习大模型
大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?
”“谁的饭碗又将不保了?
”等问题热议不断。
不如成为「掌握AI工具的技术人」
,毕竟AI时代,谁先尝试,谁就能占得先机!
想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。
大模型岗位需求越来越大,但是相关岗位人才难求,薪资持续走高,AI运营薪资平均值约18457元,AI工程师薪资平均值约37336元,大模型算法薪资平均值约39607元。
掌握大模型技术你还能拥有更多可能性:
• 成为一名全栈大模型工程师,包括Prompt,LangChain,LoRA等技术开发、运营、产品等方向全栈工程;
• 能够拥有模型二次训练和微调能力,带领大家完成智能对话、文生图等热门应用;
• 薪资上浮10%-20%,覆盖更多高薪岗位,这是一个高需求、高待遇的热门方向和领域;
• 更优质的项目可以为未来创新创业提供基石。
可能大家都想学习AI大模型技术,也想通过这项技能真正达到升职加薪,就业或是副业的目的,但是不知道该如何开始学习,因为网上的资料太多太杂乱了,如果不能系统的学习就相当于是白学。为了让大家少走弯路,少碰壁,这里我直接把都打包整理好,希望能够真正帮助到大家。
这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【
保证100%免费
】
👉AI大模型学习路线汇总👈
大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
👉大模型实战案例👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉大模型视频和PDF合集👈
观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费
】