- 官方文档:python.langchain.com.cn/LangChain Hub:hub.langchain.com/LangChain GitHub:github.com/langchain-a…LangChain 中文社区:langchain.com.cn/
LangChain 是一个用于开发由大型语言模型 (LLMs) 驱动的应用程序的框架
核心概念
Model I/O:模型接口
这一组件充当着与各类大语言模型(LLMs)以及其他模型进行交互的桥梁
- LLMs:提供了调用不同大语言模型(像 OpenAI、Hugging Face 等)的统一接口Prompt Templates:能够对提示词模板进行管理,还可以根据需求动态生成提示词Output Parsers:可以将模型输出的文本解析成结构化的数据,例如 JSON 或者特定的对象
索引
该组件主要用于对非结构化数据进行处理,使其能够与语言模型更好地结合
- Document Loaders:支持从多种数据源(如文件、网页、数据库等)加载文档Text Splitters:能够将长文本分割成合适的小块,方便后续处理Vector Stores:可以将文本转换为向量表示,并进行相似度搜索,常见的有 Chroma、FAISS 等Retrievers:基于向量相似度或其他标准,从索引中检索相关内容
链(Chain)
将多个LLM调用、工具、数据流等串联起来,形成复杂的处理流程
- LLMChain:将提示词模板、语言模型和输出解析器组合在一起,形成一个完整的处理链SequentialChain:可以将多个链按顺序连接起来,实现更复杂的任务处理RouterChain:能够根据输入内容,智能地选择合适的子链进行处理
工具(Tool)
可被Agent调用的外部能力,如搜索、计算、数据库查询等。
Agent(智能体)
具备自主决策能力的智能体,可以根据任务动态选择链或工具。
- Agent Types:有多种类型可供选择,如 ReAct、Self-Ask 等。Toolkits:集成了各种外部工具,例如搜索引擎、计算器、API 调用等
Memory(记忆)
用于保存对话历史或上下文信息,实现有记忆的对话
- BufferMemory:用于存储最近的对话消息ConversationSummaryMemory:可以自动生成对话摘要,减少内存占用VectorStoreRetrieverMemory:利用向量检索的方式,高效地检索相关的历史对话
Callbacks:回调
这一组件允许用户在链或代理的执行过程中插入自定义逻辑
- 对执行过程进行监控。记录日志信息。实现流式输出等功能
基本使用
# 定义模型配置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
- 表示 AI 生成的回复,由模型返回
ystemMessage
- 用于设置 AI 的行为和角色,提供全局指令
ChatMessagePromptTemplate
- 通过指定role创建自定义角色的消息(适用于非标准角色)
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
- 将模型输出解析为JSON格式使用场景:当需要结构化输出时使用,适合API响应、数据提取等需要机器可读格式的场景
PydanticOutputParser
- 将输出解析为Pydantic模型,提供严格的类型检查使用场景:需要强类型验证和结构化数据时使用,适合复杂的数据提取和验证场景
DatetimeOutputParser
- 解析日期时间信息。使用场景:处理包含日期时间的文本,如事件安排、历史日期解析等
CommaSeparatedListOutputParser
- 将逗号分隔的列表解析为Python列表使用场景:需要生成或处理项目列表时使用,如关键词提取、标签生成等
NumberedListOutputParser
- 解析带有编号的列表使用场景:处理步骤说明、操作指南等需要有序列表的场景
XMLOutputParser
- 解析XML格式的输出使用场景:需要XML格式输出时使用,适合与其他XML处理系统集成
OutputFixingParser
- 自动尝试修复格式错误的输出使用场景:当模型输出可能不符合预期格式时使用
RetryOutputParser
- 在输出不符合要求时自动重试使用场景:当输出质量至关重要且可以接受稍长的响应时间时使用,确保获得符合要求的输出
CustomParser
- 创建自定义解析器处理特定格式的输出使用场景:当有特殊输出格式需求时,可以创建自定义解析器处理
Runnable
在 LangChain 中,
Runnable
是一个核心抽象接口,用于表示 “可被调用的组件”,是 LangChain 0.1.0 版本后引入的核心概念(替代了早期的Chain
结构)。它为所有可交互的组件(如提示词模板、LLM、解析器、工具调用等)提供了统一的接口规范,使得这些组件可以无缝组合、嵌套和链式调用,极大简化了复杂 LLM 应用的构建流程
Runnable的本质
- 统一接口:所有 Runnable 对象都实现了一组标准方法(如 invoke, batch, stream,ainvoke,abatch,astream),无论底层是 LLM、工具、函数还是其他链。可组合:通过 |(管道符)、+ 等操作符或显式组合器(如 RunnableParallel)实现嵌套组合,形成 DAG(有向无环图)。惰性执行:组合的链在调用 invoke() 或 stream() 时才实际运行,支持动态调整。
常见方法
invoke(input)
:同步调用,接收输入并返回结果(适合简单场景)ainvoke(input)
:异步调用,返回协程对象(适合高并发场景)stream(input)
:同步流式输出,返回迭代器(逐块获取结果,如实时展示)astream(input)
:异步流式输出,返回异步迭代器batch(inputs)
:批量同步调用,接收输入列表,返回结果列表abatch(inputs)
:批量异步调用基于Runnable实现的类
- RunnableParallel:并行执行多个 Runnable,合并结果(类似字典合并)RunnableBranch:根据条件选择执行不同的分支RunnableSequence:顺序执行多个 RunnableRunnablePassthrough:传递输入数据或附加额外字段RunnableWithFallbacks:主 Runnable 失败时执行备用 RunnableRunnableRetry:自动重试失败的 RunnableRunnableMap:类似于 RunnableParallel,用于并行执行多个 Runnable,并将结果合并为一个字典RunnableLambda / Runnable.from_function:将普通函数转换为 Runnable,方便嵌入到链中RunnableConfig:用于动态配置 Runnable 的行为(如调整 LLM 的 temperature)RunnableBinding:允许在运行时动态绑定参数或配置到 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
对象(或其列表),该对象包含两个核心字段:
page_content
:文档的文本内容(字符串)。metadata
:文档的元数据(字典),如来源路径、作者、时间、页码等,用于后续过滤或溯源加载器列表
文本加载器 TextLoader
PDF加载器 PyPDFLoader
网页加载器 WebBaseLoader
目录加载器 DirectoryLoader
HTML加载器
- UnstructuredHtmlLoaderBSHTMLLoaderSeleniumURLLoader
JSON加载器 JSONLoader
Markdown加载器 UnstructuredMarkdownLoader
CSV加载器 CSVLoader
自定义加载器
文本分割器
在 LangChain 中,文本分割器(Text Splitters) 是用于将长文本(如文档、网页内容等)分割为较小的、语义连贯的文本块(
chunks
)的工具。它是处理长文本时的核心组件,尤其在检索增强生成(RAG)等场景中,合理的文本分割能显著提升后续嵌入(Embedding)和检索的效率与准确性
递归分割文本 RecursiveCharacterTextSplitter
按字符分割文本 CharacterTextSplitter
分割HTML文本
- HTMLHeaderTextSplitter:最适合技术文档、API文档等有清晰标题结构的内容HTMLSectionSplitter:适合CMS生成的页面或模板化HTMLHTMLSemanticPreservingSplitter:适合博客文章、新闻内容等非结构化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 属性
- 名称(name) :唯一标识符,应简洁、描述性强描述(description) :解释工具功能的自然语言,LLM根据描述决定是否使用工具参数模式(args_schema) :定义输入参数结构,- 使用Pydantic模型定义输入结构执行函数(func) :实际执行的代码
Agent
LangChain 中的 Agent(代理)是其最强大的概念之一,是一个能够基于用户输入自主决策、动态选择工具并执行多步骤任务的组件
核心组件
- LLM(大语言模型) :Agent 的 “大脑”,负责决策(如判断是否需要工具、选择哪个工具)和逻辑推理Tools(工具) :Agent 可调用的外部能力,LLM 会根据描述判断是否使用该工具AgentType(智能体类型) :定义 Agent 的决策逻辑和工作方式,LangChain 提供了多种预定义类型
类型
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 提供了一系列工具和接口,支持多模态模型的调用、不同模态数据的处理,以及跨模态任务的实现(如图文问答、图像描述、跨模态检索等)
多模态模型的核心能力
- 跨模态理解:理解图像中的内容并用文字描述跨模态生成:根据文本描述生成图像模态转换:将语音转换为文字,或文字转换为语音
多模态数据调用
在构建用户消息时,content不再是一个字符串,而是一个对象数组;
一般情况下,这个对象数组中的对象有三种类型:文字消息、图片消息、视频消息;
- 文字消息:type="text",text为用户问题;图片消息:type="image_url",image_url的参数说明得具体参考模型服务厂商文档;视频消息:type="video_url",video_url的参数说明同上,需要参考模型服务器厂商文档;
示例
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 基于这些信息生成更准确、更具针对性的回答