LangChain多模型接入实操笔记(通义千问/智谱AI/Ollama本地)

一、LangChain 核心介绍

LangChain 是一款开源的大语言模型(LLM)应用开发框架,由 Harrison Chase 于2022年10月推出,核心定位是LLM 应用开发的“胶水层”与“标准化工具箱”。它将大模型的核心能力与外部数据、工具、业务逻辑、记忆体系等模块做了高度封装与标准化适配,让开发者无需从零搭建复杂的模型交互逻辑,就能快速搭建从简单的单轮模型调用,到检索增强生成(RAG)、智能体(Agent)、多轮对话机器人等复杂的AI原生应用。

核心优势:

  1. 统一的模型适配接口:正如本次实操所体现的,通义千问、智谱AI、Ollama本地模型仅需修改少量初始化代码,即可完成不同厂商、不同部署方式的模型切换,无需针对每个模型单独适配原生API接口。
  2. 模块化的组件设计:所有能力都拆分为可插拔的独立模块,比如提示词模板、记忆模块、检索工具、回调函数等,按需组合即可,灵活性极高。
  3. 丰富的生态集成:官方与社区适配了超过1000+的第三方工具与服务,包括向量数据库、文档解析工具、搜索引擎、云服务等,绝大多数场景可开箱即用。
  4. 完整的高阶能力支持:内置了RAG、Agent、Chain等核心能力的标准化实现,无需从零开发复杂的业务逻辑,大幅降低AI应用的开发门槛。

常见适用场景:智能客服、知识库问答、代码生成助手、自动化办公工具、多模态AI应用、智能代理等。

二、LangChain 核心基础概念

2.1 核心模块划分

LangChain的核心能力分为6大基础模块,本次实操主要用到了Model I/O模块,其余模块是后续进阶开发的核心:

模块名称 核心作用 本次实操关联点
Model I/O 标准化管理大模型的输入、调用、输出全流程,是所有LLM应用的基础 本次所有模型的invoke调用、消息体构造均属于该模块
Retrieval 检索模块,负责对接外部文档、向量数据库,实现检索增强生成(RAG),解决大模型知识过时、幻觉问题 本次未涉及,是后续进阶开发的核心
Memory 记忆模块,负责存储对话上下文、历史交互信息,实现多轮连续对话 本次单轮调用未涉及,是多轮对话场景的核心组件
Chains 链模块,将多个独立步骤(比如提示词模板+模型调用+结果解析)串联成完整的业务流程 本次单步调用是最简链,进阶场景会用到多步串联链
Agents 智能体模块,让大模型自主判断需要调用的工具、执行的步骤,完成复杂的自动化任务 本次未涉及,是高阶应用的核心
Callbacks 回调模块,用于监控模型调用全流程,实现日志打印、耗时统计、错误监控等功能 本次实操的耗时统计就是回调的基础应用场景

2.2 核心基础概念详解

(1)LLM 与 Chat Model 的区别

这是本次实操中用到的两个核心模型类,也是新手最容易混淆的点,这里做明确区分:

  • LLM 类:对应基础的文本补全模型,输入是一个字符串,输出也是一个字符串,是最基础的模型调用形式。本次通义千问的调用就使用了LLM类,直接传入问题字符串,即可拿到返回结果字符串。
  • Chat Model 类:对应对话式大模型,是目前行业主流的模型形式,输入是消息列表(Messages),每条消息都有明确的角色(Role),输出是一个AI消息对象。本次智谱AI的调用就使用了Chat Model类,用到了3种核心角色:
    • SystemMessage:系统提示词,给模型设定全局的角色、规则、输出要求,全程生效
    • HumanMessage:用户输入的内容,即用户的问题、指令
    • AIMessage:模型返回的回答内容,可用于存储历史对话,实现多轮对话
(2)核心调用方法

本次实操用到了最核心的invoke()方法,除此之外,LangChain还有3个高频基础调用方法,适配不同业务场景:

  1. invoke():同步单轮调用,最常用的基础方法,输入指令后等待模型完整返回结果再输出,本次所有实操均使用该方法。
  2. batch():批量调用,同时传入多个指令,并行调用模型,适合批量处理大量任务的场景。
  3. stream():流式调用,模型生成一个token就返回一个token,实现打字机效果,是对话机器人的必备功能。
  4. astream():异步流式调用,适配异步开发场景,并发性能更高。
(3)核心模型超参数

