掘金 人工智能 15小时前
AI 大模型应用进阶系列(七):LangChain 核心知识点全覆盖
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

LangChain是一个用于开发由大型语言模型(LLMs)驱动的应用程序的框架,提供了模型I/O、索引、链、工具、智能体、记忆、回调等核心概念,以及文档加载器、文本分割器、函数调用、输出解析器、Runnable、多模态、检索器等组件,帮助开发者构建复杂的LLM应用。

📚 Model I/O:模型接口,充当与各类大语言模型(LLMs)以及其他模型进行交互的桥梁,包括LLMs(提供调用不同大语言模型的统一接口)、Prompt Templates(管理提示词模板,动态生成提示词)和Output Parsers(将模型输出的文本解析成结构化的数据,如JSON或特定对象)。

🔍 索引:主要用于对非结构化数据进行处理,使其能够与语言模型更好地结合,包含Document Loaders(从多种数据源加载文档)、Text Splitters(将长文本分割成合适的小块)、Vector Stores(将文本转换为向量表示,并进行相似度搜索)和Retrievers(基于向量相似度或其他标准,从索引中检索相关内容)。

🔗 链:将多个LLM调用、工具、数据流等串联起来,形成复杂的处理流程,包括LLMChain(将提示词模板、语言模型和输出解析器组合在一起,形成完整的处理链)、SequentialChain(将多个链按顺序连接起来,实现更复杂的任务处理)和RouterChain(根据输入内容,智能地选择合适的子链进行处理)。

🛠️ 工具:可被Agent调用的外部能力,如搜索、计算、数据库查询等,允许LLM执行超出文本生成范围的操作。

🤖 Agent:具备自主决策能力的智能体,可以根据任务动态选择链或工具,包括Agent Types(如ReAct、Self-Ask等)、Toolkits(集成了各种外部工具)等。

LangChain 是一个用于开发由大型语言模型 (LLMs) 驱动的应用程序的框架

核心概念

基本使用

# 定义模型配置ai_config = {    "model": "deepseek-reasoner",    "url": "https://api.deepseek.com/chat/completions",    "key": "your apiKey",}llm = ChatOpenAI(    base_url=ai_config.get('url').replace("chat/completions", ""),    api_key=ai_config.get('key'),    model=ai_config.get('model'),  )prompt = ChatPromptTemplate.from_messages([  ("user", "{input}")])parser = StrOutputParser()chain = prompt | llm | parserprint(chain.invoke({"input": "你好,你是谁"}))

提示词模版 PromptTemplate

消息类型

HumanMessage

HumanMessage

ystemMessage

ChatMessagePromptTemplate

MessagePlaceholder

基础示例

from langchain_openai import ChatOpenAIfrom langchain.prompts import (  ChatPromptTemplate,  SystemMessagePromptTemplate,  HumanMessagePromptTemplate)# 定义模型配置ai_config = {    "model": "deepseek-reasoner",    "url": "https://api.deepseek.com/chat/completions",    "key": "your apiKey",}llm = ChatOpenAI(    base_url=ai_config.get('url').replace("chat/completions", ""),    api_key=ai_config.get('key'),    model=ai_config.get('model'),  )# 1. 定义消息模板system_template = SystemMessagePromptTemplate.from_template(  "你是一位{expertise}专家,回答需简洁明了。")human_template = HumanMessagePromptTemplate.from_template(  "请一句话介绍一下{content}")# 2. 创建聊天模板chat_prompt = ChatPromptTemplate.from_messages([system_template, human_template])# 4. 填充模板参数并生成消息messages = chat_prompt.format_messages(  expertise="编程",  content="langChain")# 5. 调用LLMresponse = llm.invoke(messages)print("系统消息:", messages[0].content)print("用户消息:", messages[1].content)print("AI回复:", response.content)

获取部分提示词模版 partial

from langchain_core.prompts import PromptTemplate_prompt = PromptTemplate.from_template("{system_content} {input}")_partial_prompt = _prompt.partial(system_content="你是一名专业的翻译助手,需要将如下内容翻译为英文")print(_partial_prompt.invoke({"input": "你好"}))# 结果:text='你是一名专业的翻译助手,需要将如下内容翻译为英文 你好'

使用函数获取模版变量值

