掌握 RAG:使用 Langchain 和 Ollama 创建本地智能应用程序

引言

随着大型语言模型(LLMs)的兴起,我们见证了一种新的工具类别的诞生。然而,LLMs 也存在局限性,尤其是当面对需要最新信息或专有数据的商业用例时。本文将介绍如何通过微调和 RAG 来解决这些问题。

LLMs 的局限性

传统 LLMs 训练成本高昂,且只能访问公共信息。对于商业用途,需要模型能够提供基于内部知识的最新回应。文章介绍了两种解决这一问题的方法:微调和 RAG。

微调

微调是针对特定数据集进一步训练预训练模型的过程,使其适应特定任务或领域。这类似于给一个通才型助手提供额外的、针对性的训练,使其成为某个特定领域的专家。

RAG

RAG 是一种模型从外部来源检索相关信息以生成更准确、更有信息量回应的方法。与传统依赖预训练知识的模型不同,RAG 通过数据库或搜索引擎查找额外数据,并结合这些数据生成回应。

开源解决方案

面对 LLMs 的法律和安全问题,开源社区提供了解决方案。自 Meta 发布了首个 Llama 模型以来,开源社区迅速响应,为本地实验提供了机会。

RAG 工作流程

文章通过图解介绍了 RAG 的核心工作流程,包括文本分块、向量化存储、语义搜索和组合提示。

    1. 文本分块:将内容分割成文本块,以便更好地检索相关内容。
    1. 向量化存储:将文本转换为向量并存储在向量数据库中。
    1. 语义搜索:使用数值表示进行内容搜索,返回相关内容。
    1. 组合提示:将问题与相关内容结合,生成更准确的提示。

构建 RAG 应用程序

文章通过示例代码,展示了如何使用 Langchain、ChromaDB、Ollama 和 Streamlit 构建 RAG 应用程序。

    1. Langchain 是一个构建大型语言模型(LLM)驱动应用程序的框架。它通过将链、代理和检索策略整合在一起,简化了从概念到实际应用的整个开发过程。Langchain 的核心是其链的概念,这些链构成了应用程序的认知架构。
    1. ChromaDB 是一款开源的轻量级矢量数据库,非常适合小规模服务和用例。它在任何基于 LLM 的应用程序中都扮演着重要角色,因为它以矢量格式存储文本数据,这是 AI 和 ML 模型原生使用的数据格式,可以视为 AI 的内存。
    1. Ollama 是一个工具,允许用户轻松在本地运行开源模型。它简化了将这些模型集成到应用程序中的复杂性,使得开发者可以快速利用最新的模型,如 Meta 的 Llama3,进行本地开发和测试。
    1. Streamlit 是一个开源框架,用于快速且容易地在机器学习和数据科学应用程序之上构建 Web 界面。它允许开发者使用纯 Python 代码将数据脚本转换为可共享的 Web 应用程序,无需前端开发经验,非常适合快速原型开发和应用部署。
