Langchain基础
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@tooldef add( a: Annotated[int, …, “First integer”], b: Annotated[int, …, “Second integer”] ) -> int: “”“Add two integers.”“” return a + b 使⽤StructuredTool类提供的函数创建⼯具 加入response_format配置来让工具区分消息内容(content)和其他工件 为了将这些工具绑定到定义的模型,可以使用模型的bind_tools()`
@tooldef 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) 将自动返回一个ToolMessagemessages = [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:可以自己定义一个类,核心能力就是捕捉键名拼写错误与类型错误
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐




所有评论(0)