【LangChain】langchain_community.chat_models.ChatOllama 迁移至 langchain_ollama.ChatOllama

代码中使用了 langchain_community.chat_models.ChatOllama 类来初始化 Ollama 聊天模型(例如 qwen3:1.7b),会触发 LangChainDeprecationWarning,提示该类在 LangChain 0.3.1 中已被废弃,并将在 1.0.0 中移除。官方推荐使用 langchain_ollama 包中的 ChatOllama 类替代。本文基于 LangChain 0.3.x,详细解释如何迁移 ChatOllamalangchain_ollama.ChatOllama,并提供代码示例。

废弃代码告警:
LangChainDeprecationWarning: The class ChatOllama was deprecated in LangChain 0.3.1 and will be removed in 1.0.0. An updated version of the class exists in the :class:~langchain-ollama package and should be used instead. To use it run pip install -U :class:~langchain-ollama and import as from :class:~langchain_ollama import ChatOllama``.
chat = ChatOllama(model = ‘qwen3:1.7b’) ……


为什么需要迁移?

langchain_community.chat_models.ChatOllama 是 LangChain 早期用于与 Ollama 聊天模型交互的类,设计为支持消息格式的对话场景。但随着 LangChain 的模块化重构,Ollama 相关的功能已被移到独立的 langchain_ollama 包中。迁移的原因包括:

  1. 模块化:将特定模型的集成移到社区维护的包,保持 langchain-core 轻量。
  2. 功能优化langchain_ollama.ChatOllama 更稳定,支持最新的 Ollama 功能(如工具调用、结构化输出)。
  3. 长期支持:旧的 ChatOllama 类将在 LangChain 1.0 中移除,新类是未来标准。

新的 langchain_ollama.ChatOllama 提供与旧类相同的对话功能,但更适配 LangChain 0.3.x 的生态(如 LCEL、工具调用、对话历史管理)。


迁移步骤

以下是将 langchain_community.chat_models.ChatOllama 迁移到 langchain_ollama.ChatOllama 的详细步骤,假设你使用 Ollama 本地模型(如 qwen3:1.7b)。

1. 分析原始代码

假设你的代码如下,使用 langchain_community.chat_models.ChatOllama 初始化聊天模型:

from langchain_community.chat_models import ChatOllama
from langchain_core.prompts import ChatPromptTemplate

# 初始化 ChatOllama 模型
chat = ChatOllama(model="qwen3:1.7b")

# 定义提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个助手,请准确回答问题。"),
    ("human", "{question}")
])

# 创建链
chain = prompt | chat

# 调用链
response = chain.invoke({"question": "什么是人工智能?"})
print(response.content)

输出示例

人工智能(AI)是计算机科学的一个分支,旨在开发能够执行需要人类智能的任务的系统,例如学习、推理、问题解决和决策。

问题

  • from langchain_community.chat_models import ChatOllama 已废弃,需替换为 from langchain_ollama import ChatOllama
  • 需要安装 langchain_ollama 包。
  • 确保本地 Ollama 服务运行并支持指定模型(如 qwen3:1.7b)。
2. 安装必要依赖

确保安装 LangChain 0.3.x 和 langchain_ollama

pip install --upgrade langchain langchain-ollama

此外,需确保本地已安装并运行 Ollama 服务:

  1. 安装 Ollama:参考 Ollama 官网,下载并安装。
  2. 拉取模型:
    ollama pull qwen3:1.7b
    
  3. 启动 Ollama 服务:
    ollama serve
    
3. 迁移到 langchain_ollama.ChatOllama

以下是迁移后的代码,替换 ChatOllama 的导入:

from langchain_ollama import ChatOllama
from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
from langchain_core.output_parsers import StrOutputParser

# 初始化 ChatOllama 模型
chat = ChatOllama(model="qwen3:1.7b")

# 创建系统消息模板
system_template = SystemMessagePromptTemplate.from_template(
    "你是一个助手,请准确回答问题。"
)

# 创建用户消息模板
human_template = HumanMessagePromptTemplate.from_template(
    "{question}"
)

# 构建 ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
    system_template,
    human_template
])

# 创建 LCEL 链
chain = prompt | chat | StrOutputParser()

# 调用链
response = chain.invoke({"question": "什么是人工智能?"})
print(response)

输出示例

人工智能(AI)是计算机科学的一个分支,旨在开发能够执行需要人类智能的任务的系统,例如学习、推理、问题解决和决策。
代码说明
  1. 导入替换
    • from langchain_community.chat_models import ChatOllama 替换为 from langchain_ollama import ChatOllama
    • 功能保持不变,ChatOllama 与本地 Ollama 服务交互,支持消息格式。
  2. 模型初始化
    • ChatOllama(model="qwen3:1.7b") 指定模型名称,确保本地已拉取该模型。
    • 默认连接到本地 Ollama 服务(http://localhost:11434)。
  3. 提示模板
    • 使用 ChatPromptTemplate 定义系统和用户消息,适合聊天模型。
  4. LCEL 链
    • prompt | chat 创建链,处理消息输入并生成 AIMessage 输出。
  5. 调用
    • 输入为字典({"question": "..."}),输出为 AIMessage,访问 response.content
4. 结合对话历史(推荐)

为了支持多轮对话,结合 RunnableWithMessageHistory

from langchain_ollama import ChatOllama
from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory

# 初始化 ChatOllama 模型
chat = ChatOllama(model="qwen3:1.7b")

# 创建系统消息模板
system_template = SystemMessagePromptTemplate.from_template(
    "你是一个助手,请根据对话历史回答问题。"
)

# 创建用户消息模板
human_template = HumanMessagePromptTemplate.from_template(
    "{input}"
)

# 构建 ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
    system_template,
    MessagesPlaceholder(variable_name="history"),
    human_template
])

