Skip to content

Commit bc585c8

Browse files
committed
Apply review feedback to update cookbook
1 parent 2e57b52 commit bc585c8

File tree

3 files changed

+72
-28
lines changed

3 files changed

+72
-28
lines changed

notebooks/ko/_toctree.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
- local: multiagent_web_assistant
2929
title: 다중 에이전트 계층 구조에서 여러 에이전트가 협업하도록 하기
3030
- local: vector_search_agent
31-
title: 벡터 검색 에이전트-허깅페이스 허브를 백엔드로 하는 똑똑한 검색 엔진
31+
title: 벡터 검색 에이전트-허깅페이스 허브를 백엔드로 하는 지능형 검색 엔진
3232
- title: Multimodal 레시피
3333
isExpanded: false
3434
sections:

notebooks/ko/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
- [개인용 GPU에서 TRL로 SmolVLM DPO 파인튜닝하기](ko_fine_tuning_vlm_dpo_smolvlm_instruct)
1717
- [커스텀 데이터셋으로 객체 탐지 모델 파인튜닝하기, Spaces에 배포하기, 그리고 Gradio API 연동하기](fine_tuning_detr_custom_dataset)
1818
- [허깅페이스 허브를 백엔드로 사용한 벡터 검색](vector_search_with_hub_as_backend)
19-
- [벡터 검색 에이전트-허깅페이스 허브를 백엔드로 하는 똑똑한 검색 엔진](vector_search_agent)
19+
- [벡터 검색 에이전트-허깅페이스 허브를 백엔드로 하는 지능형 검색 엔진](vector_search_agent)
2020

2121
더 다양한 노트북을 확인하고 싶다면 Cookbook's [GitHub 리포지토리](https://github.com/huggingface/cookbook)에 방문해보세요.
2222

notebooks/ko/vector_search_agent.ipynb