import datetimefrom langchain_core.prompts import PromptTemplatedef _get_datetime():  return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")_prompt = PromptTemplate.from_template("现在时间是:{datetime},{system_content} {input}")_partial_prompt = _prompt.partial(  datetime=_get_datetime,  system_content="你是一名专业的翻译助手,需要将如下内容翻译为英文")print(_partial_prompt.invoke({"input": "你好"}))# 结果:text='现在时间是:2025-07-01 13:32:22,你是一名专业的翻译助手,需要将如下内容翻译为英文 你好'

样例选择器 Example Selector

长度样例选择器

LengthBasedExampleSelector

语义相似案例选择器

SemanticSimilarityExampleSelector

最近案例选择器

RecentExampleSelector

最大边际相关性选择器

MaxMarginalRelevanceExampleSelector

缓存 MemorCache

在 LangChain 中,缓存(Caching)是一项重要功能,用于存储和复用大模型的响应结果,从而减少重复调用、降低成本、提高响应速度

内存缓存 InMemoryCache

示例:

from langchain_openai import ChatOpenAIfrom langchain_core.globals import set_llm_cachefrom langchain_community.cache import InMemoryCache# 设置内存缓存set_llm_cache(InMemoryCache())# 定义模型配置ai_config = {    "model": "deepseek-reasoner",    "url": "https://api.deepseek.com/chat/completions",    "key": "your apiKey",}llm = ChatOpenAI(    base_url=ai_config.get('url').replace("chat/completions", ""),    api_key=ai_config.get('key'),    model=ai_config.get('model'),  )# 第一次调用(实际请求模型)result1 = llm.invoke("请一句话介绍langChain")print(result1.content)# 第二次调用(相同输入,使用缓存)result2 = llm.invoke("请一句话介绍langChain")print(result2.content)  # 结果与 result1 相同,且未触发新的 API 调用

SQLite 缓存(SQLiteCache)

set_llm_cache(SQLiteCache("../data/langchain_cache.db"))

Redis 缓存(RedisCache)

自定义缓存

输出解析器

StrOutputParser

JSONOutputParser

PydanticOutputParser

DatetimeOutputParser

CommaSeparatedListOutputParser

NumberedListOutputParser

XMLOutputParser

OutputFixingParser

RetryOutputParser

CustomParser

Runnable

在 LangChain 中,Runnable 是一个核心抽象接口,用于表示 “可被调用的组件”,是 LangChain 0.1.0 版本后引入的核心概念(替代了早期的 Chain 结构)。它为所有可交互的组件(如提示词模板、LLM、解析器、工具调用等)提供了统一的接口规范,使得这些组件可以无缝组合、嵌套和链式调用,极大简化了复杂 LLM 应用的构建流程

Runnable的本质

常见方法

基于Runnable实现的类

自定义Runnable

from langchain_openai import ChatOpenAIfrom typing import Iteratorfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.runnables import Runnable# 定义模型配置ai_config = {    "model": "deepseek-reasoner",    "url": "https://api.deepseek.com/chat/completions",    "key": "your apiKey",}llm = ChatOpenAI(    base_url=ai_config.get('url').replace("chat/completions", ""),    api_key=ai_config.get('key'),    model=ai_config.get('model'),  )# 自定义可运行类,将输入内容转换为大写形式class UppercaseRunnable(Runnable[str, str]):    # 同步调用方法,处理输入并返回大写结果    def invoke(self, input: str, config=None) -> str:        return input.content.upper()  # 提取内容并转为大写    # 同步流式处理方法,逐个字符生成大写结果    def stream(self, input: str, config=None) -> Iterator[str]:        yield input.content.upper()  # 生成大写内容流    # 异步调用方法,非阻塞地返回大写结果    async def ainvoke(self, input: str, config=None) -> str:        return input.content.upper()  # 异步提取并转换内容    # 异步流式处理方法,非阻塞地生成大写字符流    async def astream(self, input: str, config=None) -> Iterator[str]:        yield input.content.upper()  # 异步生成内容流# 实例化大写转换处理器uppercase_runnable = UppercaseRunnable()# 创建聊天提示模板,指导模型将内容翻译为英文prompt = ChatPromptTemplate.from_template("请将内容翻译为英文:{input}")# 构建处理链:提示模板 -> LLM模型 -> 大写转换chain = prompt | llm | uppercase_runnable# 流式处理输入并实时输出结果result = chain.invoke({"input": "你好"})print(result)

文档加载器

