摘要:LangChain是Python中用于封装大模型功能的框架,可极大简化开发流程。本文基于LangChain 0.3版本,系统讲解模型调用、多轮对话、输出格式控制以及四种Prompt模板的使用方法,每个知识点均配有完整可运行代码示例。适合大模型应用开发初学者快速上手。
目录
1. LangChain概述与核心组件
LangChain是一个Python框架,将大模型常用功能封装到一起,集成多种工具,让开发者可以更快捷地构建AI应用。当前最新版本为LangChain 0.3。
核心组件共五个:
| 语言模型 | 选择使用哪个模型,如GPT-3.5、GPT-4 |
| 提示词管理 | 管理Prompt,让模型输出更精确的数据 |
| 链(Chain) | 将各组件连接在一起运行,实现功能组装 |
| 记忆(Memory) | 保存上下文对话信息 |
| 代理(Agent) | 自主决策和执行任务的智能体 |
2. 语言模型基础调用
2.1 环境准备
pip install langchain-openai
import os
os.environ["OPENAI_API_KEY"] = "your-api-key"
# 如需代理可设置
# os.environ["HTTP_PROXY"] = "…"
2.2 基础调用代码
from langchain_openai import ChatOpenAI
# 创建模型实例,默认使用GPT-3.5
llm = ChatOpenAI()
# 调用模型
result = llm.invoke("你是谁")
print(result.content)
2.3 查看和切换模型
# 打印当前使用的模型名称
print(llm.model_name) # 默认输出 gpt-3.5-turbo
# 切换模型
llm = ChatOpenAI(model_name="gpt-4o")
每次调用消耗的token数量因模型而异,GPT-4系列消耗更多。
3. 多轮对话场景模拟
通过设置系统角色、用户角色和AI角色,模拟特定对话场景。
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
messages = [
SystemMessage(content="你是AGI课堂的课程助理,你的名字叫Bob"),
HumanMessage(content="我是学员Tom"),
AIMessage(content="欢迎Tom同学,有什么可以帮助你的?"),
HumanMessage(content="我是谁?你是谁?")
]
result = llm.invoke(messages)
print(result.content)
此方法用于调试AI在特定对话场景中的表现,优化对话流程。
4. 输出格式控制
LangChain提供多种输出解析器,强制模型按指定格式返回数据,便于代码解析和使用。
4.1 列表格式输出
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import PromptTemplate
parser = CommaSeparatedListOutputParser()
format_instructions = parser.get_format_instructions()
prompt = PromptTemplate(
template="给我5个{subject}。\\n{format_instructions}",
input_variables=["subject"],
partial_variables={"format_instructions": format_instructions}
)
_input = prompt.format(subject="心情词汇")
response = llm.invoke(_input)
parsed = parser.parse(response.content)
print(parsed) # 输出Python列表
4.2 时间格式输出
from langchain.output_parsers import DatetimeOutputParser
parser = DatetimeOutputParser()
# 用法与列表格式类似,返回datetime对象
4.3 自定义JSON格式输出
通过继承BaseModel定义结构化输出。
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain.output_parsers import PydanticOutputParser
class AuthorInfo(BaseModel):
name: str = Field(description="作家的名字")
nationality: str = Field(description="作家的国籍")
works: list = Field(description="作家的代表作列表")
parser = PydanticOutputParser(pydantic_object=AuthorInfo)
format_instructions = parser.get_format_instructions()
prompt = PromptTemplate(
template="回答用户的问题。\\n{format_instructions}\\n问题:{question}",
input_variables=["question"],
partial_variables={"format_instructions": format_instructions}
)
_input = prompt.format(question="莫言是谁")
response = llm.invoke(_input)
parsed = parser.parse(response.content)
print(parsed) # 输出AuthorInfo对象,包含name、nationality、works
GPT-4在自定义格式解析上效果更稳定,GPT-3.5可能出现解析失败,多次运行可获得完整结果。
5. Prompt模板封装
5.1 基础模板(PromptTemplate)
from langchain.prompts import PromptTemplate
template = PromptTemplate.from_template("你好,我的名字叫{name}")
print(template.format(name="小明"))
5.2 聊天场景模板
from langchain.prompts import ChatPromptTemplate
template = ChatPromptTemplate.from_messages([
("system", "你是{company}的客服助手,你的名字叫{assistant_name}"),
("human", "你好,我想问一下{question}")
])
messages = template.format_messages(
company="AGI课堂",
assistant_name="Bob",
question="你是谁"
)
result = llm.invoke(messages)
print(result.content)
5.3 示例模板(FewShotPromptTemplate)
通过示例让模型学习输出格式。
from langchain.prompts import FewShotPromptTemplate
examples = [
{"input": "北京天气怎么样", "output": "北京市"},
{"input": "南京下雨吗", "output": "南京市"},
{"input": "武汉热吗", "output": "武汉市"}
]
example_template = """
输入:{input}
输出:{output}
"""
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=PromptTemplate.from_template(example_template),
prefix="请根据示例回答问题",
suffix="输入:{input}\\n输出:",
input_variables=["input"]
)
_input = prompt.format(input="长沙多少度")
response = llm.invoke(_input)
print(response.content) # 输出长沙市
5.4 文档模板(外部文件管理)
将提示词独立存放于外部文件,实现代码与提示词分离,便于维护。
创建template.json:
{
"template": "我的名字叫{name},我喜欢{thing}"
}
加载并使用:
import json
from langchain.prompts import PromptTemplate
with open("template.json", "r") as f:
data = json.load(f)
template = PromptTemplate.from_template(data["template"])
print(template.format(name="小明", thing="编程"))
优势:提示词文本量大时,与Python代码分开管理,可维护性更高。
6. 参考资源
- 本文基于B站视频《20分钟学会LangChain,全面解析+项目实战+代码讲解》整理撰写,通过Ai好记完成视频转录,一键获取核心步骤及代码,如果你也有通过音视频学习AI的需求,推荐试试这个工具,省时又省力!
如有问题欢迎评论区交流。如果本文对你有帮助,点赞、收藏、转发支持~