# 创建 LCEL 链
runnable = prompt | chat

# 初始化消息历史存储
store = {}
def get_session_history(session_id: str) -> ChatMessageHistory:
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    return store[session_id]

# 创建带历史的链
chain = RunnableWithMessageHistory(
    runnable,
    get_session_history,
    input_messages_key="input",
    history_messages_key="history"
)

# 调用链
session_id = "user1"
response = chain.invoke(
    {"input": "我叫鲍勃"},
    config={"configurable": {"session_id": session_id}}
)
print(response.content)

response = chain.invoke(
    {"input": "我的名字是什么?"},
    config={"configurable": {"session_id": session_id}}
)
print(response.content)

输出示例

你好,鲍勃!很高兴认识你!有什么可以帮助你的?
你的名字是鲍勃。

说明

  • RunnableWithMessageHistory 管理对话历史,ChatMessageHistory 存储消息。
  • MessagesPlaceholder 插入历史消息,支持多轮对话。
  • 输入为字典({"input": "..."}),输出为 AIMessage
5. 结合工具调用(可选)

若需支持工具调用,ChatOllama 支持部分模型的工具调用功能(需确认 qwen3:1.7b 是否支持)。示例:

from langchain_ollama import ChatOllama
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.tools import tool

# 定义工具
@tool
def search_web(query: str) -> str:
    """搜索网络以获取信息。"""
    return f"搜索 {query} 的结果:[示例内容]"

# 初始化 ChatOllama 模型并绑定工具
chat = ChatOllama(model="qwen3:1.7b").bind_tools([search_web])

# 定义提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个助手,可以使用工具回答问题。"),
    ("human", "{question}")
])

# 创建 LCEL 链
chain = prompt | chat

# 调用链
response = chain.invoke({"question": "成都的天气如何?"})
print(response.tool_calls)

输出示例(若模型支持工具调用):

[{'name': 'search_web', 'args': {'query': '成都天气'}, 'id': 'call_123'}]

说明

  • 使用 bind_tools 绑定工具,ChatOllama 将尝试生成工具调用。
  • 需验证 qwen3:1.7b 是否支持工具调用(部分 Ollama 模型可能不支持)。
6. 测试与验证
  • 确认 Ollama 服务
    • 确保 Ollama 服务运行(ollama serve)。
    • 验证模型可用:ollama list 检查是否包含 qwen3:1.7b
  • 运行代码
    • 确认迁移后输出与原代码一致。
    • 测试多轮对话(若使用历史管理),验证上下文保留。
    • 若使用工具调用,验证工具调用输出。
  • 检查依赖
    • 确保 langchain_ollama 已安装。
    • 无需 OpenAI 密钥,除非代码涉及其他 OpenAI 功能。

注意事项

  1. Ollama 服务

    • 确保本地 Ollama 服务运行,默认监听 http://localhost:11434
    • 若自定义地址,设置 base_url 参数:
      chat = ChatOllama(model="qwen3:1.7b", base_url="http://your-host:port")
      
  2. 模型支持

    • 确认 qwen3:1.7b 已通过 ollama pull 下载。
    • 支持其他 Ollama 模型(如 llama3mistral),参考 Ollama 模型库
    • 工具调用需模型支持,参考 Ollama 文档
  3. 性能

    • 本地 Ollama 模型性能依赖硬件(CPU/GPU),可能比云端模型(如 gpt-4o-mini)慢。
    • 调整参数(如 num_ctxtemperature)优化性能:
      chat = ChatOllama(model="qwen3:1.7b", temperature=0.7, num_ctx=2048)
      
  4. LCEL 兼容性

    • langchain_ollama.ChatOllama 完全支持 LCEL,适合现代工作流(如 prompt | chat)。

常见问题

Q1:可以继续使用 langchain_community.chat_models.ChatOllama 吗?
A:可以,但不建议。它将在 LangChain 1.0 中移除,迁移到 langchain_ollama.ChatOllama 更安全。

Q2:langchain_ollama.ChatOllama 和旧 ChatOllama 功能有差异吗?
A:功能基本相同,但新类更稳定,支持 LangChain 0.3.x 的新功能(如 LCEL、工具调用优化)。

Q3:如何选择 Ollama 模型?
A:根据任务和硬件选择。qwen3:1.7b 轻量,适合低资源环境;llama3:8bmistral 更强大,需更多内存。

Q4:ChatOllama 支持工具调用吗?
A:支持,但需模型支持工具调用(如 qwen3 的具体版本)。参考 Ollama 文档