<think>我们正在使用 LangChain 0.3.1 版本,其中原来的 `Ollama` 类已被弃用,并移到了 `langchain-ollama` 包中。因此,我们需要安装 `langchain-ollama` 包并使用其中的 `Ollama` 类来替代。 步骤: 1. 确保已经安装了 `langchain-ollama` 包。如果没有安装,使用 pip 安装。 2. 修改代码,从 `langchain_ollama` 导入 `Ollama`,而不是从 `langchain_community.llms` 导入。 注意:同时确保 `ollama` 服务在本地运行(默认地址为 `http://localhost:11434`),并且已经下载了 `deepseek-llm:7b` 模型。 以下是如何调整代码的示例: 原代码(会产生弃用警告): ```python from langchain_community.llms import Ollama llm = Ollama(model="deepseek-llm:7b") ``` 新代码(使用 `langchain-ollama` 包): ```python from langchain_ollama import Ollama llm = Ollama(model="deepseek-llm:7b") ``` 这样调整后,弃用警告将不再出现。 另外,如果之前使用了 `langchain_community` 中的 `OllamaEmbeddings`,现在也应该从 `langchain_ollama` 中导入 `OllamaEmbeddings`。 示例: ```python from langchain_ollama import OllamaEmbeddings embeddings = OllamaEmbeddings(model="deepseek-llm:7b") ``` 因此,完整的调整步骤为: 1. 安装 `langchain-ollama` 包:`pip install langchain-ollama` 2. 修改代码中的导入路径。 注意:`langchain-ollama` 包是 LangChain 官方维护的,用于更好地集成 Ollama 模型。 如果遇到其他问题,请检查版本兼容性。 下面提供完整的示例代码: ```python # 安装包(如果尚未安装) # pip install langchain-ollama from langchain_ollama import Ollama # 初始化本地 DeepSeek 7B 模型 llm = Ollama(model="deepseek-llm:7b", base_url="http://localhost:11434") # 调用模型 response = llm.invoke("解释量子力学的基本概念") print(response) ``` 这样,您就可以继续使用本地部署的 DeepSeek 7B 模型,且不会有弃用警告。 相关问题: 1. 如何解决 LangChainOllama 类被弃用的问题? 2. 在 LangChain 0.3.1 中,如何正确导入并使用 Ollama 模型? 3. 使用 `langchain-ollama` 包调用本地模型有哪些注意事项? 4. 如何为本地运行的 Ollama 模型配置嵌入(Embeddings)? 5. 如何更新现有项目以使用新的 `langchain-ollama` 包? </think>### 解决 LangChain 0.3.1 中 Ollama 类弃用警告的方法 您在 LangChain 0.3.1 中遇到的 `Ollama` 类弃用警告,是由于 LangChain 官方将特定模型集成模块拆分为独立子库(如 `langchain-ollama`)所致。以下是完整解决方案: --- ### 步骤 1: 安装必要依赖 ```bash pip uninstall langchain-community # 移除旧版集成 pip install langchain-ollama==0.1.0 # 安装新版专用库 ``` > **版本说明**: > - `langchain-ollama>=0.1.0` 支持 LangChain 0.3.X > - 确认 Ollama 服务运行:`ollama serve`(默认端口 11434) --- ### 步骤 2: 代码迁移方案 #### 旧版写法(已弃用): ```python from langchain_community.llms import Ollama # ⚠️ 会触发弃用警告 llm = Ollama(model="deepseek-llm:7b") ``` #### ✅ 新版正确写法: ```python from langchain_ollama import Ollama # 从专用库导入 llm = Ollama( model="deepseek-llm:7b", base_url="http://localhost:11434", # 显式指定服务地址 temperature=0.8, # 新增推荐参数 num_predict=512 # 控制生成长度 ) # 调用示例 response = llm.invoke("解释Transformer架构的核心思想") print(response) ``` --- ### 关键变更说明 1. **模块路径变更**: ```diff - from langchain_community.llms import Ollama + from langchain_ollama import Ollama ``` 2. **新增推荐参数**: - `temperature`:控制生成随机性(0-1) - `num_predict`:限制最大输出token数 - `system`:可添加系统级提示词 3. **必须指定服务地址**: ```python base_url="http://localhost:11434" # 即使本地也需显式声明 ``` --- ### 完整 RAG 应用示例 ```python from langchain_ollama import Ollama, OllamaEmbeddings from langchain_community.vectorstores import FAISS from langchain.chains import RetrievalQA # 初始化模型 llm = Ollama(model="deepseek-llm:7b", temperature=0.7) embeddings = OllamaEmbeddings(model="deepseek-llm:7b") # 加载向量库(示例) vectorstore = FAISS.load_local("my_vector_store", embeddings) # 构建问答链 qa_chain = RetrievalQA.from_chain_type( llm=llm, retriever=vectorstore.as_retriever(), chain_type="stuff", return_source_documents=True ) # 执行查询 result = qa_chain.invoke({"query": "DeepSeek-R1 7B 支持多长上下文?"}) print(f"答案:{result['result']}\n来源:{result['source_documents'][0].metadata['source']}") ``` --- ### 常见错误处理 | 错误现象 | 解决方案 | |---------|---------| | `ImportError: cannot import name 'Ollama'` | 确保执行 `pip install langchain-ollama` | | 连接超时 | 检查 Ollama 服务状态:`curl http://localhost:11434` | | `ValueError: Unsupported model` | 确认模型名称:`ollama list` 查看可用模型 | | 内存不足 | 添加参数:`num_gpu=1`(启用GPU)或 `num_thread=8`(优化CPU) | --- ### 性能优化建议 1. 启用 GPU 加速: ```python llm = Ollama(model="deepseek-llm:7b", num_gpu=1) # 使用1块GPU ``` 2. 量化部署(需 Ollama v0.1.20+): ```bash ollama run deepseek-llm:7b-q4_0 # 4-bit量化版本 ``` 3. 流式输出: ```python for chunk in llm.stream("请用三点简述RAG原理:"): print(chunk, end="", flush=True) ``` --- ### 相关问题 1. 如何解决 LangChain 导入 `Ollama` 时的弃用警告? 2. `langchain-community` `langchain-ollama` 的主要区别是什么? 3. 使用 Ollama 本地部署 DeepSeek 7B 时如何启用 GPU 加速? 4. 如何优化 DeepSeek 7B 在 LangChain RAG 应用中的响应速度? 5. Ollama 模型量化对 LangChain 应用性能的影响有哪些? > 通过迁移到 `langchain-ollama` 专用库,您可以获得更好的兼容性新功能支持,同时消除弃用警告。如需进一步调试,建议检查 Ollama 日志:`ollama serve > ollama.log 2>&1`[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值