课程链接: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。