本次智谱AI的调用中用到了temperature参数,这是大模型最核心的超参数,这里补充几个高频超参数的作用与用法:

  • temperature:温度系数,取值范围通常为0~1,控制生成内容的随机性与创造性。值越接近0,输出越确定、越严谨,适合知识问答、代码生成等场景;值越接近1,输出越随机、创造性越强,适合文案创作、头脑风暴等场景。
  • max_tokens:模型生成内容的最大token长度,用于限制输出文本的篇幅,避免生成过长的无效内容。
  • top_p:核采样参数,取值范围0~1,常与temperature配合控制输出随机性,通常二者只调整一个即可。值越小,输出越集中在高概率词汇上,内容越严谨稳定。

三、LangChain 基础通用用法

这里补充几个入门必学的基础用法,均以本次实操的“夏天适合吃什么水果”为示例,可直接替换API_KEY后运行,与后续多模型实操无缝衔接。

3.1 提示词模板(PromptTemplate)基础用法

硬编码问题的灵活性极低,实际开发中几乎都会使用提示词模板,将固定的提示词框架与可变的用户输入拆分,实现提示词的标准化管理。

基础示例(适配LLM类,以通义千问为例)
from langchain_community.llms import tongyi
from langchain_core.prompts import PromptTemplate

# 初始化模型
key = '你的真实API_KEY'
llm = tongyi.Tongyi(api_key=key)

# 定义提示词模板
# {question} 是可变参数,后续可动态传入不同的问题
prompt = PromptTemplate(
    input_variables=["question"],
    template="你是一个专业的营养师,针对用户的问题给出专业、严谨、分点清晰的回答,同时标注不同体质的食用注意事项。用户问题:{question}"
)

# 把模板和模型拼接成最简链(LangChain LCEL表达式语法)
chain = prompt | llm

# 调用链,动态传入参数
info = chain.invoke({"question": "夏天适合吃什么水果?"})
print(info)
对话提示词模板(ChatPromptTemplate,适配Chat Model类,以智谱AI为例)

针对对话模型,LangChain提供了专门的对话提示词模板,可标准化管理不同角色的提示词:

from langchain_community.chat_models import ChatZhipuAI
from langchain_core.prompts import ChatPromptTemplate
import os

# 初始化模型
key = '你的真实API_KEY'
os.environ["ZHIPUAI_API_KEY"] = key
chat = ChatZhipuAI(model="glm-4", temperature=0.5)

# 定义对话提示词模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的营养师,针对用户的问题给出专业、严谨、分点清晰的回答,同时标注不同体质的注意事项。"),
    ("human", "{question}")
])

# 拼接链
chain = prompt | chat

# 调用
response = chain.invoke({"question": "夏天适合吃什么水果?"})
print(response.content)

3.2 多轮对话与记忆模块基础用法

单轮调用无法保留上下文,实际对话场景需要记忆模块存储历史交互信息,LangChain提供了开箱即用的记忆组件,这里以最基础的ConversationBufferMemory为例:

from langchain_community.chat_models import ChatZhipuAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.memory import ConversationBufferMemory
from langchain.chains import LLMChain
import os

# 初始化模型
key = '你的真实API_KEY'
os.environ["ZHIPUAI_API_KEY"] = key
chat = ChatZhipuAI(model="glm-4", temperature=0.5)

# 定义带记忆的提示词模板
# MessagesPlaceholder 用于占位历史对话内容
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的营养师,全程用中文回复,记住和用户的历史对话内容,给出连贯的回答。"),
    MessagesPlaceholder(variable_name="chat_history"), # 历史对话占位符
    ("human", "{question}")
])

# 初始化记忆组件,存储对话历史
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

# 构建带记忆的链
chain = LLMChain(
    llm=chat,
    prompt=prompt,
    memory=memory,
    verbose=True # 开启日志,可查看历史对话的传递过程
)

# 第一轮对话
print("===== 第一轮对话 =====")
res1 = chain.invoke({"question": "夏天适合吃什么水果?"})
print(res1["text"])

# 第二轮对话,模型会自动引用上一轮的对话内容
print("\n===== 第二轮对话 =====")
res2 = chain.invoke({"question": "刚才你推荐的水果里,脾胃虚寒的人应该优先选哪个,避开哪个?"})
print(res2["text"])

3.3 输出解析器(OutputParser)基础用法

模型默认返回纯文本,实际开发中常需要将输出解析为结构化数据(如JSON、列表、字典),LangChain的输出解析器可标准化实现该需求,避免手动解析的不稳定性。

示例:将模型的回答解析为标准JSON格式

from langchain_community.llms import tongyi
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.pydantic_v1 import BaseModel, Field
from typing import List

# 初始化模型
key = '你的真实API_KEY'
llm = tongyi.Tongyi(api_key=key)

