【langchain库名解析】
目录
一、from langchain_openai import ChatOpenAI
1. 核心功能
2. 典型使用场景
场景 1:直接生成对话回复
场景 3:流式输出(逐词显示结果)
3. 与其他 LangChain 组件的协同
结合提示模板(PromptTemplate)
结合记忆模块(ConversationBufferMemory)
4. 关键参数说明
5. 与直接调用 OpenAI API 的区别
二、from langchain_core.tools import tool
1. 核心用途
2. 基础用法示例
定义工具
通过 Agent 调用工具
3.典型应用场景
4. 核心参数解析
5. 与直接调用函数的区别
三、from langchain.tools.render import render_text_description
1. 核心功能
2.使用示例
3. 高级用法
自定义参数描述
4. 在Agent提示模板中的应用
5. 与其他渲染方法的对比
关键参数说明
四、from langchain_core.output_parsers.json import JsonOutputParser
1、核心功能
2、典型使用场景
3.注意事项
4.总结
五、from langchain_core.tools import tool
1.核心用途
2.示例代码
3.适用场景
六、from langchain.prompts.example_selector import LengthBasedExampleSelector
1、核心功能
2、工作原理
3、关键配置参数
4、典型应用场景
一、from langchain_openai import ChatOpenAI
1. 核心功能
功能 | 说明 |
---|---|
模型调用 | 封装 OpenAI 的聊天模型 API,简化调用流程(如身份验证、参数传递) |
对话管理 | 支持多轮对话的上下文管理(需结合 Memory 模块) |
结构化输入/输出 | 处理消息的格式(如系统指令、用户输入、AI回复的区分) |
流式响应 | 支持逐步获取生成结果(streaming),提升实时交互体验 |
参数控制 | 调整生成参数(如 temperature 、max_tokens 、top_p ) |
2. 典型使用场景
场景 1:直接生成对话回复
from langchain_openai import ChatOpenAI# 初始化模型(需设置环境变量 OPENAI_API_KEY)
chat = ChatOpenAI(model="gpt-3.5-turbo")# 生成回复
response = chat.invoke("你好!")
print(response.content) # 输出:你好!有什么可以帮助你的吗?
场景 2:多轮对话(结合 SystemMessage
和 HumanMessage
)
from langchain_core.messages import SystemMessage, HumanMessage# 定义系统角色指令
messages = [SystemMessage(content="你是一个专业的技术文档翻译助手"),HumanMessage(content="请将 'API Gateway' 翻译成中文")
]# 调用模型
response = chat.invoke(messages)
print(response.content) # 输出:API 网关
场景 3:流式输出(逐词显示结果)
chat = ChatOpenAI(model="gpt-4", streaming=True)for chunk in chat.stream("请解释量子计算"):print(chunk.content, end="", flush=True)
# 输出逐词显示:量子计算是一种利用量子力学原理...
3. 与其他 LangChain 组件的协同
结合提示模板(PromptTemplate
)
from langchain_core.prompts import ChatPromptTemplate# 定义模板
template = ChatPromptTemplate.from_messages([("system", "你是一个{speaker}"),("human", "{query}")
])# 绑定模型生成链
chain = template | chat# 调用链
response = chain.invoke({"speaker": "诗人", "query": "写一首关于春天的诗"})
print(response.content)
结合记忆模块(ConversationBufferMemory
)
from langchain.memory import ConversationBufferMemorymemory = ConversationBufferMemory()
memory.save_context({"input": "你好"}, {"output": "你好!我是AI助手"})
memory.save_context({"input": "你会编程吗"}, {"output": "我会用Python写代码"})# 从记忆加载历史对话
messages = memory.load_memory_variables({})["history"]
response = chat.invoke(messages + [HumanMessage(content="你擅长什么语言?")])
print(response.content) # 输出:我擅长使用Python编程。
4. 关键参数说明
参数 | 类型 | 默认值 | 作用 |
---|---|---|---|
model | str | "gpt-3.5-turbo" | 指定模型版本(如 "gpt-4") |
temperature | float | 0.7 | 控制生成随机性(0-2,值越大越随机) |
max_tokens | int | None | 限制生成的最大 token 数量 |
streaming | bool | False | 是否启用流式输出 |
openai_api_key | str | None | 手动指定 API 密钥(优先从环境变量读取) |
5. 与直接调用 OpenAI API 的区别
对比项 | LangChain 的 ChatOpenAI | 直接调用 OpenAI API |
---|---|---|
代码复杂度 | 高度封装,简化调用逻辑 | 需要手动处理 HTTP 请求和响应解析 |
扩展性 | 可无缝接入 LangChain 的链、代理、记忆等模块 | 需自行实现上下文管理、工具集成等功能 |
适用场景 | 快速构建复杂应用(如带记忆的对话机器人) | 简单的一次性请求或原型验证 |
快速接入 OpenAI 模型:无需处理底层 API 细节
构建模块化应用:轻松结合提示工程、记忆管理、外部工具
实现复杂交互逻辑:如多轮对话、流式响应、参数动态调整
二、from langchain_core.tools import tool
主要作用是通过 装饰器 将普通 Python 函数快速转化为 LangChain 框架可识别的 工具(Tool),使 AI 代理(Agent)能够动态调用这些函数。
1. 核心用途
用途 | 说明 |
---|---|
扩展代理能力 | 将自定义函数(如搜索、计算、数据库操作)封装为工具,供代理调用 |
标准化接口 | 统一工具的描述、参数格式,便于代理理解和使用 |
集成到工作流 | 工具可被嵌入到 Agent 的决策链中,实现自动化任务分解和执行 |
2. 基础用法示例
定义工具
from langchain_core.tools import tool@tool
def search_weather(city: str) -> str:"""根据城市名称查询实时天气(示例函数,实际需调用API)"""# 假设这里调用真实天气API(如OpenWeatherMap)return f"{city}:晴,25℃"# 工具会自动生成名称和描述,供Agent理解其功能
print(search_weather.name) # 输出:search_weather
print(search_weather.description)
# 输出:search_weather(city: str) -> str - 根据城市名称查询实时天气(示例函数,实际需调用API)
通过 Agent 调用工具
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_openai import ChatOpenAI# 定义工具列表
tools = [search_weather]# 初始化模型和Agent
model = ChatOpenAI(model="gpt-3.5-turbo")
agent = create_tool_calling_agent(model, tools)
agent_executor = AgentExecutor(agent=agent, tools=tools)# 执行任务
result = agent_executor.invoke({"input": "上海现在的天气怎么样?"
})
print(result["output"]) # 输出:上海:晴,25℃
3.典型应用场景
场景 | 工具示例 | 说明 |
---|---|---|
数据查询 | 天气/股票/航班查询工具 | 将 API 调用封装为 Agent 可操作的工具 |
业务系统集成 | 订单查询、CRM数据更新 | 连接企业内部系统 |
数学计算 | 计算器、单位转换工具 | 解决数值处理需求 |
内容生成辅助 | 图片生成、文本摘要 | 扩展生成式 AI 的功能边界 |
4. 核心参数解析
参数 | 类型 | 作用 |
---|---|---|
name | str | 自定义工具名称(默认使用函数名) |
description | str | 工具的功能描述(Agent 根据此决定是否调用) |
args_schema | Pydantic Model | 定义参数结构和校验规则 |
return_direct | bool | 是否绕过 Agent 直接返回结果(适用于无需后续处理的工具) |
5. 与直接调用函数的区别
对比项 | 使用 @tool 封装的工具 | 直接调用普通函数 |
---|---|---|
调用方式 | 通过 Agent 自动决策调用 | 需显式编写调用代码 |
上下文感知 | 可结合对话历史、用户意图动态触发 | 静态逻辑,无法自适应 |
错误处理 | 支持 Agent 自动重试或选择替代工具 | 需手动实现异常处理 |
可扩展性 | 轻松添加/移除工具,无需修改核心逻辑 | 需重构代码以适应新功能 |
-
快速扩展 Agent 能力:将任意功能转化为 AI 可调用的工具
-
构建自动化工作流:Agent 根据问题自动选择并组合工具
-
降低系统耦合度:工具独立开发,通过标准化接口集成
适合需要 动态任务分解 的场景(如客服系统自动选择查订单、查物流等工具)。
三、from langchain.tools.render import render_text_description
核心作用是将 工具列表(Tools) 转换为 自然语言描述文本,主要用于 生成Agent的系统提示词,帮助大语言模型理解可用工具的功能和调用方式。
1. 核心功能
功能 | 说明 |
---|---|
工具描述格式化 | 将工具的 name 、description 、args 等元数据转换为易读的文本格式 |
提示工程优化 | 生成标准化的工具说明文本,嵌入到Agent的提示模板中,提升工具调用准确性 |
调试与日志 | 以友好格式输出工具信息,便于开发者检查工具注册情况 |
2.使用示例
from langchain_core.tools import tool
from langchain.tools.render import render_text_description#一、定义工具
@tool
def add(a:int,b:int)->int:"""计算加法"""return a+b@tool
def mul(a:int,b:int)->int:"""计算乘法"""return a*b@tool
def dele(a:int,b:int)->int:"""计算减法"""return a-b@tool
def get_weather(location:str,unit:str)->str:"""获取指定地区天气参数:location:地区名称unit:温度单位返回:str:描述当前天气和温度"""return f"{location}的天气20{unit}"#二、注册和管理工具
tools=[add,mul,dele,get_weather]#三、构建工具条件和调用描述
render_tools=render_text_description([add,mul,dele,get_weather])
print(render_tools)
运行结果:
add(a: int, b: int) -> int - 计算加法
mul(a: int, b: int) -> int - 计算乘法
dele(a: int, b: int) -> int - 计算减法
get_weather(location: str, unit: str) -> str - 获取指定地
区天气参数:
location:地区名称
unit:温度单位返回:
str:描述当前天气和温度
3. 高级用法
自定义参数描述
通过 Pydantic 模型增强参数说明:
from pydantic import BaseModel, Fieldclass WeatherArgs(BaseModel):location: str = Field(description="城市名称,如'上海'")unit: str = Field(description="温度单位,可选值:'摄氏度'或'华氏度'")@tool(args_schema=WeatherArgs)
def get_current_weather(location: str, unit: str) -> str:# 实现代码...# 渲染后参数描述会更清晰
tool_descriptions = render_text_description([get_current_weather])
print(tool_descriptions)
运行示例
get_current_weather: 获取指定位置和单位的当前天气
参数:- location (str): 城市名称,如'上海'- unit (str): 温度单位,可选值:'摄氏度'或'华氏度'
4. 在Agent提示模板中的应用
结合 SystemMessagePromptTemplate
构建完整提示:
from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate# 生成工具描述文本
tool_descriptions = render_text_description(tools)# 构建系统提示模板
system_prompt = SystemMessagePromptTemplate.from_template("你是一个智能助手,可以调用以下工具:\n\n{tools}\n\n""每次调用工具时,请严格按照参数要求提供数据。"
)# 最终提示组合
prompt = ChatPromptTemplate.from_messages([system_prompt,("user", "{input}"),
])
5. 与其他渲染方法的对比
方法 | 输出格式 | 典型应用场景 |
---|---|---|
render_text_description() | 纯文本 | Agent提示词、命令行日志 |
render_text_description_as_markdown() | Markdown | 文档生成、UI展示 |
render_tool_schemas() | JSON Schema | 结构化数据交换、前端集成 |
关键参数说明
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
tools | List[Tool] | 必填 | 需要渲染的工具列表 |
args_only | bool | False | 是否只渲染参数部分(True时隐藏工具描述,仅显示参数) |
tool_names | List[str] | None | 指定渲染特定名称的工具(None时渲染全部) |
使用 render_text_description
可实现:
-
工具能力可视化:将代码中的工具定义转化为自然语言
-
提示词标准化:确保Agent准确理解工具用途和调用方式
-
开发效率提升:快速检查工具注册状态,减少调试成本
这是构建可靠 Agent 工作流的关键步骤,尤其在需要动态管理大量工具的场景中(如插件系统)。
四、from langchain_core.output_parsers.json import JsonOutputParser
在 LangChain 中的作用是 将语言模型(LLM)输出的 JSON 格式文本解析为结构化数据(如 Python 字典或对象),以便后续程序处理。
1、核心功能
-
JSON 解析
将模型返回的 JSON 字符串(如'{"name": "Alice", "age": 30}'
)转换为 Python 字典或其他数据结构,避免手动处理字符串解析。 -
结构化输出
确保链(Chain)的最终输出是结构化数据,而非非结构化文本,便于与其他工具或 API 集成。 -
验证与兼容性
可结合 Pydantic 模型(需其他组件配合)验证 JSON 结构,确保字段和类型符合预期,若不符合会抛出错误。
2、典型使用场景
-
链式调用末尾:作为链的最后一步,解析模型的 JSON 响应。
from langchain_core.output_parsers.json import JsonOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI# 1. 创建解析器
parser = JsonOutputParser()# 2. 提示词要求模型返回 JSON
prompt = PromptTemplate(template="回答为 JSON,包含 'name' 和 'age': {question}",input_variables=["question"],
)# 3. 构建链:模型 → 解析器
chain = prompt | ChatOpenAI() | parser# 4. 调用链,获取结构化结果
result = chain.invoke({"question": "Alice 的年龄是多少?"})
# 输出: {"name": "Alice", "age": 30}
-
容错处理:若模型返回非标准 JSON(如额外文本),需额外步骤(如正则提取)预处理,再使用解析器。
3.注意事项
-
依赖模型协作:需在提示词中明确要求模型生成 JSON,否则可能解析失败。
-
错误处理:建议用
try-except
捕捉解析异常,处理格式错误。 -
高级验证:结合
PydanticOutputParser
可实现更严格的字段和类型校验。
4.总结
JsonOutputParser
简化了从语言模型获取结构化数据的过程,是构建可靠 LangChain 应用的关键组件,尤其适用于需要机器可读输出(如 API 调用、数据流水线)的场景。
五、from langchain_core.tools import tool
作用是导入一个装饰器 @tool
,它允许你将普通的 Python 函数快速转换为 LangChain 可调用的工具(Tool)。这些工具可以被 LangChain 的代理(Agent)、链(Chain)等组件直接调用,以完成特定任务(如调用 API、计算、查询等)。
1.核心用途
-
简化工具定义:通过
@tool
装饰器,无需手动编写复杂的工具类,只需装饰一个函数,即可将其集成到 LangChain 的工作流中。 -
赋予自然语言描述:工具的函数名和文档字符串会被自动解析,让语言模型(如 ChatGPT)理解工具的功能和调用方式。
2.示例代码
from langchain_core.tools import tool
'''
库名解析:langchain_core.tools
专门用于定义和管理 AI 工具(Tools),其核心作用是
让开发者能够轻松创建、描述和集成可被大型语言模型
(LLM)调用的功能模块1. 工具标准化定义
通过 @tool 装饰器,将普通 Python 函数转化为 LangChain 工具自动生成工具元数据,包括:名称(函数名)描述(函数文档字符串首段)参数结构(类型注解 + 参数描述)执行逻辑(函数本体)
'''# AI 可读的接口
@tool
def multiply(first_int: int, second_int: int) -> int:"""对两个整数进行乘法运算"""return first_int * second_int@tool
def add(first_int: int, second_int: int) -> int:"""对两个整数进行加法运算"""return first_int + second_int@tool
def get_current_weather(location: str, unit: str) -> str:"""获取指定位置和单位的当前天气参数:location (str): 位置的名称unit (str): 温度单位(例如:摄氏度、华氏度)返回:str: 描述当前天气和温度的字符串"""return f"It's 20 {unit} in {location}"#工具注册与管理
tools = [multiply, add, get_current_weather]print("\n名称1: ", multiply.name)
print("描述1: ", multiply.description)
print("参数1: ", multiply.args)print("\n名称2: ", add.name)
print("描述2: ", add.description)
print("参数2: ", add.args)print("\n名称3: ", get_current_weather.name)
print("描述3: ", get_current_weather.description)
print("参数3: ", get_current_weather.args)'''
完整属性结构:
基础元数据:name、description
参数配置:args(简化参数列表)、args_schema(详细结构)
执行控制:return_direct
模式描述:schema(兼容 OpenAI 函数调用格式)
运行时方法:run()、arun()
'''
运行结果
名称1: multiply
描述1: 对两个整数进行乘法运算
参数1: {'first_int': {'title': 'First Int', 'type': 'integer'}, 'second_int': {'title': 'Second Int', 'type': 'integer'}}名称2: add
描述2: 对两个整数进行加法运算
参数2: {'first_int': {'title': 'First Int', 'type': 'integer'}, 'second_int': {'title': 'Second Int', 'type': 'integer'}}名称3: get_current_weather
描述3: 获取指定位置和单位的当前天气参数:
location (str): 位置的名称
unit (str): 温度单位(例如:摄氏度、华氏度)返回:
str: 描述当前天气和温度的字符串
参数3: {'location': {'title': 'Location', 'type': 'string'}, 'unit': {'title': 'Unit', 'type': 'string'}}
3.适用场景
-
快速将现有函数(如数据库查询、API 调用)接入 LangChain 代理。
-
构建自定义工具扩展代理的能力(例如:股票查询、邮件发送等)。
如果需要更复杂的工具(如异步调用、自定义错误处理),可以继承 BaseTool
类手动实现,但 @tool
装饰器在简单场景下更高效。
六、from langchain.prompts.example_selector import LengthBasedExampleSelector
用于 动态优化提示长度 的核心工具,其核心功能是通过智能选择示例数量,确保提示文本不超过大语言模型的上下文窗口限制。
1、核心功能
-
动态示例裁剪
根据用户输入的实时长度,自动调整包含的示例数量:- 短输入:加载更多示例(如输入“happy”时加载全部5个示例)
- 长输入:减少示例数量(如输入超长句子时仅保留1个示例)
原理:通过计算输入长度 + 示例渲染长度
是否超过max_length
阈值,动态筛选示例。
-
防止上下文溢出
避免因示例过多导致提示文本被截断,确保模型接收完整信息。
example_selector = LengthBasedExampleSelector(examples=examples,example_prompt=example_prompt,max_length=25 # 总字符数限制
)
超过该阈值时,系统会从后向前剔除示例。
2、工作原理
-
示例渲染计算
将每个示例通过example
模板格式化为字符串,计算其字符总数。例如:
# 示例模板
template="Input: {input}\nOutput: {output}" # 单示例渲染后约20字符
2.动态选择算法
- 优先保留与当前输入长度互补的示例
- 按
输入长度 + Σ示例长度 ≤ max_length
的规则迭代选
3、关键配置参数
参数 | 作用 | 典型值 |
---|---|---|
max_length | 总字符数上限(含输入+示例) | 25-200 |
get_text_length | 自定义长度计算函数 | lambda x: len(x.split()) (按单词数) |
example_prompt | 示例格式化模板 | 需与任务逻辑匹配 |
4、典型应用场景
-
多轮问答优化
在需要展示推理过程的问答中,动态控制示例数量(如用户提供的反义词生成场景)。 -
长文本处理
处理包含复杂描述的输入时(如客服工单分类),避免示例挤占有效输入空间。 -
跨语言任务
混合不同语言示例时,通过长度控制平衡多语言信息密度。