Lines changed: 70 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,22 @@
66
"id": "ksUdu7H7qBig"
77
},
88
"source": [
9-
"# 🤖 벡터 검색 에이전트: 허깅페이스 허브를 백엔드로 하는 똑똑한 검색 엔진\n",
9+
"# 🤖 벡터 검색 에이전트: 허깅페이스 허브를 백엔드로 하는 지능형 검색 엔진\n",
1010
"\n",
1111
"_참조: [Martin Elstner](https://github.com/MartinEls)\n",
1212
"_작성자: [안정](https://github.com/ahnjj)\n",
1313
"\n",
14-
"검색엔진은 크게 키워드 검색과 벡터 검색으로 분류 됩니다. 키워드 검색과는 달리, 벡터 검색으로 진행할 경우 두가지를 고려해야합니다.\n",
14+
"검색 엔진은 크게 키워드 검색과 벡터 검색으로 나눌 수 있습니다.\n",
15+
"키워드 검색과 달리, 벡터 검색을 사용할 때는 두 가지를 고려해야 합니다.\n",
1516
"1. 적합한 임베딩 모델로 데이터셋과 쿼리를 임베딩하는 작업\n",
1617
"2. 임베딩 데이터를 처리할 수 있는 DB\n",
1718
"\n",
18-
"그러나, 임베딩값을 기반으로하는 벡터 검색만으로는 '사용자가 원하는 답변'를 보장하기 어렵습니다.\n",
19+
"하지만 임베딩 값을 기반으로 한 벡터 검색만으로는 사용자가 원하는 답변’을 보장하기 어렵습니다.\n",
1920
"\n",
20-
"따라서 검색의 각 단계에서 에이전트가 각 단계를 자율적으로 판단하고 최적화한다면 사용자가 원하는 답변에 가까운 검색 결과를 얻을 수 있을 것 같습니다!\n",
21+
"그래서 검색 과정에서 에이전트가 자율적으로 판단하고 최적화한다면, 사용자 의도에 더 가까운 검색 결과를 얻을 수 있습니다.\n",
2122
"\n",
2223
"### Agentic 접근 방식의 차별점\n",
23-
"기존 벡터검색 워크플로우\n",
24+
"기존 벡터 검색 워크플로우\n",
2425
"```\n",
2526
"데이터 ➡ 데이터 임베딩(고정 모델) ➡ 인덱스 생성 ➡ 사용자 질의 ➡ 유사도 검색 ➡ 답변\n",
2627
"```\n",
@@ -30,24 +31,45 @@
3031
"```\n",
3132
"\n",
3233
"### DuckDB?\n",
33-
"허깅페이스의 데이터셋은 파켓(parquet) 파일에 의존하는데 빠른 인메모리 데이터베이스 시스템인 [DuckDB를 사용하면 이 파일들과 상호작용](https://huggingface.co/docs/hub/en/datasets-duckdb)할 수 있습니다. 또한 DuckDB의 기능 중 하나는 [벡터 유사도 검색](https://duckdb.org/docs/extensions/vss.html)으로, 인덱스 유무에 관계없이 사용할 수 있습니다.\n",
34+
"허깅페이스의 데이터셋은 파켓(parquet) 파일을 기반으로 동작하는데, 이때 빠른 인메모리 데이터베이스 시스템인 [DuckDB를 사용하면 이 파일들과 상호작용](https://huggingface.co/docs/hub/en/datasets-duckdb)할 수 있습니다. 또한 DuckDB의 기능 중 하나는 [벡터 유사도 검색](https://duckdb.org/docs/extensions/vss.html)으로, 인덱스 유무에 관계없이 사용할 수 있습니다.\n",
3435
"\n",
3536
"\n",
3637
"이번 노트북에서는 단일 Agent에 여러가지 도구를 주어 수행하는 간단한 Agentic 벡터 검색 엔진을 만들어 보겠습니다."
3738
]
3839
},
3940
{
4041
"cell_type": "markdown",
41-
"metadata": {
42-
"id": "Old2t6dnpi3M"
43-
},
42+
"metadata": {},
4443
"source": [
45-
"# 도구정의\n",
46-
"정의할 도구는 아래와 같습니다.\n",
47-
"- 임베딩 생성 도구\n",
48-
"- 인덱스 생성 도구\n",
49-
"- 유사도 검색 도구\n",
50-
"- 답변 생성 도구"
44+
"필요한 의존성을 설치합니다 :"
45+
]
46+
},
47+
{
48+
"cell_type": "code",
49+
"execution_count": null,
50+
"metadata": {},
51+
"outputs": [],
52+
"source": [
53+
"# 본 예제 파일은 Python 3.10 이상 버전에서만 실행할 수 있습니다.\n",
54+
"!pip install -U smolagents datasets sentence-transformers duckdb openai"
55+
]
56+
},
57+
{
58+
"cell_type": "markdown",
59+
"metadata": {},
60+
"source": [
61+
"HuggingFace의 추론 API를 사용하기 위해 로그인합니다 : "
62+
]
63+
},
64+
{
65+
"cell_type": "code",
66+
"execution_count": null,
67+
"metadata": {},
68+
"outputs": [],
69+
"source": [
70+
"from huggingface_hub import notebook_login\n",
71+
"\n",
72+
"notebook_login()"
5173
]
5274
},
5375
{
@@ -60,9 +82,24 @@
6082
"source": [
6183
"from smolagents import tool\n",
6284
"from datasets import Dataset\n",
63-
"from sentence_transformers import SentenceTransformer\n",
64-
"import duckdb\n",
65-
"import openai"
85+
"import os\n",
86+
"\n",
87+
"# 도구 사용을 위해 OPENAI 키를 발급 받아야합니다.\n",
88+
"os.environ[\"OPENAI_API_KEY\"] = \"YOUR KEY\""
89+
]
90+
},
91+
{
92+
"cell_type": "markdown",
93+
"metadata": {
94+
"id": "Old2t6dnpi3M"
95+
},
96+
"source": [
97+
"# 도구 정의\n",
98+
"정의할 도구는 아래와 같습니다.\n",
99+
"- 임베딩 생성 도구\n",
100+
"- 인덱스 생성 도구\n",
101+
"- 유사도 검색 도구\n",
102+
"- 답변 생성 도구"
66103
]
67104
},
68105
{
@@ -72,7 +109,7 @@
72109
},
73110
"source": [
74111
"### 도구1 : 임베딩 생성\n",
75-
"일반적으로, 임베딩 작업에서는 작은 배치사이즈로 줄여 청킹하나 여기서는 데이터셋을 임베딩으로 바꾸기만 하겠습니다."
112+
"일반적으로, 임베딩 작업에서는 작은 배치 사이즈로 데이터를 청킹하지만 여기서는 단순히 데이터셋을 임베딩으로 변환하는 과정만 수행하겠습니다."
76113
]
77114
},
78115
{
@@ -95,11 +132,12 @@
95132
" Args:\n",
96133
" dataset: 임베딩을 생성할 대상 데이터셋\n",
97134
" model_id: 임베딩에 사용할 모델\n",
98-
" column_name: 임베딩할 컬럼 이름\n",
135+
" column_name: 임베딩할 이름\n",
99136
"\n",
100137
" Returns:\n",
101138
" 임베딩이 추가된 데이터셋\n",
102139
" \"\"\"\n",
140+
" from sentence_transformers import SentenceTransformer\n",
103141
"\n",
104142
" model = SentenceTransformer(model_id)\n",
105143
"\n",
@@ -144,7 +182,7 @@
144182
"id": "kS61lIgSAYmS"
145183
},
146184
"source": [
147-
"### 도구2 : DuckDB인덱스 만들기"
185+
"### 도구2 : DuckDB 인덱스 만들기"
148186
]
149187
},
150188
{
@@ -167,11 +205,13 @@
167205
" Args:\n",
168206
" dataset_with_embeddings: 이미 임베딩이 포함된 데이터셋\n",
169207
" table_name: 생성할 테이블 이름\n",
170-
" embedding_column: 임베딩 컬럼 이름\n",
208+
" embedding_column: 임베딩 이름\n",
171209
"\n",
172210
" Returns:\n",
173211
" None\n",
174212
" \"\"\"\n",
213+
" import duckdb\n",
214+
" \n",
175215
" # VSS 확장 설치 및 로드\n",
176216
" duckdb.sql(\"INSTALL vss; LOAD vss;\")\n",
177217
" duckdb.sql(f\"DROP TABLE IF EXISTS {table_name};\")\n",
@@ -218,7 +258,7 @@
218258
"id": "ygW649Ln0OvV"
219259
},
220260
"source": [
221-
"### 도구3: 벡터 검색 수행하기"
261+
"### 도구3 : 벡터 검색 수행하기"
222262
]
223263
},
224264
{
@@ -251,6 +291,8 @@
251291
" dict: 검색 결과\n",
252292
" \"\"\"\n",
253293
" from sentence_transformers import SentenceTransformer\n",
294+
" import duckdb\n",
295+
" \n",
254296
" model = SentenceTransformer(model_id)\n",
255297
" embedding = model.encode(query).tolist()\n",
256298
" return duckdb.sql(\n",
@@ -269,7 +311,7 @@
269311
"id": "XVT4VYknqBij"
270312
},
271313
"source": [
272-
"무거운 벡터 검색 엔진을 배포할 필요가 없고 저장소는 허브에서 처리됩니다."
314+
"무거운 벡터 검색 엔진을 따로 배포할 필요 없고, 저장소는 허브에서 처리됩니다."
273315
]
274316
},
275317
{
@@ -278,7 +320,7 @@
278320
"id": "AQf6IxFGqBij"
279321
},
280322
"source": [
281-
"### 도구4 :답변 생성 도구\n",
323+
"### 도구4 : 답변 생성 도구\n",
282324
"유사도 검색 결과 청크를 기반으로, LLM이 사용자가 원할 만한 답변을 생성합니다."
283325
]
284326
},
@@ -302,6 +344,8 @@
302344
" Returns:\n",
303345
" str: 생성된 답변\n",
304346
" \"\"\"\n",
347+
" import openai # OPENAI 키 발급이 필요합니다.\n",
348+
" \n",
305349
" context = \"\\n\\n\".join(chunks)\n",
306350
" prompt = f\"Context:\\n{context}\\n\\nQuestion: {query}\\nAnswer:\"\n",
307351
" response = openai.ChatCompletion.create(\n",
@@ -523,7 +567,7 @@
523567
"\n",
524568
"단순히 검색 결과만을 가져오는 것이 아니라, 검색결과를 바탕으로 쿼리에 따른 답변을 정제해서 보여주었습니다.✌🏻\n",
525569
"\n",
526-
"위는 간단한 에이전트 시스템이지만, 품질 평가, 분석 등을 추가한다면 진정한 Agentic 검색 엔진을 구현할 수 있을 것 입니다!"
570+
"지금까지 간단한 에이전트 시스템을 만들어보았습니다. 여기에 품질 평가, 분석 등을 추가한다면 진정한 Agentic 검색 엔진을 구현할 수 있습니다."
527571
]
528572
}
529573
],

0 commit comments

Comments
 (0)