在 LangChain 中,文档加载器(Document Loaders)  是用于从各种数据源(如文件、数据库、网页等)加载数据并将其转换为统一的 Document 格式的工具。它们是连接外部数据与 LangChain 应用的 “桥梁”,为后续的文本处理(如分割、嵌入、检索等)提供标准化输入

Document 格式

所有加载器最终都会将数据转换为 Document 对象(或其列表),该对象包含两个核心字段:

加载器列表

文本加载器 TextLoader

PDF加载器 PyPDFLoader

网页加载器 WebBaseLoader

目录加载器 DirectoryLoader

HTML加载器

JSON加载器 JSONLoader

Markdown加载器 UnstructuredMarkdownLoader

CSV加载器 CSVLoader

自定义加载器

文本分割器

在 LangChain 中,文本分割器(Text Splitters)  是用于将长文本(如文档、网页内容等)分割为较小的、语义连贯的文本块(chunks)的工具。它是处理长文本时的核心组件,尤其在检索增强生成(RAG)等场景中,合理的文本分割能显著提升后续嵌入(Embedding)和检索的效率与准确性

递归分割文本 RecursiveCharacterTextSplitter

按字符分割文本 CharacterTextSplitter

分割HTML文本

按标题分割markdown文档 MarkdownHeaderTextSplitter

Token 分割 TokenTextSplitter

Function Calling

Function Calling(函数调用)是LangChain中让LLM(大语言模型)能够与外部工具、API或函数交互的关键机制。它允许模型在需要时决定调用哪个函数,并生成符合函数要求的结构化参数

工作流程

