课程链接:https://learn.deeplearning.ai/courses/functions-tools-agents-langchain/lesson/rtwb1/introduction
github链接:https://github.com/MSzgy/Functions-Tools-and-Agents-with-LangChain
Introduction
下面是本课程介绍:
OpenAI Function Calling
Just see code in github
LangChain Expression Language(LCEL)
下图介绍了LangChain中的一些组件:
在这里,LangChain代码采用了运算符重载方式进行流程处理:
在 Python 中,类似 chain = prompt | model | output_parser
的语法是通过 运算符重载(Operator Overloading) 实现的。这种写法通常出现在某些库或框架中(如 LangChain
),用于将多个对象按顺序连接成一个处理管道(Pipeline),类似于 Unix 的管道符 |
的链式操作。
---
### 核心机制:运算符重载
Python 允许自定义类通过实现 __or__
或 __ror__
方法,重载 |
运算符的行为。当使用 a | b
时,Python 会隐式调用:
- a.__or__(b)
,或者
- b.__ror__(a)
(如果 a
没有实现 __or__
)
通过这种方式,不同的组件(如 prompt
、`model`、`output_parser`)可以组合成一个链式结构。
---
### 示例:自定义类实现 |
管道
假设我们有三个类 Prompt
、`Model` 和 OutputParser
,可以通过以下方式实现链式语法:
```python
class PipelineComponent:
def __or__(self, other):
# 返回一个新的组合对象
return Chain(self, other)
class Chain:
def __init__(self, head, tail):
self.head = head
self.tail = tail
def run(self, input):
result = self.head.process(input)
return self.tail.run(result)
class Prompt(PipelineComponent):
def process(self, input):
return f"Formatted prompt: {input}"
class Model(PipelineComponent):
def process(self, input):
return f"Model output for {input}"
class OutputParser(PipelineComponent):
def process(self, input):
return f"Parsed: {input.upper()}"
# 使用 | 组合管道
chain = Prompt() | Model() | OutputParser()
output = chain.run("Hello")
print(output) # Parsed: MODEL OUTPUT FOR FORMATTED PROMPT: HELLO
```
---
### 实际应用场景
在机器学习/自然语言处理库(如 LangChain
)中,这种语法常用于构建处理流程:
1. `prompt`:将输入转换为模型需要的格式。
2. `model`:调用模型生成结果。
3. `output_parser`:解析模型的原始输出。
例如,在 LangChain
中的典型用法:
```python
from langchain import PromptTemplate, LLMChain, OutputParser
prompt = PromptTemplate(...)
model = LLMChain(...)
output_parser = OutputParser(...)
chain = prompt | model | output_parser
result = chain.invoke({"input": "What is AI?"})
```
---
### 为什么这样设计?
1. 可读性:链式语法直观表达数据流动方向。
2. 灵活性:自由组合不同组件,类似函数式编程。
3. 扩展性:方便添加/移除处理步骤。
---
### 总结
这种语法不是 Python 的原生语法,而是通过 运算符重载 实现的链式调用设计模式。它在需要构建复杂处理流程的库(如 LangChain
、`scikit-learn` 管道)中非常常见,能够显著提升代码的可读性和模块化程度。
OpenAI Function Calling in LangChain
Tagging and Extraction
Tools and Routing
在本节介绍了两个工具调用:weather search 以及维基搜索,并且可以通过询问的问题决定该调用哪个tool,同时langchain也实现了可以区分正常LLM返回以及tool调用两种情况。
Conversational Agent
在本节代码中有个关键词agent_cratchpad需要解释下,这是用来存储和管理对话期间所需信息的地方。
本节代码中实现了UI可以进行聊天并调用tools。