# 定义输出的数据结构
class FruitInfo(BaseModel):
    fruit_name: str = Field(description="水果名称")
    feature: str = Field(description="水果的特点、适合夏天吃的原因")
    notice: str = Field(description="食用注意事项")

class FruitRecommend(BaseModel):
    recommend_fruits: List[FruitInfo] = Field(description="推荐的水果列表")
    summary: str = Field(description="整体的食用建议总结")

# 初始化解析器
parser = JsonOutputParser(pydantic_object=FruitRecommend)

# 定义提示词模板,将解析规则注入提示词
prompt = PromptTemplate(
    template="你是一个专业的营养师,严格按照格式要求回答用户的问题。\n{format_instructions}\n用户问题:{question}",
    input_variables=["question"],
    partial_variables={"format_instructions": parser.get_format_instructions()}
)

# 拼接链:提示词模板 -> 模型 -> 输出解析器
chain = prompt | llm | parser

# 调用
result = chain.invoke({"question": "夏天适合吃什么水果?"})
print(result)
# 输出为标准Python字典,可直接通过result["recommend_fruits"]获取结构化列表

四、环境前置准备

首先创建并激活Python虚拟环境,本次使用conda管理环境,Python版本选择3.12:

# 创建虚拟环境(原笔记笔误纠正:创建环境用create,而非activate)
conda create -n agent python=3.12
# 激活环境
conda activate agent

激活环境后,安装核心依赖包,根据对接的模型按需安装:

# 基础通用依赖
pip install "langchain-community==0.3.27"
pip install ipykernel

# 通义千问所需依赖
pip install dashscope

# Ollama本地模型所需依赖
pip install langchain-ollama

五、通义千问(Tongyi)对接实操

代码实现

基于langchain_community封装的Tongyi模块实现调用,替换自己的API_KEY即可直接运行:

from langchain_community.llms import tongyi

# 替换为自己的通义千问API_KEY
key = '你的真实API_KEY'
llm = tongyi.Tongyi(api_key=key)

# 调用模型
info = llm.invoke("夏天适合吃什么水果?")
print(info)

踩坑记录:原测试代码中出现过1lmslm.invoke的拼写错误,会导致模块导入失败和变量未定义报错,已在上述代码中修正。

实测输出结果

夏天天气炎热、湿度大,人体易出汗、耗气伤津,容易出现口干舌燥、食欲不振、疲乏或上火(如咽喉肿痛、长痘、便秘)等情况。因此,夏季适合选择**性味偏寒凉、多汁、清热生津、富含水分和维生素**的水果。以下是一些推荐及注意事项:

✅ 推荐水果(适量食用更佳):
1. **西瓜**  
 • 性寒,味甘,归心、胃、膀胱经;清热解暑、生津止渴、利尿消肿。  
 • 含水量高达90%以上,是天然“补水剂”。  
 ⚠️ 注意:脾胃虚寒、易腹泻、糖尿病患者宜少量,避免空腹或冰镇过久食用。

2. **梨(尤其雪梨、鸭梨)**  
 • 性凉,润肺生津、清热降火,缓解夏燥引起的咽干、咳嗽。  
 • 富含膳食纤维,助肠道蠕动。

3. **桃子**  
 • 性温但多汁,富含钾、维生素C和有机酸,助消化、补益气血。  
 • 选熟软、香气浓郁者,避免未熟桃子引起腹胀。

4. **荔枝 & 龙眼(适量!)**  
 • 味甘性温,补益心脾、养血安神,适合暑热耗气后体虚者。  
 ❗⚠️ 但易上火、升血糖,切忌过量(成人每日荔枝建议≤10颗),空腹大量食用可能引发“荔枝病”(低血糖反应)。

5. **芒果**  
 • 性凉,富含β-胡萝卜素、维生素A/C,明目润肤。  
 ⚠️ 易过敏体质者初次少量尝试;未熟芒果含较多鞣酸,可能刺激肠胃。

6. **火龙果(白/红心皆可)**  
...

如有特殊体质(如脾胃虚弱、糖尿病、湿重痰多、易过敏)或慢性病,建议结合中医辨证或营养师指导个性化选择。

祝你清爽一夏,吃出健康与滋味 🌞🍉🍃

六、智谱AI(GLM-4)对接实操

代码实现

使用langchain_community封装的ChatZhipuAI模块,支持对话式调用,可通过SystemMessage设定角色,temperature参数控制生成内容的随机性:

from langchain_community.chat_models import ChatZhipuAI
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
import os