总结

langchain_community.chat_models.ChatOllama 迁移到 langchain_ollama.ChatOllama 的步骤包括:

  1. 安装 langchainlangchain-ollamapip install langchain langchain-ollama)。
  2. 替换导入:from langchain_community.chat_models import ChatOllama 改为 from langchain_ollama import ChatOllama
  3. 确保本地 Ollama 服务运行并包含指定模型(如 qwen3:1.7b)。
  4. 使用 ChatPromptTemplate 和 LCEL 构建现代对话工作流。
  5. 可选添加 RunnableWithMessageHistory 支持对话历史,或 bind_tools 支持工具调用。
/usr/local/bin/llm_rag_bianbu/search_demo.py:44: LangChainDeprecationWarning: The class `OpenAIChat` was deprecated in LangChain 0.0.1 and will be removed in 1.0. An updated version of the class exists in the langchain-openai package and should be used instead. To use it run `pip install -U langchain-openai` and import as `from langchain_openai import ChatOpenAI`. llm = OpenAIChat(model_name="qwen-max", streaming=True, callbacks=[StreamingStdOutCallbackHandler()]) /usr/local/bin/llm_rag_bianbu/ragenv/lib/python3.12/site-packages/langchain_community/llms/openai.py:1073: UserWarning: You are trying to use a chat model. This way of initializing it is no longer supported. Instead, please use: `from langchain_community.chat_models import ChatOpenAI` warnings.warn( Traceback (most recent call last): File "/usr/local/bin/llm_rag_bianbu/search_demo.py", line 46, in <module> retriever = FAISS.load_local("book2", #从本地目录 "knowledge" 加载 FAISS 向量数据库: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/bin/llm_rag_bianbu/ragenv/lib/python3.12/site-packages/langchain_community/vectorstores/faiss.py", line 1210, in load_local ) = pickle.load( # ignore[pickle]: explicit-opt-in ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/bin/llm_rag_bianbu/ragenv/lib/python3.12/site-packages/pydantic/v1/main.py", line 423, in __setstate__ object_setattr(self, &#39;__fields_set__&#39;, state[&#39;__fields_set__&#39;]) ~~~~~^^^^^^^^^^^^^^^^^^ KeyError: &#39;__fields_set__&#39;这个报错如何解决
最新发布
05-24
### 解决 LangChain 中 OpenAIChat 被弃用以及 FAISS 加载时出现的 KeyError 问题 #### 关于 OpenAIChat 类被弃用 `OpenAIChat` 已经在较新的 LangChain 版本中被标记为废弃(deprecated),取而代之的是来自 `langchain_openai` 包的新实现。要解决这一问题,可以通过以下步骤完成迁移1. **安装新模块** 升级到支持新版 API 的环境中,并确保安装了兼容的扩展包: ```bash pip install -U langchain-openai openai ``` 2. **修改导入路径** 替换原有的 `from langchain.llms import OpenAIChat` 导入语句为推荐的方式: ```python from langchain_community.chat_models import ChatOpenAI ``` 3. **初始化 LLM 实例** 使用更新后的类创建聊天模型实例: ```python llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.7, max_tokens=256) ``` 以上更改能够消除因使用过时组件引发的警告信息[^1]。 --- #### 处理 FAISS 加载时抛出的 KeyError: `&#39;__fields_set__&#39;` 此错误表明 Pydantic 序列化或反序列化的流程存在问题,可能是因为存储的对象状态与实际定义的数据结构之间存在不一致。以下是几种解决方案: 1. **检查向量数据库版本匹配性** 确认保存 FAISS 数据库所用的 LangChain 和 Pydantic 版本是否与当前运行环境相吻合。如果不一致,考虑重新构建索引文件或将旧版数据迁移到最新格式下。 2. **手动清理损坏记录** 如果怀疑某些条目导致异常行为,可尝试删除对应部分后再执行加载操作: ```python try: faiss_index = FAISS.load_local("book2", embeddings_model) except Exception as e: print(f"Error during loading: {e}. Attempting recovery...") # 清除疑似有问题的内容后重试 os.rename("book2/index.faiss", "book2/index.corrupted") faiss_index = FAISS.from_texts(texts=[], embedding_function=embeddings_model) ``` 3. **强制指定字段集属性** 在特定情况下可以直接注入缺失的关键字参数以绕开验证机制: ```python class CustomFAISS(FAISS): @classmethod def _deserialize(cls, data_dict): obj = super()._deserialize(data_dict) if not hasattr(obj, "__fields_set__"): setattr(obj, "__fields_set__", set()) return obj custom_faiss = CustomFAISS.load_local("book2", embeddings_model) ``` 通过上述手段可以有效规避由内部实现细节变化引起的兼容性障碍[^2]。 --- ### 总结 针对 LangChain 内部组件迭代带来的挑战,应当积极拥抱官方指引进行升级改造;而对于第三方插件交互过程中的偶发状况,则需结合具体情况灵活应对。遵循最佳实践的同时保持对底层原理的理解有助于提升整体系统的健壮性和可维护性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值