Runable定义了一个标准接口,允许Runable组件

  • Invoked(调用):单个输入转换为输出
  • Batched(批处理):多个输入背有效地转换为输出
  • Streamed(流式传输):输出在生成时进行流式传输
  • Inspected(检查):可以访问有关Runbable的输入,输出和配置的原理图信息
  • Compised(组合):可以组合多个Runnable,以使用LCEL协同工作
    LCEL:其实时一种编排解决方法,它使得Langchain能够以优化的方式处理链的运行时执行。任何连个Runnable实例都可以“链”在一起成序列,方法就是使用:| (管道/运算符)
    例: chain = model | parser,也可以使用.pipe方法代替chain = model.pipe(parser) 而init_chat_model()`是一个工厂函数,可以初始化多种支持的聊天模型

工具

LLM本质上是封闭的只是系统,而为了具备与外部世界交互的能力引入工具调用
在Langchain中实现了一个@tool装饰器来创建工具
工具Schema从函数名,类型提示和文档字符串中获取相关属性以此来声明一个工具
模式1:@tool(args_schema=自己定义的) 依赖Pydantic类使用args_schema参数
模式2:依赖Annotated和文档字符串在内部传递给工具Scheme
@tool
def add( a: Annotated[int, …, “First integer”], b: Annotated[int, …, “Second integer”] ) -> int: “”“Add two integers.”“” return a + b 使⽤StructuredTool类提供的函数创建⼯具 加入response_format配置来让工具区分消息内容(content)和其他工件 为了将这些工具绑定到定义的模型,可以使用模型的bind_tools()`

@tool
def add( a: Annotated[int, …, “First integer”], b: Annotated[int, …, “Second integer”] ) -> int: “”“Add two integers.”“” return a + b @tool def multiply(
a: Annotated[int, ..., "First integer"],
b: Annotated[int, ..., "Second integer"]
) -> int:
"""Add two integers."""
return a + b
#绑定⼯具 tools = [add, multiply]
model_with_tools = model.bind_tools(tools) # 调⽤⼯具 result = model_with_tools.invoke(“9乘6等于多少?”)
print(result)
工具调用的关键原则是模型根据输入的相关性决定何时使用工具,模型并不总是需要调用工具的,例如给定一个不相关的输入,模型不会调用该工具。
与此同时我们仅仅只是成功调用了工具,还需要将工具输出传输构造成 ToolMessage再传
我们可以使用 tool.invoker(tool_calls) 将自动返回一个ToolMessage
messages = [
HumanMessage("9乘6等于多少?5加3等于多少?")
]
第一次调用模型,获取工具调用指令
ai_msg = model_with_tools.invoke(messages)
messages.append(ai_msg)
遍历执行工具调用
for tool_call in ai_msg.tool_calls:
//根据工具名选择对应的工具函数
selected_tool = {"add": add, "multiply": multiply}
[tool_call["name"].lower()]
tool_msg = selected_tool.invoke(tool_call)
messages.append(tool_msg)
print(messages)
二次请求模型,汇总结果
result = model.invoke(messages)
print(result)
常用的工具类TavilySearch(搜索)

聊天模型的额外功能:结构化输出

我们调用聊天模型得到的是一个AIMessage,其内容是一个字符串,对程序很不友好
witg_structured_output方法则允许我们预先定义一个期望的数据结构,然后要求大模型必须按照这个结构返回信息。
with_structured_output(
schema: dict[str, Any] | type[_BM] | type | None = None,
*,
method: Literal['function_calling', 'json_mode', 'json_schema'] =
' json_schema',
include_raw: bool = False,
strict: bool | None = None,
**kwargs: Any,
) → Runnable[PromptValue | str | Sequence[BaseMessage | list[str] |
tuple[str, str] | str | dict[str, Any]], dict | _BM]

  • scheme:表示输出结构。可以为JSON,TypeDict,Pydantic等
  • method:表示LLM的生成方法
  • include_raw:false(默认),进输出解析的结构化输出;True则返回原始模型响应
  • strict:True则保证模型输出与schema完全匹配
    返回值类型
  • Pydantic:Langchain会提取出代表Pydantic参数的JSON对象,用Pydantic模型 对其进⾏解析和验证,将这个验证后的JSON转换为⼀个可⽤的Pydantic对象实例返回
  • TypediDict:可以自己定义一个类,核心能力就是捕捉键名拼写错误与类型错误
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