agent笔记(一)langchain环境搭建和Ollama本地模型应用
LangChain多模型接入实操笔记(通义千问/智谱AI/Ollama本地)
一、LangChain 核心介绍
LangChain 是一款开源的大语言模型(LLM)应用开发框架,由 Harrison Chase 于2022年10月推出,核心定位是LLM 应用开发的“胶水层”与“标准化工具箱”。它将大模型的核心能力与外部数据、工具、业务逻辑、记忆体系等模块做了高度封装与标准化适配,让开发者无需从零搭建复杂的模型交互逻辑,就能快速搭建从简单的单轮模型调用,到检索增强生成(RAG)、智能体(Agent)、多轮对话机器人等复杂的AI原生应用。
核心优势:
- 统一的模型适配接口:正如本次实操所体现的,通义千问、智谱AI、Ollama本地模型仅需修改少量初始化代码,即可完成不同厂商、不同部署方式的模型切换,无需针对每个模型单独适配原生API接口。
- 模块化的组件设计:所有能力都拆分为可插拔的独立模块,比如提示词模板、记忆模块、检索工具、回调函数等,按需组合即可,灵活性极高。
- 丰富的生态集成:官方与社区适配了超过1000+的第三方工具与服务,包括向量数据库、文档解析工具、搜索引擎、云服务等,绝大多数场景可开箱即用。
- 完整的高阶能力支持:内置了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个高频基础调用方法,适配不同业务场景:
- invoke():同步单轮调用,最常用的基础方法,输入指令后等待模型完整返回结果再输出,本次所有实操均使用该方法。
- batch():批量调用,同时传入多个指令,并行调用模型,适合批量处理大量任务的场景。
- stream():流式调用,模型生成一个token就返回一个token,实现打字机效果,是对话机器人的必备功能。
- 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)
踩坑记录:原测试代码中出现过
1lms、lm.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的安装与模型下载:
- 进入Ollama官网(https://www.ollama.com/download),根据自身系统完成安装
- 安装完成后,在终端执行命令下载并运行本地模型,本次使用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 ollama、0l1amaLLM、mode1的拼写错误,会导致模块导入失败,已在上述代码中修正。
实测输出结果
夏天是气温较高、水分蒸发较快的日子,水果在夏天也有独特的风味和功能。以下是一些适合在夏天食用的水果:
### 1. **西瓜**
- **特点**:西瓜比较甜嫩,口感独特,具有很好的营养价值。
- **用途**:可以用来做果冻、制作西瓜膏等。
### 2. **菠萝(菠菜)**
- **特点**:菠萝的颜色鲜艳,味道鲜美。
- **用途**:可以选择菠萝的叶子和果肉一起食用,口感丰富。
### 3. **苹果**
- **特点**:苹果甜ness高,酸甜适中。
- **用途**:可以用来制作苹果酱、苹果沙拉等。
### 4. **香蕉**
- **特点**:香蕉富含钾和维生素C。
- **用途**:可以用来做果酒、榨汁等。
### 5. **葡萄**
- **特点**:葡萄是夏季常见的水果,味道独特,营养丰富。
- **用途**:可以用来制作葡萄酒、果汁等。
### 6. **橙子(Citrus)**
- **特点**:橙子比较甜,富含维生素C和维生素B。
- **用途**:可以用来做果酱、果干等。
...
- 夏季水果的营养比秋秋季丰富,但适量食用是关键。过量食用可能导致着凉。
- 适合夏天的食物通常包括高热量、高蛋白和易吸收的水果。
希望这些信息能帮到你!如果还有其他需求,请随时告诉我哦~
八、实操总结
LangChain框架对不同来源的大模型做了统一的接口封装,无论是云端商用大模型,还是本地部署的开源模型,都可以通过极简的代码实现调用,切换模型时仅需修改少量初始化参数,大幅降低了多模型适配的开发成本。本次实操中遇到的核心问题均为代码拼写错误,开发时需重点注意模块名、变量名的拼写规范,避免低级报错。
从入门开发的角度,建议先掌握Model I/O、提示词模板、输出解析器这三大基础核心能力,再逐步进阶到记忆模块、RAG检索、Agent智能体等高阶功能。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)