Function Calling 的完整流程可分为 5 个步骤,形成 “用户提问→工具调用→结果处理→回答生成” 的闭环:

    用户输入:用户提出需要工具支持的问题(如 “今天北京的天气如何?”“计算 12345×67890”模型判断:LLM 分析问题,判断是否需要调用工具(而非直接回答)。若需要,则决定调用哪个工具,并生成符合格式的调用指令(包含工具名称、参数等工具执行:LangChain 将模型生成的调用指令解析为实际的函数调用,执行外部工具(如调用天气 API、运行计算器函数)结果返回:工具将执行结果返回给 LLM生成回答:LLM 结合工具返回的结果,生成自然语言回答,反馈给用户

不需要调用函数时的执行流程

需要调用函数时的执行流程

Tools

在LangChain中,Tools是核心概念之一,它们允许语言模型(LLM)通过函数调用与外部世界交互。Tools扩展了LLM的能力,使其能够执行超出文本生成范围的操作,如查询API、执行计算、访问数据库等

Tools 属性

Agent

LangChain 中的 Agent(代理)是其最强大的概念之一,是一个能够基于用户输入自主决策、动态选择工具并执行多步骤任务的组件

核心组件

类型

AgentType 类型核心逻辑特点适用场景
ZERO_SHOT_REACT_DESCRIPTION基于 React 框架(Reason+Act),仅通过工具描述决策,无记忆能力轻量、通用,无需上下文依赖单轮工具调用(如查天气、查景点)、独立简单任务
CHAT_ZERO_SHOT_REACT_DESCRIPTION优化适配聊天模型(如 gpt-3.5-turbo),支持对话格式输入符合自然对话习惯,交互更友好对话式工具调用(如 “查天气后推荐景点”)、多轮交互任务
REACT_DOCSTORE结合文档存储(如 VectorDB),通过工具检索文档片段并推理依赖文档上下文,专注知识密集型任务知识库问答(如 “根据年报查营收”)、特定文档解析
SELF_ASK_WITH_SEARCH通过 “自问自答” 分解复杂问题,生成中间问题引导工具调用擅长多步骤推理,逻辑链清晰复杂推理任务(如 “计算高铁到达时间”)、需分步验证的问题
SQL_DATABASE将自然语言转换为 SQL 查询,执行并解析数据库结果专为 SQL 数据库设计,自动处理语法交互数据库查询(如 “查询各地区销售额排序”)、结构化数据统计
JSON_AGENT解析 JSON 结构并提取指定信息,无需 SQL 知识轻量处理 JSON 数据,无需复杂配置JSON 数据查询(如 “从接口结果提取邮箱”)、简单 JSON 解析任务
PYTHON_REPL通过 Python 解释器执行代码,解决计算或数据处理问题支持复杂计算和编程任务数学建模(如 “计算质数和”)、数据可视化脚本生成、编程问题求解
STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION增强型聊天 Agent,支持结构化工具输入(如指定参数格式)适合严格参数校验的工具调用调用有明确参数要求的 API(如 “查询指定日期航班”)、结构化数据交互
OPENAI_FUNCTIONS适配 OpenAI 函数调用 API,直接通过 LLM 生成工具调用格式依赖 OpenAI 原生函数调用能力,无需手动解析与 OpenAI 生态集成的工具调用(如 gpt-4 的函数调用)
AZURE_OPENAI_FUNCTIONS类似OPENAI_FUNCTIONS,专为 Azure OpenAI 服务优化适配 Azure 环境,兼容其 API 特性

流程图

示例

from langchain_openai import ChatOpenAIfrom typing import Annotatedfrom langchain.agents import initialize_agent, AgentTypefrom langchain_core.tools import tool# 定义模型配置ai_config = {    "model": "deepseek-reasoner",    "url": "https://api.deepseek.com/chat/completions",    "key": "your apiKey",}llm = ChatOpenAI(    base_url=ai_config.get("url").replace("chat/completions", ""),    api_key=ai_config.get("key"),    model=ai_config.get("model"),)# 使用@tool装饰器创建乘法工具(函数式实现)@tool(name_or_callable="MultipleTwoNumbers", description="用于计算两个数字相乘")def multiple_tool(    number1: Annotated[float, "第一个要相乘的数字"],  # 使用Annotated添加参数描述    number2: Annotated[float, "第二个要相乘的数字"],  # 便于LLM理解参数含义) -> float:    """计算两个数字的乘积"""    return float(number1) * float(number2)  # 执行乘法运算并返回结果# 使用@tool装饰器创建加法工具(函数式实现)@tool(name_or_callable="AddTwoNumbers", description="用于计算两个数字相加")def add_tool(    number1: Annotated[float, "第一个要相加的数字"],  # 参数类型和描述    number2: Annotated[float, "第二个要相加的数字"],  # 帮助LLM理解参数用途) -> float:    """计算两个数字的和"""    return float(number1) + float(number2)  # 执行加法运算并返回结果# 初始化Agent,配置工具和LLMagent = initialize_agent(    tools=[multiple_tool, add_tool],  # 提供乘法和加法两种工具    llm=llm,  # 指定使用的大语言模型    agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,  # 结构化聊天型Agent    verbose=False  # 启用详细输出,显示Agent思考过程)result = agent.invoke({"input": "100加20再乘以1.5等于多少?直接输出答案"})  # 调用Agent处理问题print(result)# 结果 {'input': '100加20再乘以1.5等于多少?直接输出答案', 'output': 180}180# 打印计算结果(从字典中提取输出)print(result.get('output')) # 结果 180

回调 Callbacks

在 LangChain 中,回调机制(Callback)  是一套用于监控、记录和干预组件(如 LLM、Chain、Agent 等)运行过程的工具,允许开发者在流程的关键节点(如 “模型开始调用”“工具执行完成”“出现错误” 等)插入自定义逻辑(如日志记录、实时输出、结果缓存、性能监控等),回调是一种“钩子(hook)”机制

回调事件列表

on_agent_action(action, *, run_id[, ...])当智能体执行动作时触发
on_agent_finish(finish, *, run_id[, ...])当智能体结束时触发
on_chain_end(outputs, *, run_id[, parent_run_id])当链(Chain)运行结束时触发
on_chain_error(error, *, run_id[, parent_run_id])当链(Chain)运行出错时触发
on_chain_start(serialized, inputs, *, run_id)当链(Chain)开始运行时触发
on_chat_model_start(serialized, messages, *, ...)当聊天模型开始运行时触发
on_custom_event(name, data, *, run_id[, ...])自定义事件的处理器(需重写)
on_llm_end(response, *, run_id[, parent_run_id])当语言模型(LLM)运行结束时触发
on_llm_error(error, *, run_id[, parent_run_id])当语言模型(LLM)运行出错时触发
on_llm_new_token(token, *[, chunk, ...])当语言模型生成新 token 时触发(流式输出)
on_llm_start(serialized, prompts, *, run_id)当语言模型(LLM)开始运行时触发
on_retriever_end(documents, *, run_id[, ...])当检索器(Retriever)运行结束时触发
on_retriever_error(error, *, run_id[, ...])当检索器(Retriever)运行出错时触发
on_retriever_start(serialized, query, *, run_id)当检索器(Retriever)开始运行时触发
on_retry(retry_state, *, run_id[, parent_run_id])当发生重试时触发
on_text(text, *, run_id[, parent_run_id])当任意文本事件发生时触发
on_tool_end(output, *, run_id[, parent_run_id])当工具(Tool)运行结束时触发
on_tool_error(error, *, run_id[, parent_run_id])当工具(Tool)运行出错时触发
on_tool_start(serialized, input_str, *, run_id)当工具(Tool)开始运行时触发

示例

from typing import Dict, Anyfrom langchain_openai import ChatOpenAIfrom langchain_core.callbacks import BaseCallbackHandlerfrom langchain_core.messages import BaseMessagefrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.outputs import LLMResultfrom langchain_core.prompts import ChatPromptTemplateclass LogCallbackhandler(BaseCallbackHandler):    ignore_chat_model = True    ignore_llm = True    def on_chain_start(        self, serialized: dict[str, Any], inputs: Dict[str, Any], **kwargs    ) -> None:        print(f"链开始执行", "\n", kwargs.get("name"), "\n", inputs, "\n")    def on_chain_end(        self,        outputs: dict[str, Any],        **kwargs: Any,    ) -> Any:        print("链执行结束", outputs, kwargs)    def on_chat_model_start(        self,        serialized: dict[str, Any],        messages: list[list[BaseMessage]],        **kwargs: Any,    ) -> Any:        print("LLM 开始执行", "\n", messages, "\n")    def on_llm_end(        self,        response: LLMResult,        **kwargs: Any,    ) -> Any:        print("LLM 执行完毕", "\n", response, "\n")callbacks = [LogCallbackhandler()]# 定义模型配置ai_config = {    "model": "deepseek-reasoner",    "url": "https://api.deepseek.com/chat/completions",    "key": "your apiKey",}llm = ChatOpenAI(    base_url=ai_config.get("url").replace("chat/completions", ""),    api_key=ai_config.get("key"),    model=ai_config.get("model"))chain = (    ChatPromptTemplate.from_template("说一下 1+{number} 等于多少")    | llm    | StrOutputParser())print(chain.invoke({"number": 1}, config={"callbacks": callbacks}))

多模态

在 LangChain 中,多模态(Multimodal)  指的是处理和融合多种类型数据(如文本、图像、音频、视频等)的能力。随着大语言模型(LLM)向多模态方向发展(如 GPT-4V、Claude 3、Gemini 等),LangChain 提供了一系列工具和接口,支持多模态模型的调用、不同模态数据的处理,以及跨模态任务的实现(如图文问答、图像描述、跨模态检索等)

多模态模型的核心能力

多模态数据调用

示例

from langchain_openai import ChatOpenAIfrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.prompts import ChatPromptTemplate# 定义模型配置ai_config = {    "model": "doubao-seed-1-6-250615", # 需要支持多模态的模型    "url": "https://ark.cn-beijing.volces.com/api/v3/chat/completions",    "key": "your apiKey",}llm = ChatOpenAI(    base_url=ai_config.get("url").replace("chat/completions", ""),    api_key=ai_config.get("key"),    model=ai_config.get("model"),)prompt = ChatPromptTemplate.from_messages(    [        (            "system",            "你负责提取图片中的内容,并且按照用户的要求用特定的风格来阐述图片内容",        ),        (            "user",            [                {"type": "text", "text": "{style}"},                {                    "type": "image_url",                    "image_url": {                        "url": "{input_image}",                        "detail": "auto",                    },                },            ],        ),    ])chain = prompt | llm | StrOutputParser()for chunk in chain.stream(    {        "style": "简单",        "input_image": "https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png",    }):    print(chunk, end="", flush=True)

检索器 Retrievers

在 LangChain 中,检索器(Retriever)  是连接外部知识源与大语言模型(LLM)的核心组件,主要用于从文档、数据库等外部资源中检索与用户查询相关的信息,帮助 LLM 基于这些信息生成更准确、更具针对性的回答

常见检索器

向量存储检索器

多查询检索器 MultiQueryRetriever

上下文压缩检索器 LLMChainExtractor

自查询检索器 SelfQueryRetriever

合并检索器结果 EnsembleRetriever

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

LangChain 大型语言模型 LLM框架 人工智能
相关文章