【LangChain】快速上手

🌈 个人主页:Zfox_

🔥 系列专栏:LangChain-AI 应用开发框架

目录

  • [一:🔥 内容与⽬标](#一:🔥 内容与⽬标)
  • [二:🔥 详细过程](#二:🔥 详细过程)
  • [三:🔥 引出LangChain相关概念](#三:🔥 引出LangChain相关概念)
    • [🦋 Runnable接⼝](#🦋 Runnable接⼝)
    • [🦋 LangChainExpressionLanguage](#🦋 LangChainExpressionLanguage)
  • [四:🔥 共勉](#四:🔥 共勉)

一:🔥 内容与⽬标

对于LangChain,它是⼀个⽤于开发由⼤语⾔模型(LLM)驱动的应⽤程序的框架。

通过前⼏个章节,我们已经说明尽管⼤模型的在某些⽅⾯表现振奋⼈⼼,但使⽤原⽣LLM可能会存在⼀些问题,例如将其当作搜索引擎去使⽤,LLM⽣成的答案可能要⽐其他搜索引擎查到的答案更符合你的预期,但要是在复杂的场景下使⽤,如将LLM嵌⼊应⽤程序时却遭遇了全新难题:

  • 简单提⽰词(Prompt)得到的答案经常出现幻觉?
  • 提⽰词结构是否可以统⼀规范?
  • 如何实现开发过程中⼤模型的轻松、灵活切换?
  • ⼤模型输出是⾮结构化的,怎样与要求结构化数据的程序接⼝交互?
  • 如何克服预训练模型知识陈旧的问题,引⼊实时更新?
  • 如何连接模型与外部⼯具或系统,执⾏具体任务?
  • ...

LangChain框架的核⼼⽬标就是应对这些挑战。它通过将⾃然语⾔处理流程拆解为标准化组件,让开发者能够⾃由组合并⾼效定制⼯作流。

本节⽬标:

本节主要演⽰如何使⽤LangChain接⼊⼤模型组件,以及与⼤模型进⾏简单对话的能⼒。

掌握了基本⽤法后,将会引出LangChain相关前置概念,以便后续深⼊学习LangChain标准化组件。

二:🔥 详细过程

  1. 安装OpenAI包
bash 复制代码
pip install -U langchain-openai
  1. 定义⼤模型
python 复制代码
# 定义⼤模型
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-5-mini")
  1. 定义消息列表

核⼼代码:

python 复制代码
from langchain_core.messages import HumanMessage, SystemMessage

# 定义消息
# 用户消息 HumanMessage
# 系统提示消息 SystemMessage  通常作为第一条消息传入
# AI 消息 AIMessage
messages = [
    SystemMessage(content="请帮我进行翻译,由英文翻译成中文!"),
    HumanMessage(content="my name is xiaoming")
]

参数说明:

  • SystemMessage :表⽰ 系统⻆⾊ 消息,系统消息通常作为输⼊消息序列中的第⼀条传⼊,是⽤来启动AI⾏为的消息。
  • HumanMessage :表⽰ ⽤⼾⻆⾊ 消息,是来⾃⽤⼾的、从⽤⼾传递到模型的消息。
  1. 调⽤⼤模型

model 是LangChainRunnable(可运⾏)接⼝的实例,这意味着 model 提供了⼀个标准接⼝供我们与之交互。要简单地调⽤模型,我们可以将 消息列表 传递给 .invoke ⽅法。

使⽤ .invoke ⽅法进⾏⼤模型调⽤,核⼼代码:

python 复制代码
result = model.invoke(messages)
print(result)

输出结果(调试可以看⻅result类型为AIMessage):

python 复制代码
content='你好!' additional_kwargs={'refusal': None} response_metadata= 
{'token_usage': {'completion_tokens': 2, 'prompt_tokens': 20, 'total_tokens': 22, 
'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0,
 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': 
 {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-5-mini-2024-07-18', 
 'system_fingerprint': 'fp_560af6e559', 'id': 'chatcmpl-C5l29mi6KkQSFO3qaElDJD5Lj9nBn',
  'service_tier': 'default', 'finish_reason': 'stop', 'logprobs': None} 
  id='run--777ef0be-55c2-411a-a4ab-104a45c22f20-0' usage_metadata={'input_tokens': 20, 'output_tokens': 2,'total_tokens': 22, 'input_token_details': 
  {'audio': 0, 'cache_read': 0},'output_token_details': {'audio': 0, 'reasoning': 0}}

输出说明:

  • AIMessage :来⾃AI的消息。从聊天模型返回,作为对提⽰(输⼊)的响应。
    • content :消息的内容。
    • additional_kwargs :与消息关联的其他有效负载数据。对于来⾃AI的消息,可能包括模型提供程序编码的⼯具调⽤。
    • response_metadata :响应元数据。例如:响应标头、logprobs、令牌计数、模型名称。
  • 侧重于"响应"本⾝的信息,⽐如这次请求的ID、使⽤的模型版本、以及服务提供商返回的所有原始元数据。它主要⽤于调试、⽇志记录和获取请求的上下⽂信息。
    • usage_metadata :消息的使⽤元数据,例如令牌计数。
  • 侧重于"资源消耗"的量化信息,即这次请求消耗了多少Token。它主要⽤于成本计算、监控和预算控制。
  1. 输出解析

若只想输出聊天模型返回的结果字符串,可以使⽤ StrOutputParser 输出解析器组件,将⼤模型输出结果解析为最可能的字符串。核⼼代码:

python 复制代码
# 定义str字符串输出解析器
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
print(parser.invoke(result))
  1. 链式执⾏

通过上述步骤,⽆论是调⽤⼤模型,还是输出解析,我们发现,每次都调⽤了⼀个invoke()⽅法,最终才会得到我们想要的结果。

对于LangChain,它给我们提供了链式执⾏的能⼒,即我们只需要定义各个"组件",将它们"链起来",⼀次性执⾏即可得到最终效果。

完整代码如下:

python 复制代码
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableSequence

# 1. 定义OpenAI模型
# 默认从系统环境变量中读取 OPENAI_API_KEY
model = ChatOpenAI(
    model_name="gpt-4o-mini",
    openai_api_base="https://",
    openai_api_key="sk-****",
)

# 2. 定义消息
# 用户消息 HumanMessage
# 系统提示消息 SystemMessage  通常作为第一条消息传入
# AI 消息 AIMessage
messages = [
    SystemMessage(content="请帮我进行翻译,由英文翻译成中文!"),
    HumanMessage(content="my name is xiaoming")
]

# 3. 调用大模型
# result = model.invoke(messages)
# print(result)

# 链式体现在哪里???

# 4. 定义输出解析器组件
parser = StrOutputParser()
# print(parser.invoke(result))

# 5. 定义链
# 执行链 上一个Runnable实例(组件)的执行(.invoke)结果传输给下一个Runnable实例的输入

# 三种方式都可以定义链
# chain = model | parser
# chain = RunnableSequence(first=model, last=parser)
chain = model.pipe(parser)

print(chain.invoke(messages))

三:🔥 引出LangChain相关概念

🦋 Runnable接⼝

Runnable接⼝是使⽤LangChainComponents(组件)的基础。

概念说明:

Components(组件):⽤来帮助当我们在构建应⽤程序时,提供了⼀系列的核⼼构建块,例如语⾔模型、输出解析器、检索器、编译的LangGraph图等。

Runnable定义了⼀个标准接⼝,允许Runnable组件:

  • Invoked(调⽤):单个输⼊转换为输出。
  • Batched(批处理):多个输⼊被有效地转换为输出。
  • Streamed(流式传输):输出在⽣成时进⾏流式传输。
  • Inspected(检查): 可以访问有关 Runnable 的输⼊、输出和配置的原理图信息。
  • Composed(组合):可以组合多个Runnable,以使⽤LCEL协同⼯作以创建复杂的管道。

所有能⼒参考这里

因此,在快速上⼿中,我们定义的语⾔模型(model)、输出解析器(StrOutputParser)都是Runnable接⼝的实例!他们都使⽤了Invoked(调⽤)的能⼒,回顾⼀下:

python 复制代码
# 语⾔模型(model)
model = ChatOpenAI(model="gpt-5-mini")
result = model.invoke(messages) # 语⾔模型是 Runnable 接⼝实例,允许invoke调⽤

# 输出解析器(StrOutputParser)
parser = StrOutputParser()
parser.invoke(result) # 输出解析器是 Runnable 接⼝实例,允许invoke调⽤

🦋 LangChainExpressionLanguage

LangChainExpressionLanguage(LCEL):采⽤声明性⽅法,从现有Runnable对象构建新的Runnable对象。

通过LCEL构建出的新的Runnable对象,被称为 RunnableSequence ,表⽰可运⾏序列。

RunnableSequence 就是⼀种 链 (参考步骤6)。通过调试 步骤6 就能发现,chain的类型就是RunnableSequence 。如下所⽰:

重要的是, RunnableSequence 也是Runnable接⼝的实例,它实现了完整的Runnable接⼝,因此它可以⽤与任何其他Runnable相同的姿势使⽤。

回顾⼀下:

python 复制代码
chain = model | parser
chain.invoke(messages) # 链是 Runnable 接⼝实例,允许invoke调⽤

可以看到,LCEL其实是⼀种编排解决⽅案,它使LangChain能够以优化的⽅式处理链的运⾏时执⾏。任何两个Runnable实例都可以"链"在⼀起成序列。上⼀个可运⾏对象的 .invoke() 调⽤的输出作为输⼊传递给下⼀个可运⾏对象。⽅法就是使⽤ | (管道/运算符):

python 复制代码
chain = model | parser

除此之外,可以使⽤ .pipe ⽅法代替。这也相当于 | 运算符:

在Unix/Linux系统中, pipe() 系统调⽤和 | 管道操作符都⽤于实现进程间通信,这⾥同样也是迁移过来的⽤法。

python 复制代码
chain = model.pipe(parser)

四:🔥 共勉

😋 以上就是我对 【LangChain】快速上手 的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉

相关推荐
Bigger2 小时前
面试官问我:“AI 写代码比你快 100 倍,你的价值在哪?”
前端·面试·ai编程
耿雨飞10 小时前
第三章:LangChain Classic vs. 新版 LangChain —— 架构演进与迁移指南
人工智能·架构·langchain
程序员鱼皮14 小时前
又一个新项目开源,让 AI 帮你盯全网热点!
javascript·ai·程序员·编程·ai编程
探物 AI15 小时前
虾破苍穹(二)·《openclaw功法全书》 [特殊字符]
人工智能·ai编程
小陈phd15 小时前
电商智能客服智能体——基于LangChain的电商智能客服 Agent 架构设计与实现(二)
数据库·microsoft·langchain
@小匠16 小时前
OpenClaw vs Hermes Agent:哪个更适合你的需求?
ai编程
海上日出17 小时前
这本 LLM 应用书,我翻了 5 遍:RAG 与 Agent 开发实战指南
ai编程
流云细水17 小时前
AI编程SubAgent模板大全(适配Spec驱动开发场景)
驱动开发·ai编程
tanis_317 小时前
MinerU LangChain 集成深度指南:一行代码搞定 PDF 到 RAG
langchain