摘要:# 创建嵌入向量和向量存储 # 使用 FAISS 类的 from_documents 方法创建一个向量存储对象 vector = FAISS.from_documents(documents, embedder) # 配置检索器,检索前3个块 retrieve
使用 DeepSeek R1 大模型和 Ollama 构建本地 RAG 系统-1
使用 DeepSeek R1 大模型和 Ollama 构建本地 RAG 系统-2
使用 DeepSeek R1 大模型和 Ollama 构建本地 RAG 系统-构建 RAG 流水线
前面的文章,可以访问上述链接。
文档分割后,流水线为段落生成向量嵌入,并将它们存储在 FAISS 索引中。、
# 创建嵌入向量和向量存储 # 使用 FAISS 类的 from_documents 方法创建一个向量存储对象 vector = FAISS.from_documents(documents, embedder) # 配置检索器,检索前3个块 retriever = vector.as_retriever(search_type="similarity", search_kwargs={"k": 3})这将文本转换为更容易查询的数值表示形式。后续的查询将针对此索引运行,以找到最具上下文相关性的片段。
在这里,我们将使用 Deepseek R1 1.5B 作为本地大语言模型(LLM),实例化一个检索增强问答(RetrievalQA)链。
# 设置语言模型 llm = Ollama(model="deepseek-r1:1.5b") # 定义提示模板 prompt = """ 1. 使用以下上下文内容回答最后的问题。 2. 如果不知道答案,请直接回答 “我不知道”,不要自行编造答案。 3. 保持回答简洁,控制在 3 到 4 句话以内。 上下文:{context} 问题:{question} 有用的回答:""" QA_CHAIN_PROMPT = PromptTemplate.from_template(prompt)这个模板强制模型将答案基于上传的 PDF 内容。通过将语言模型与连接到 FAISS 索引的检索器包装起来,通过链路提出的任何查询都将从 PDF 的内容中查找上下文,从而使答案基于原始材料。
接下来,可以将上传、分块和检索步骤组合成一个连贯的流水线。
创建 LLM 链:用于生成答案的语言模型链,使用指定的语言模型和提示模板。创建 PromptTemplate 对象:定义了一个提示模板,指定了输入变量和模板内容。合并文档:创建一个 StuffDocumentsChain 对象,将文档合并成一个长文本,使用之前创建的 LLM 链和提示模板。创建 RetrievalQA 对象:用于从文档中检索答案,结合文档合并链和检索器,并返回源文档。 # 创建 LLM 链:用于生成答案 llm_chain = LLMChain( llm=llm, prompt=QA_CHAIN_PROMPT, callbacks=None, verbose=True,) # 创建了一个 PromptTemplate 对象 document_prompt = PromptTemplate( # 指定模板中使用的输入变量为 page_content 和 source input_variables=["page_content", "source"], template="上下文:\n内容:{page_content}\n来源:{source}\n\n", ) # 合并文档 # 创建一个 StuffDocumentsChain 对象,用于将文档合并成一个长文本 combine_documents_chain = StuffDocumentsChain( # 指定使用的语言模型链为之前创建的 llm_chain llm_chain=llm_chain, # 指定文档变量的名称为 context document_variable_name="context", # 指定用于生成提示的模板为 document_prompt document_prompt=document_prompt, # 不使用任何回调函数 callbacks=None, # 指定输出的键为 answer output_key="answer", ) # 创建了一个 RetrievalQA 对象,用于从文档中检索答案 qa = RetrievalQA( combine_documents_chain=combine_documents_chain, verbose=True, retriever=retriever, return_source_documents=True, )这是 RAG(检索增强生成)设计的核心,为大语言模型提供经过验证的上下文,而不是仅依赖其内部训练。
最后,代码使用 Streamlit 的文本输入和写入功能,让用户可以输入问题并立即查看回答。
# 用户输入 user_input = st.text_input("向PDF文档提问:") # 处理用户输入 if user_input: with st.spinner("思考中..."): response = qa(user_input)["result"] st.write("响应结果:") st.write(response)else: st.write("请上传需要处理的PDF文件。")一旦用户输入查询,链路将检索最佳匹配的片段,将其输入到语言模型中,并显示答案。只要正确安装了依赖库,如 Langchain、ollama、DeepSeek等等,代码就应该可以正常运行,而不会触发缺少模块的错误。
输入问题并提交后即可获得即时答案!
如下是Terminal窗口的输出内容:
上述实现展示了如何使用 DeepSeek R1开源模型、Ollama、LangChain 和 Streamlit 构建一个 RAG 应用。通过结合高效的检索、轻量级的大语言模型(LLM)和用户友好的界面,我们可以创建出功能强大的人工智能应用,这些应用能够提供准确且与上下文相关的回答。
这种方法特别适用于需要查询大型文档或数据集的场景,而无需依赖庞大且资源密集型的模型。通过适当的提示工程和高效的 RAG,即使是较小的模型也能在准确性和相关性方面超越较大的模型。
来源:软件架构