本文基于 LangChain 0.3.x,详细介绍 LangChain 中 模型调用时使用的ainvoke()
方法的 config
参数(类型为 RunnableConfig
),列出可配置的设置项、其作用和使用场景,并提供一个独立示例,展示如何通过 config
设置超时和回调来优化人工智能主题的问答工作流,示例突出 config
在异步调用中的灵活性。( LangChain RunnableConfig 文档)
ainvoke()
方法的 config
参数概览ainvoke()
是 LangChain 中 Runnable
类的异步调用方法,用于异步执行链、模型或工具的逻辑。它接受一个可选的 config
参数,类型为 RunnableConfig
,用于配置运行时行为。RunnableConfig
是一个字典或 TypedDict
,允许开发者设置超时、并发、回调、元数据等,以控制执行流程和调试。
方法签名:
async def ainvoke(
self,
input: Input,
config: Optional[RunnableConfig] = None,
**kwargs: Any
) -> Output
input
(Input
):输入数据,类型取决于具体 Runnable
。config
(Optional[RunnableConfig]
):运行时配置,默认为 None
。**kwargs
:其他参数,传递给底层实现。Output
,异步返回的输出,类型取决于 Runnable
。RunnableConfig
的作用:
适用场景:
RunnableConfig
可设置项以下是 RunnableConfig
支持的主要设置项,基于 LangChain 0.3.x 的源码(langchain_core/runnables/config.py
)和文档。RunnableConfig
是一个 TypedDict
,定义如下:
class RunnableConfig(TypedDict, total=False):
tags: List[str]
metadata: Dict[str, Any]
callbacks: Optional[Callbacks]
run_name: Optional[str]
max_concurrency: Optional[int]
recursion_limit: Optional[int]
configurable: Optional[Dict[str, Any]]
tags
List[str]
"query"
、"moderation"
)。config = {"tags": ["ai_query", "test"]}
metadata
Dict[str, Any]
config = {"metadata": {"user_id": "123", "session_id": "abc"}}
callbacks
Optional[Callbacks]
(List[BaseCallbackHandler]
或 BaseCallbackManager
)langchain_core.callbacks.StdOutCallbackHandler
:打印标准输出。langchain_core.callbacks.FileCallbackHandler
:记录到文件。BaseCallbackHandler
。from langchain_core.callbacks import StdOutCallbackHandler
config = {"callbacks": [StdOutCallbackHandler()]}
run_name
Optional[str]
config = {"run_name": "AI_Query"}
max_concurrency
Optional[int]
config = {"max_concurrency": 5}
recursion_limit
Optional[int]
config = {"recursion_limit": 10}
configurable
Optional[Dict[str, Any]]
config = {"configurable": {"timeout": 30, "temperature": 0.9}}
虽然 RunnableConfig
本身不直接定义以下设置,但 config
可以间接影响底层组件的行为(如通过 configurable
或回调):
configurable
设置 HTTP 请求超时。config = {"configurable": {"timeout": 30}}
configurable
动态传递密钥(特定于某些链)。config = {"configurable": {"api_key": "your-api-key"}}
注意:
Runnable
子类可能支持额外的 config
设置,需查阅具体文档。config
的优先级:运行时 config
> 组件初始化配置 > 全局配置(如 langchain.globals
)。以下是使用 ainvoke()
方法和 config
参数的通用步骤。
pip install --upgrade langchain langchain-openai
export OPENAI_API_KEY="your-api-key"
或在代码中:
import os
os.environ["OPENAI_API_KEY"] = "your-api-key"
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.callbacks import StdOutCallbackHandler
llm = ChatOpenAI(model="gpt-3.5-turbo")
prompt = ChatPromptTemplate.from_template("回答: {input}")
chain = prompt | llm
config = {
"tags": ["ai_query"],
"metadata": {"user_id": "123"},
"callbacks": [StdOutCallbackHandler()],
"run_name": "AI_Query",
"configurable": {"timeout": 30}
}
import asyncio
result = await chain.ainvoke({"input": "什么是 AI?"}, config=config)
print(result.content)
ainvoke()
和 config
的示例以下是一个独立示例,展示如何使用 ainvoke()
方法的 config
参数配置超时和回调,优化人工智能主题的问答工作流。config
设置包括 callbacks
(记录日志)、configurable
(超时)和 metadata
(用户追踪)。
准备环境:
export OPENAI_API_KEY="your-api-key"
pip install --upgrade langchain langchain-openai
代码:
import asyncio
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableLambda
from langchain_core.output_parsers import StrOutputParser
from langchain_core.callbacks import StdOutCallbackHandler
# 初始化 ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)
# 定义提示模板
prompt = ChatPromptTemplate.from_template(
"你是一个人工智能专家,回答问题:{input}\n回答:"
)
# 定义输出解析器
parser = StrOutputParser()
# 创建工作流
chain = (
RunnableLambda(lambda x: x.strip()) | prompt | llm | parser
)
# 定义 config
config = {
"tags": ["ai_query", "test"],
"metadata": {"user_id": "123", "session_id": "abc"},
"callbacks": [StdOutCallbackHandler()],
"run_name": "AI_Query",
"configurable": {"timeout": 30}
}
# 测试 ainvoke 和 config 设置
async def main():
print("测试 ainvoke 和 config 设置:")
try:
question = "人工智能是什么?"
result = await chain.ainvoke(question, config=config)
print(f"\n输入问题: {question}")
print(f"回答: {result}")
except Exception as e:
print(f"错误: {e}")
# 运行异步主函数
if __name__ == "__main__":
asyncio.run(main())
输出示例(实际输出取决于模型和网络):
测试 ainvoke 和 config 设置:
[StdOutCallbackHandler] Started run AI_Query
[StdOutCallbackHandler] Processing prompt...
[StdOutCallbackHandler] Completed run AI_Query
输入问题: 人工智能是什么?
回答: 人工智能(AI)是计算机科学的一个分支,旨在模拟人类智能,如学习、推理和问题解决。
ChatOpenAI
调用 gpt-3.5-turbo
,设置 temperature=0.7
。RunnableLambda
清理输入。prompt
、llm
和 parser
形成 LCEL 链。tags
: 标记为 "ai_query"
和 "test"
。metadata
: 记录 user_id
和 session_id
。callbacks
: 使用 StdOutCallbackHandler
打印日志。run_name
: 设置为 "AI_Query"
。configurable
: 设置超时为 30 秒。ainvoke
异步调用,传入 config
。try-except
捕获 API 或链错误。运行要求:
export OPENAI_API_KEY="your-api-key"
pip install --upgrade langchain langchain-openai
https://api.openai.com
.OPENAI_API_KEY
已设置:echo $OPENAI_API_KEY
llm = ChatOpenAI(api_key="your-api-key")
config
覆盖组件初始化配置:config = {"configurable": {"timeout": 60}}
result = await chain.ainvoke(input, config=config)
langchain.globals
)优先级最低。BaseCallbackHandler
:from langchain_core.callbacks import BaseCallbackHandler
class CustomCallback(BaseCallbackHandler):
def on_chain_start(self, serialized, inputs, **kwargs):
print("链开始")
config = {"callbacks": [CustomCallback()]}
from langchain.callbacks import LangSmithCallbackHandler
config = {"callbacks": [LangSmithCallbackHandler()]}
configurable
:config = {"configurable": {"timeout": 15}}
max_concurrency
:config = {"max_concurrency": 3}
abatch
:results = await chain.abatch([input1, input2], config=config)
configurable
:print(config["configurable"])
config = {"configurable": {"timeout": 60}}
print(config["callbacks"])
handler = StdOutCallbackHandler()
handler.on_chain_start({}, {"input": "测试"})
print(chain.input_schema)
Q1:如何设置超时?
A:通过 configurable
:
config = {"configurable": {"timeout": 30}}
result = await chain.ainvoke(input, config=config)
Q2:如何记录执行时间?
A:使用自定义回调:
from time import time
from langchain_core.callbacks import BaseCallbackHandler
class TimingCallback(BaseCallbackHandler):
def on_chain_start(self, serialized, inputs, **kwargs):
self.start = time()
def on_chain_end(self, outputs, **kwargs):
print(f"执行耗时: {time() - self.start:.2f} 秒")
config = {"callbacks": [TimingCallback()]}
Q3:如何与代理结合?
A:传递 config
给代理:
from langchain.agents import initialize_agent, AgentType
agent = initialize_agent(tools=[tool], llm=llm, agent=AgentType.OPENAI_FUNCTIONS)
result = await agent.ainvoke({"input": "任务"}, config=config)
Q4:如何支持开源模型?
A:使用 ChatOllama
:
from langchain_ollama import ChatOllama
llm = ChatOllama(model="llama3")
chain = prompt | llm | parser
result = await chain.ainvoke(question, config=config)
ainvoke()
方法的 config
参数(RunnableConfig
)支持以下设置:
tags
: 任务标签,分组或过滤。metadata
: 元数据,记录上下文。callbacks
: 回调函数,监控事件。run_name
: 运行名称,便于跟踪。max_concurrency
: 并发限制,优化资源。recursion_limit
: 递归深度,防止循环。configurable
: 动态参数,如超时。