2
2
3
3
> 为了便于阅读,已生成gitbook:https://liaokong.gitbook.io/llm-kai-fa-jiao-cheng/
4
4
5
- ### 介绍
5
+ > 加了个 [ CHANGELOG] ( CHANGELOG.md ) ,更新了新的内容我会写在这里,方便之前看过的朋友快速查看新的更新内容
6
+
7
+ ## 介绍
6
8
7
9
众所周知 OpenAI 的 API 无法联网的,所以如果只使用自己的功能实现联网搜索并给出回答、总结 PDF 文档、基于某个 Youtube 视频进行问答等等的功能肯定是无法实现的。所以,我们来介绍一个非常强大的第三方开源库:` LangChain ` 。
8
10
@@ -17,9 +19,9 @@ LangChain 是一个用于开发由语言模型驱动的应用程序的框架。
17
19
18
20
> LLM 模型:Large Language Model,大型语言模型
19
21
20
- ###
22
+ ##
21
23
22
- ### 基础功能
24
+ ## 基础功能
23
25
24
26
LLM 调用
25
27
@@ -45,73 +47,73 @@ Chains
45
47
* 各种工具Chain
46
48
* LangChainHub
47
49
48
- ### 必知概念
50
+ ## 必知概念
49
51
50
52
相信大家看完上面的介绍多半会一脸懵逼。不要担心,上面的概念其实在刚开始学的时候不是很重要,当我们讲完后面的例子之后,在回来看上面的内容会一下明白很多。
51
53
52
54
但是,这里有几个概念是必须知道的。
53
55
54
- ####
56
+ ##
55
57
56
- #### Loader 加载器
58
+ ### Loader 加载器
57
59
58
60
顾名思义,这个就是从指定源进行加载数据的。比如:文件夹 ` DirectoryLoader ` 、Azure 存储 ` AzureBlobStorageContainerLoader ` 、CSV文件 ` CSVLoader ` 、印象笔记 ` EverNoteLoader ` 、Google网盘 ` GoogleDriveLoader ` 、任意的网页 ` UnstructuredHTMLLoader ` 、PDF ` PyPDFLoader ` 、S3 ` S3DirectoryLoader ` /` S3FileLoader ` 、
59
61
60
62
Youtube ` YoutubeLoader ` 等等,上面只是简单的进行列举了几个,官方提供了超级的多的加载器供你使用。
61
63
62
64
> https://python.langchain.com/en/latest/modules/indexes/document\_loaders.html
63
65
64
- ####
66
+ ###
65
67
66
- #### Document 文档
68
+ ### Document 文档
67
69
68
70
当使用loader加载器读取到数据源后,数据源需要转换成 Document 对象后,后续才能进行使用。
69
71
70
- ####
72
+ ###
71
73
72
- #### Text Spltters 文本分割
74
+ ### Text Spltters 文本分割
73
75
74
76
顾名思义,文本分割就是用来分割文本的。为什么需要分割文本?因为我们每次不管是做把文本当作 prompt 发给 openai api ,还是还是使用 openai api embedding 功能都是有字符限制的。
75
77
76
78
比如我们将一份300页的 pdf 发给 openai api,让他进行总结,他肯定会报超过最大 Token 错。所以这里就需要使用文本分割器去分割我们 loader 进来的 Document。
77
79
78
- ####
80
+ ###
79
81
80
- #### Vectorstores 向量数据库
82
+ ### Vectorstores 向量数据库
81
83
82
84
因为数据相关性搜索其实是向量运算。所以,不管我们是使用 openai api embedding 功能还是直接通过向量数据库直接查询,都需要将我们的加载进来的数据 ` Document ` 进行向量化,才能进行向量运算搜索。转换成向量也很简单,只需要我们把数据存储到对应的向量数据库中即可完成向量的转换。
83
85
84
86
官方也提供了很多的向量数据库供我们使用。
85
87
86
88
> https://python.langchain.com/en/latest/modules/indexes/vectorstores.html
87
89
88
- ####
90
+ ###
89
91
90
- #### Chain 链
92
+ ### Chain 链
91
93
92
94
我们可以把 Chain 理解为任务。一个 Chain 就是一个任务,当然也可以像链条一样,一个一个的执行多个链。
93
95
94
- ####
96
+ ###
95
97
96
- #### Agent 代理
98
+ ### Agent 代理
97
99
98
100
我们可以简单的理解为他可以动态的帮我们选择和调用chain或者已有的工具。
99
101
100
102
执行过程可以参考下面这张图:
101
103
102
104
![ image-20230406213322739] ( doc/image-20230406213322739.png )
103
105
104
- #### Embedding
106
+ ### Embedding
105
107
106
108
用于衡量文本的相关性。这个也是 OpenAI API 能实现构建自己知识库的关键所在。
107
109
108
110
他相比 fine-tuning 最大的优势就是,不用进行训练,并且可以实时添加新的内容,而不用加一次新的内容就训练一次,并且各方面成本要比 fine-tuning 低很多。
109
111
110
112
> 具体比较和选择可以参考这个视频:https://www.youtube.com/watch?v=9qq6HTr7Ocw
111
113
112
- ###
114
+ ##
113
115
114
- ### 实战
116
+ ## 实战
115
117
116
118
通过上面的必备概念大家应该已经可以对 LangChain 有了一定的了解,但是可能还有有些懵。
117
119
@@ -125,9 +127,9 @@ Youtube `YoutubeLoader` 等等,上面只是简单的进行列举了几个,
125
127
>
126
128
> 当然,如果有看不懂的也不用担心,可以继续往后看,第一次学习讲究的是不求甚解。
127
129
128
- ####
130
+ ###
129
131
130
- #### 完成一次问答
132
+ ### 完成一次问答
131
133
132
134
第一个案例,我们就来个最简单的,用 LangChain 加载 OpenAI 的模型,并且完成一次问答。
133
135
@@ -151,7 +153,7 @@ llm("怎么评价人工智能")
151
153
152
154
这时,我们就可以看到他给我们的返回结果了,怎么样,是不是很简单。
153
155
154
- #### 通过 Google 搜索并返回答案
156
+ ### 通过 Google 搜索并返回答案
155
157
156
158
接下来,我们就来搞点有意思的。我们来让我们的 OpenAI api 联网搜索,并返回答案给我们。
157
159
@@ -227,7 +229,7 @@ agent.run("What's the date today? What great events have taken place today in hi
227
229
228
230
> Chatgpt 只能给官方赚钱,而 Openai API 能给我赚钱
229
231
230
- #### 对超长文本进行总结
232
+ ### 对超长文本进行总结
231
233
232
234
假如我们想要用 openai api 对一个段文本进行总结,我们通常的做法就是直接发给 api 让他总结。但是如果文本超过了 api 最大的 token 限制就会报错。
233
235
@@ -303,7 +305,7 @@ chain.run(split_documents[:5])
303
305
304
306
` map_rerank ` : 这种一般不会用在总结的 chain 上,而是会用在问答的 chain 上,他其实是一种搜索答案的匹配方式。首先你要给出一个问题,他会根据问题给每个 document 计算一个这个 document 能回答这个问题的概率分数,然后找到分数最高的那个 document ,在通过把这个 document 转化为问题的 prompt 的一部分(问题+document)发送给 llm 模型,最后 llm 模型返回具体答案。
305
307
306
- #### 构建本地知识库问答机器人
308
+ ### 构建本地知识库问答机器人
307
309
308
310
在这个例子中,我们会介绍如何从我们本地读取多个文档构建知识库,并且使用 Openai API 在知识库中进行搜索并给出答案。
309
311
@@ -345,7 +347,7 @@ print(result)
345
347
346
348
> 关于 Openai embeddings 详细资料可以参看这个连接: https://platform.openai.com/docs/guides/embeddings
347
349
348
- #### 构建向量索引数据库
350
+ ### 构建向量索引数据库
349
351
350
352
我们上个案例里面有一步是将 document 信息转换成向量信息和embeddings的信息并临时存入 Chroma 数据库。
351
353
@@ -444,7 +446,7 @@ chain.run(input_documents=docs, question=query)
444
446
445
447
![ image-20230407001803057] ( doc/image-20230407001803057.png )
446
448
447
- #### 使用GPT3.5模型构建油管频道问答机器人
449
+ ### 使用GPT3.5模型构建油管频道问答机器人
448
450
449
451
在 chatgpt api(也就是 GPT-3.5-Turbo)模型出来后,因钱少活好深受大家喜爱,所以 LangChain 也加入了专属的链和模型,我们来跟着这个例子看下如何使用他。
450
452
@@ -532,7 +534,7 @@ chat = ChatOpenAI(streaming=True, callback_manager=CallbackManager([StreamingStd
532
534
resp = chat(chat_prompt_with_values.to_messages())
533
535
```
534
536
535
- #### 用 OpenAI 连接万种工具
537
+ ### 用 OpenAI 连接万种工具
536
538
537
539
我们主要是结合使用 ` zapier ` 来实现将万种工具连接起来。
538
540
@@ -590,7 +592,7 @@ agent.run('请用中文总结最后一封"******@qq.com"发给我的邮件。并
590
592
591
593
这只是个小例子,因为 ` zapier ` 有数以千计的应用,所以我们可以轻松结合 openai api 搭建自己的工作流。
592
594
593
- #### 一些有意思的小Tip
595
+ ### 一些有意思的小Tip
594
596
595
597
** 执行多个chain**
596
598
@@ -685,7 +687,7 @@ output_parser.parse(llm_output)
685
687
686
688
![ image-20230406000017276] ( doc/image-20230406000017276.png )
687
689
688
- #### ** 爬取网页并输出JSON数据**
690
+ ### ** 爬取网页并输出JSON数据**
689
691
690
692
有些时候我们需要爬取一些结构性比较强的网页,并且需要将网页中的信息以JSON的方式返回回来。
691
693
@@ -734,7 +736,7 @@ print(response['output'])
734
736
我们可以看到,他很好的将格式化后的结果输出了出来
735
737
![ image-20230510234934.png] ( doc/image-20230510234934.png )
736
738
737
- #### ** 自定义agent中所使用的工具**
739
+ ### ** 自定义agent中所使用的工具**
738
740
739
741
``` python
740
742
from langchain.agents import initialize_agent, Tool
@@ -801,7 +803,7 @@ ai_response = chat(history.messages)
801
803
print (ai_response)
802
804
```
803
805
804
- #### ** 使用 HuggingFace 模型**
806
+ ### ** 使用 HuggingFace 模型**
805
807
806
808
使用 HuggingFace 模型之前,需要先设置环境变量
807
809
@@ -858,7 +860,7 @@ print(llm_chain.run(question))
858
860
* 可以使用本地的 GPU
859
861
* 有些模型无法在 HuggingFace 运行
860
862
861
- #### ** 通过自然语言执行SQL命令**
863
+ ### ** 通过自然语言执行SQL命令**
862
864
863
865
我们通过 ` SQLDatabaseToolkit ` 或者 ` SQLDatabaseChain ` 都可以实现执行SQL命令的操作
864
866
@@ -896,7 +898,7 @@ db_chain.run("How many employees are there?")
896
898
897
899
[ https://python.langchain.com/en/latest/modules/chains/examples/sqlite.html ] ( https://python.langchain.com/en/latest/modules/chains/examples/sqlite.html )
898
900
899
- ### 总结
901
+ ## 总结
900
902
901
903
所有的案例都基本已经结束了,希望大家能通过这篇文章的学习有所收获。这篇文章只是对 LangChain 一个初级的讲解,高级的功能希望大家继续探索。
902
904
0 commit comments