# 替换为自己的智谱AI API_KEY
key = '你的真实API_KEY'
os.environ["ZHIPUAI_API_KEY"] = key

# 模型初始化
chat = ChatZhipuAI(
    model="glm-4",
    # 生成文本的随机程度,值越大越随机,值越小越确定,取值范围通常0-1
    temperature=0.5,
)

# 构造对话消息
messages = [
    SystemMessage(content="你是一个助手请用中文回复。"),
    HumanMessage(content="夏天适合吃什么水果?"),
]

# 调用模型
response = chat.invoke(messages)
print(response.content)

实测输出结果

夏天适合吃多种水果,以下是一些推荐:

1. 西瓜:夏季的代表性水果,含水量高,能解渴降温,清热解暑。

2. 哈密瓜:香甜多汁,富含维生素和矿物质,有很好的消暑作用。

3. 桃子:汁多味甜,含有丰富的维生素C和纤维素,有助于消化。

4. 荔枝:虽然性温,但适量食用能补充能量,但注意不要过量。

5. 葡萄:酸甜可口,富含抗氧化物质,有助于保护心血管。

6. 草莓:维生素C含量高,有美白效果,适合夏季食用。

7. 蓝莓:富含花青素,有抗氧化作用,适合夏季食用。

8. 柠檬:可以泡水喝,富含维生素C,有助于美白和提神。

9. 猕猴桃:维生素C含量极高,有助于增强免疫力。

10. 椰子:椰子水是天然的电解质饮料,能补充夏季流失的矿物质。

这些水果大多具有清热解暑、补充水分和维生素的作用,适合夏季食用。建议根据个人喜好和体质选择适量食用。

七、Ollama本地模型对接实操

前置准备

首先完成Ollama的安装与模型下载:

  1. 进入Ollama官网(https://www.ollama.com/download),根据自身系统完成安装
  2. 安装完成后,在终端执行命令下载并运行本地模型,本次使用deepseek-r1:1.5b轻量化模型
ollama run deepseek-r1:1.5b

代码实现

基于langchain_ollama封装的OllamaLLM模块实现本地模型调用,无需API_KEY,直接对接本地运行的模型:

from langchain_ollama.llms import OllamaLLM

# 初始化模型,model参数与本地下载的模型名称保持一致
model = OllamaLLM(model="deepseek-r1:1.5b")

# 调用模型
res = model.invoke("夏天适合吃什么水果")
print(res)

踩坑记录:原测试代码中出现过langchain ollama0l1amaLLMmode1的拼写错误,会导致模块导入失败,已在上述代码中修正。

实测输出结果

夏天是气温较高、水分蒸发较快的日子,水果在夏天也有独特的风味和功能。以下是一些适合在夏天食用的水果:

### 1. **西瓜**
   - **特点**:西瓜比较甜嫩,口感独特,具有很好的营养价值。
   - **用途**:可以用来做果冻、制作西瓜膏等。

### 2. **菠萝(菠菜)**
   - **特点**:菠萝的颜色鲜艳,味道鲜美。
   - **用途**:可以选择菠萝的叶子和果肉一起食用,口感丰富。

### 3. **苹果**
   - **特点**:苹果甜ness高,酸甜适中。
   - **用途**:可以用来制作苹果酱、苹果沙拉等。

### 4. **香蕉**
   - **特点**:香蕉富含钾和维生素C。
   - **用途**:可以用来做果酒、榨汁等。

### 5. **葡萄**
   - **特点**:葡萄是夏季常见的水果,味道独特,营养丰富。
   - **用途**:可以用来制作葡萄酒、果汁等。

### 6. **橙子(Citrus)**
   - **特点**:橙子比较甜,富含维生素C和维生素B。
   - **用途**:可以用来做果酱、果干等。

...
- 夏季水果的营养比秋秋季丰富,但适量食用是关键。过量食用可能导致着凉。
- 适合夏天的食物通常包括高热量、高蛋白和易吸收的水果。

希望这些信息能帮到你!如果还有其他需求,请随时告诉我哦~

八、实操总结

LangChain框架对不同来源的大模型做了统一的接口封装,无论是云端商用大模型,还是本地部署的开源模型,都可以通过极简的代码实现调用,切换模型时仅需修改少量初始化参数,大幅降低了多模型适配的开发成本。本次实操中遇到的核心问题均为代码拼写错误,开发时需重点注意模块名、变量名的拼写规范,避免低级报错。

从入门开发的角度,建议先掌握Model I/O、提示词模板、输出解析器这三大基础核心能力,再逐步进阶到记忆模块、RAG检索、Agent智能体等高阶功能。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