-
Notifications
You must be signed in to change notification settings - Fork 1
/
langchain_arch.qmd
288 lines (195 loc) · 7.47 KB
/
langchain_arch.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
---
title: "chatGPT"
subtitle: "LangCahin 아키텍쳐"
author:
- name: 이광춘
url: https://www.linkedin.com/in/kwangchunlee/
affiliation: 한국 R 사용자회
affiliation-url: https://github.com/bit2r
title-block-banner: true
#title-block-banner: "#562457"
format:
html:
css: css/quarto.css
theme: flatly
code-fold: false
code-overflow: wrap
toc: true
toc-depth: 3
toc-title: 목차
number-sections: true
highlight-style: github
self-contained: false
filters:
- lightbox
- custom-callout.lua
lightbox: auto
link-citations: true
knitr:
opts_chunk:
message: false
warning: false
collapse: true
comment: "#>"
R.options:
knitr.graphics.auto_pdf: true
editor_options:
chunk_output_type: console
---
# 작업흐름
AI 앱 개발은 전통적으로 검증된 개발방법론에 기반한다.
한가지 중요한 점은 거대언어모형(LLM)이 엔진으로 중요한 역할을 수행한다.
비유를 하자면 운영체제 UNIX에 비견된다. 강력한 데이터 기반 LLM 엔진을 바탕으로
다양한 고성능 AI 앱 개발이 가능하다.
::: {.panel-tabset}
## 폭포수 모형 {.unnumbered}
```{mermaid}
graph TD
A[요구사항] --> B[아키텍쳐/디자인]
B --> C[구현]
C --> D[검증/테스트]
D --> E[유지보수]
```
## V-모형 {.unnumbered}
![](images/langchain_v_cycle.png)
## 스크럼 {.unnumbered}
![](images/langcahin_agile.png)
## 기계학습 개발 {.unnumbered}
:::{#fig-ml layout-ncol=2}
![](images/machine_learning_workflow.gif)
![](images/machine_learning_workflow.jpg)
:::
## AI 앱 개발 {.unnumbered}
![](images/chatGPT_app_workflow.jpg)
:::
# 거대언어모형
거대언어모형(LLM)을 중심으로 다양한 생태계가 생겨나고 소멸하고 있다.
가장 먼저 포문을 연 OpenAI 챗GPT는 GPT-3.5/4 LLM을 챗 인터페이스와 API 서비스를 통해
생성형 AI 시장을 열었으며 First Mover의 잇점을 최대한 이용하는 전략을 구사하고 있다.
뒤를 이어 메타(페이스북)는 LLaMA를 비상업적 라이선스 제약을 두기는 했지만 오픈소스
소프트웨어 형태로 시장에 풀어 다양한 LLM 모형이 개발되도록 생태계를 확대하고 있다.
구글은 기존 T5/FLAN-T5에 이어 바드(Bard)를 출시하여 마이크로소프트/OpenAI에 맞서고 있다.
그외 Eleuther.ai GPT-J-6B, 데이터브릭스 돌리, H2O.ai h2oGPT 등 GPT 계열 LLM이 대거 출시되고 있다.
![](images/LLM_sLLM.jpg)
# LangChain
랭체인(LangChain) 대규모 언어 모델(LLM)로 구동되는 애플리케이션을 만들기 위한 프레임워크 중 하나로 랭체인을 사용하면 NLP 전문가가 아니더라도 이전에는 어렵고 광범위한 전문 지식이 필요했던 AI 앱을 쉽게 개발할 수 있다. [@opl2023]
::: {.panel-tabset}
### 랭체인 컴포넌트 {.unnumbered}
![](images/chatGPT_langcahin.jpg)
### OPL 프레임워크 {.unnumbered}
![](images/chatGPT_opl_framework.webp)
### OPL 개발사례 {.unnumbered}
![](images/chatGPT_opl_dataflow.webp)
:::
# 헬로월드
## 환경설정
[LangChain](https://python.langchain.com/en/latest/index.html) 에서 OpenAI chatGPT를 호출하여 원하는 작업을 수행한다. 먼저 `openai`와 `langchain`을 설치한다.
```{python}
#| eval: false
!pip3 install openai langchain
```
`OPENAI_API_KEY`를 환경변수를 넣어두고 `OpenAI()` 함수에서 호출하여 사용할 수 있도록 한다.
```{python}
import os
from langchain.llms import OpenAI
os.environ['OPENAI_API_TOKEN'] = os.environ.get('OPENAI_API_KEY')
```
## 농담
그리고 나서, 농담으로 헬로월드를 찍어본다. `model_name`을 비롯한 인수를
응답속도, 정확도, 간결함, 창의성, 비용 등을 고려하여 지정하여 원하는 결과를 얻어낸다.
```{python}
llm = OpenAI(model_name="text-davinci-003", n=1, temperature=0.9)
llm("재미있는 농담해 주세요")
```
3개 농담을 뽑아보자.
```{python}
llm_result = llm.generate(["재미있는 농담해 주세요"]*3)
llm_jokes = llm_result.generations
llm_jokes
```
## 프롬프트 템플릿
프롬프트 템플릿을 작성하여 해당 작업을 수행토록 지시할 수 있다.
예를 들어 회사명을 작명하는데 대표적으로 잘 작명된 회사명을 제시하고
제약 조건을 추가로 둔 후 회사명 작명지시를 수행시킬 수 있다.
### 영문
랭체인 문서에 나와있는 예제를 사용해서 `PromptTemplate`으로 프롬프트를 완성해보자.
```{python}
from langchain import PromptTemplate
template = """
I want you to act as a naming consultant for new companies.
Here are some examples of good company names:
- search engine, Google
- social media, Facebook
- video sharing, YouTube
The name should be short, catchy and easy to remember.
What is a good name for a company that makes {product}?
"""
prompt = PromptTemplate(
input_variables = ["product"],
template = template,
)
socks_prompt = prompt.format(product="colorful socks")
```
```{r}
library(reticulate)
socks_prompt_chr <- py$socks_prompt
cat(socks_prompt_chr)
```
앞서 프롬프트 템플릿을 지정한 후 실행을 통해 원하는 회사명 작명 작업을 수행시킨다.
```{python}
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt)
print(chain.run("colorful socks"))
```
### 국문
앞서 제작된 영문회사 작명 템플릿을 번역하여 국내 몇가지 회사를 사례로 넣어 chatGPT에 작업을 지시한다.
```{python}
k_template = """
신규 회사명을 작명하는 컨설턴트로 활동해 주셨으면 합니다.
다음은 좋은 회사 이름 몇 가지 사례입니다:
- 케이티, 통신
- 놀부, 외식프랜차이즈
- 율도국, 브랜드제작
- 크몽, 아웃소싱 플랫폼
이름은 짧고 눈에 잘 띄며 기억하기 쉬워야 합니다.
{k_product} 제품을 잘 만드는 회사의 좋은 이름은 무엇인가요?
"""
k_prompt = PromptTemplate(
input_variables = ["k_product"],
template = k_template,
)
k_socks_prompt = k_prompt.format(k_product="양말")
```
앞서 프롬프트 템플릿을 지정한 후 실행을 통해 원하는 회사명 작명 작업을 수행시킨다.
```{python}
from langchain.chains import LLMChain
k_chain = LLMChain(llm = llm, prompt = k_prompt)
k_socks_result = k_chain.run("양말")
```
```{r}
cat(py$k_socks_result)
```
## 요약
[[openAI Tokenizer](https://platform.openai.com/tokenizer)]{.aside}
한글은 영어에 비해 토큰 크기가 크다.
이를 위해서 `text-davinci-003` 모델이 소화할 수 있는 토큰보다 크기를 줄여야한다.
대한민국 대통령 취임사 중 박근혜 대통령 취임사에서 대략 2,000 토큰 크기를 대상으로
문서 요약을 수행해보자.
```{python}
#| eval: false
from langchain import OpenAI, PromptTemplate, LLMChain
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains.mapreduce import MapReduceChain
from langchain.prompts import PromptTemplate
llm = OpenAI(temperature=0)
text_splitter = CharacterTextSplitter()
with open('data/state_of_the_union.txt') as f:
# with open('data/취임사.txt') as f:
inaugural_address = f.read()
texts = text_splitter.split_text(inaugural_address)
from langchain.docstore.document import Document
docs = [Document(page_content=t) for t in texts[:]]
from langchain.chains.summarize import load_summarize_chain
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)
```