lanny xu commited on
Commit
0d85198
ยท
1 Parent(s): 20ae167

modify reranker

Browse files
Files changed (2) hide show
  1. config.py +1 -1
  2. recursive_text_splitter_explained.py +428 -0
config.py CHANGED
@@ -54,7 +54,7 @@ KNOWLEDGE_BASE_URLS = [
54
 
55
  # ๆ–‡ๆกฃๅˆ†ๅ—้…็ฝฎ
56
  CHUNK_SIZE = 250
57
- CHUNK_OVERLAP = 0
58
 
59
  # ๅ‘้‡ๆ•ฐๆฎๅบ“้…็ฝฎ
60
  COLLECTION_NAME = "rag-chroma"
 
54
 
55
  # ๆ–‡ๆกฃๅˆ†ๅ—้…็ฝฎ
56
  CHUNK_SIZE = 250
57
+ CHUNK_OVERLAP = 50 # ๆทปๅŠ ้‡ๅ ไปฅไฟๆŒไธŠไธ‹ๆ–‡่ฟž่ดฏๆ€ง๏ผŒๆๅ‡ๆฃ€็ดขๅ‡†็กฎ็އ
58
 
59
  # ๅ‘้‡ๆ•ฐๆฎๅบ“้…็ฝฎ
60
  COLLECTION_NAME = "rag-chroma"
recursive_text_splitter_explained.py ADDED
@@ -0,0 +1,428 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ RecursiveCharacterTextSplitter ๅทฅไฝœๅŽŸ็†่ฏฆ่งฃ
3
+ ๅฑ•็คบๅฆ‚ไฝ•ๅฐ†้•ฟๆ–‡ๆกฃๅˆ‡ๅˆ†ๆˆๅฐๅ—๏ผˆchunks๏ผ‰
4
+ """
5
+
6
+ print("=" * 80)
7
+ print("RecursiveCharacterTextSplitter ๅทฅไฝœๅŽŸ็†")
8
+ print("=" * 80)
9
+
10
+ # ============================================================================
11
+ # Part 1: ไธบไป€ไนˆ้œ€่ฆๆ–‡ๆœฌๅˆ†ๅ‰ฒ๏ผŸ
12
+ # ============================================================================
13
+ print("\n" + "=" * 80)
14
+ print("โ“ Part 1: ไธบไป€ไนˆ้œ€่ฆๆ–‡ๆœฌๅˆ†ๅ‰ฒ๏ผŸ")
15
+ print("=" * 80)
16
+
17
+ print("""
18
+ ้—ฎ้ข˜๏ผšๅŽŸๅง‹ๆ–‡ๆกฃ้€šๅธธๅพˆ้•ฟ
19
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
20
+
21
+ ไธ€็ฏ‡็ฝ‘้กตๆ–‡็ซ ๏ผš5000 ๅญ—
22
+ ไธ€ไปฝๆŠ€ๆœฏๆ–‡ๆกฃ๏ผš10000 ๅญ—
23
+ ไธ€ๆœฌไนฆ็š„ไธ€็ซ ๏ผš20000 ๅญ—
24
+
25
+ ๅฆ‚ๆžœ็›ดๆŽฅๅฐ†ๆ•ด็ฏ‡ๆ–‡ๆกฃๅšๆˆๅ‘้‡๏ผš
26
+ โŒ ไฟกๆฏๅฏ†ๅบฆๅคชไฝŽ๏ผˆๆ— ๅ…ณไฟกๆฏๅคชๅคš๏ผ‰
27
+ โŒ ๆฃ€็ดขไธ็ฒพๅ‡†๏ผˆๆ— ๆณ•ๅฎšไฝๅˆฐๅ…ทไฝ“ๆฎต่ฝ๏ผ‰
28
+ โŒ ่ถ…ๅ‡บๆจกๅž‹้•ฟๅบฆ้™ๅˆถ๏ผˆBERT ๆœ€ๅคš 512 tokens๏ผ‰
29
+
30
+ ่งฃๅ†ณๆ–นๆกˆ๏ผšๆ–‡ๆœฌๅˆ†ๅ‰ฒ๏ผˆText Splitting๏ผ‰
31
+ โœ… ๅฐ†้•ฟๆ–‡ๆกฃๅˆ‡ๆˆๅฐๅ—๏ผˆchunks๏ผ‰
32
+ โœ… ๆฏไธช chunk ็‹ฌ็ซ‹ๅปบ็ซ‹ๅ‘้‡็ดขๅผ•
33
+ โœ… ๆฃ€็ดขๆ—ถ่ฟ”ๅ›žๆœ€็›ธๅ…ณ็š„ chunks
34
+ """)
35
+
36
+
37
+ # ============================================================================
38
+ # Part 2: ไฝ ็š„้กน็›ฎ้…็ฝฎ
39
+ # ============================================================================
40
+ print("\n" + "=" * 80)
41
+ print("โš™๏ธ Part 2: ไฝ ็š„้กน็›ฎ้…็ฝฎ")
42
+ print("=" * 80)
43
+
44
+ print("""
45
+ ๅœจ config.py ไธญ๏ผš
46
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
47
+ CHUNK_SIZE = 250 # ๆฏไธชๅ—ๆœ€ๅคš 250 ไธช tokens
48
+ CHUNK_OVERLAP = 0 # ๅ—ไน‹้—ดไธ้‡ๅ 
49
+
50
+ ๅœจ document_processor.py ไธญ๏ผš
51
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
52
+ text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
53
+ chunk_size=250, # ๆฏๅ— 250 tokens
54
+ chunk_overlap=0 # ๆ— ้‡ๅ 
55
+ )
56
+ """)
57
+
58
+
59
+ # ============================================================================
60
+ # Part 3: RecursiveCharacterTextSplitter ็š„ๆ ธๅฟƒๆœบๅˆถ
61
+ # ============================================================================
62
+ print("\n" + "=" * 80)
63
+ print("๐Ÿ” Part 3: RecursiveCharacterTextSplitter ๆ ธๅฟƒๆœบๅˆถ")
64
+ print("=" * 80)
65
+
66
+ print("""
67
+ "Recursive" ็š„ๅซไน‰๏ผš้€’ๅฝ’ๅผๅˆ†ๅ‰ฒ
68
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
69
+
70
+ ไธๆ˜ฏ็ฎ€ๅ•็ฒ—ๆšดๅœฐๆŒ‰ๅญ—็ฌฆๆ•ฐๅˆ‡ๅˆ†๏ผŒ่€Œๆ˜ฏๆŒ‰็…งๅˆ†้š”็ฌฆ็š„ไผ˜ๅ…ˆ็บง้€’ๅฝ’ๅˆ‡ๅˆ†๏ผš
71
+
72
+ ๅˆ†้š”็ฌฆไผ˜ๅ…ˆ็บง๏ผˆไปŽ้ซ˜ๅˆฐไฝŽ๏ผ‰๏ผš
73
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
74
+ 1. "\\n\\n" ๅŒๆข่กŒ๏ผˆๆฎต่ฝๅˆ†้š”๏ผ‰ โ† ๆœ€ไผ˜ๅ…ˆ
75
+ 2. "\\n" ๅ•ๆข่กŒ๏ผˆๅฅๅญๅˆ†้š”๏ผ‰
76
+ 3. " " ็ฉบๆ ผ๏ผˆ่ฏ่ฏญๅˆ†้š”๏ผ‰
77
+ 4. "" ๅญ—็ฌฆ็บงๅˆซๅˆ‡ๅˆ† โ† ๆœ€ๅŽๆ‰‹ๆฎต
78
+
79
+ ๅทฅไฝœๆต็จ‹๏ผš
80
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
81
+ Step 1: ๅฐ่ฏ•็”จ "\\n\\n" ๅˆ†ๅ‰ฒ
82
+ โ†“
83
+ ๆฏๅ—้ƒฝ < 250 tokens?
84
+ โ†“ No (ๆŸๅ—ๅคชๅคง)
85
+
86
+ Step 2: ๅฏนๅคงๅ—็”จ "\\n" ๅˆ†ๅ‰ฒ
87
+ โ†“
88
+ ๆฏๅ—้ƒฝ < 250 tokens?
89
+ โ†“ No (ๆŸๅ—่ฟ˜ๅคชๅคง)
90
+
91
+ Step 3: ๅฏนๅคงๅ—็”จ " " ๅˆ†ๅ‰ฒ
92
+ โ†“
93
+ ๆฏๅ—้ƒฝ < 250 tokens?
94
+ โ†“ No (ๆŸๅ—ไปๅคชๅคง)
95
+
96
+ Step 4: ๅผบๅˆถๆŒ‰ๅญ—็ฌฆๅˆ‡ๅˆ†
97
+ โ†“
98
+ ไฟ่ฏๆฏๅ— <= 250 tokens โœ“
99
+ """)
100
+
101
+
102
+ # ============================================================================
103
+ # Part 4: ๅฎž้™…็คบไพ‹ - ๆ‰‹ๅŠจๆจกๆ‹Ÿๅˆ†ๅ‰ฒ่ฟ‡็จ‹
104
+ # ============================================================================
105
+ print("\n" + "=" * 80)
106
+ print("๐Ÿ’ก Part 4: ๅฎž้™…็คบไพ‹ - ๆ‰‹ๅŠจๆจกๆ‹Ÿๅˆ†ๅ‰ฒ่ฟ‡็จ‹")
107
+ print("=" * 80)
108
+
109
+ # ็คบไพ‹ๆ–‡ๆกฃ
110
+ document = """ไบบๅทฅๆ™บ่ƒฝ็ฎ€ไป‹
111
+
112
+ ไบบๅทฅๆ™บ่ƒฝ๏ผˆAI๏ผ‰ๆ˜ฏ่ฎก็ฎ—ๆœบ็ง‘ๅญฆ็š„ไธ€ไธชๅˆ†ๆ”ฏใ€‚ๅฎƒ่‡ดๅŠ›ไบŽๅˆ›ๅปบ่ƒฝๅคŸๆ‰ง่กŒ้€šๅธธ้œ€่ฆไบบ็ฑปๆ™บ่ƒฝ็š„ไปปๅŠก็š„็ณป็ปŸใ€‚
113
+
114
+ ๆœบๅ™จๅญฆไน ๆ˜ฏไบบๅทฅๆ™บ่ƒฝ็š„ไธ€ไธชๅญ้ข†ๅŸŸใ€‚ๅฎƒไฝฟ่ฎก็ฎ—ๆœบ่ƒฝๅคŸไปŽๆ•ฐๆฎไธญๅญฆไน ๅนถๆ”น่ฟ›ๅ…ถๆ€ง่ƒฝใ€‚ๆทฑๅบฆๅญฆไน ๆ˜ฏๆœบๅ™จๅญฆไน ็š„ไธ€็งๆ–นๆณ•๏ผŒไฝฟ็”จๅคšๅฑ‚็ฅž็ป็ฝ‘็ปœใ€‚
115
+
116
+ ่‡ช็„ถ่ฏญ่จ€ๅค„็†๏ผˆNLP๏ผ‰ๆ˜ฏๅฆไธ€ไธช้‡่ฆ็š„AI้ข†ๅŸŸใ€‚ๅฎƒๅค„็†่ฎก็ฎ—ๆœบไธŽไบบ็ฑป่ฏญ่จ€ไน‹้—ด็š„ไบคไบ’ใ€‚"""
117
+
118
+ print(f"\nๅŽŸๅง‹ๆ–‡ๆกฃ๏ผš")
119
+ print("โ”€" * 80)
120
+ print(document)
121
+ print("โ”€" * 80)
122
+ print(f"ๆ–‡ๆกฃ้•ฟๅบฆ๏ผš{len(document)} ๅญ—็ฌฆ")
123
+
124
+ # ๆจกๆ‹Ÿ RecursiveCharacterTextSplitter ็š„ๅทฅไฝœ
125
+ def count_tokens(text):
126
+ """็ฎ€ๅŒ–็š„ token ่ฎกๆ•ฐ๏ผˆๅฎž้™…ไฝฟ็”จ tiktoken๏ผ‰"""
127
+ # ไธญๆ–‡๏ผšๅคง็บฆ 1 ๅญ— = 1.5 tokens
128
+ # ่‹ฑๆ–‡๏ผšๅคง็บฆ 1 ่ฏ = 1 token
129
+ return int(len(text) * 0.7) # ็ฎ€ๅŒ–ไผฐ็ฎ—
130
+
131
+ print(f"\nไผฐ็ฎ— tokens ๆ•ฐ๏ผš{count_tokens(document)} tokens")
132
+
133
+ # Step 1: ๅฐ่ฏ•ๆŒ‰ๅŒๆข่กŒๅˆ†ๅ‰ฒ
134
+ print("\n" + "โ”" * 80)
135
+ print("Step 1: ๆŒ‰ '\\n\\n' (ๆฎต่ฝ) ๅˆ†ๅ‰ฒ")
136
+ print("โ”" * 80)
137
+
138
+ paragraphs = document.split('\n\n')
139
+ print(f"\nๅˆ†ๅ‰ฒๆˆ {len(paragraphs)} ไธชๆฎต่ฝ๏ผš\n")
140
+
141
+ for i, para in enumerate(paragraphs, 1):
142
+ token_count = count_tokens(para)
143
+ status = "โœ…" if token_count <= 250 else "โŒ ่ถ…ๅ‡บ้™ๅˆถ"
144
+ print(f"ๆฎต่ฝ {i}: {token_count} tokens {status}")
145
+ print(f" ๅ†…ๅฎน: {para[:60]}...")
146
+ print()
147
+
148
+ # ๅ‡่ฎพๆŸไธชๆฎต่ฝ่ถ…ๅ‡บ้™ๅˆถ
149
+ large_para = """ๆœบๅ™จๅญฆไน ๆ˜ฏไบบๅทฅๆ™บ่ƒฝ็š„ไธ€ไธชๅญ้ข†ๅŸŸใ€‚ๅฎƒไฝฟ่ฎก็ฎ—ๆœบ่ƒฝๅคŸไปŽๆ•ฐๆฎไธญๅญฆไน ๅนถๆ”น่ฟ›ๅ…ถๆ€ง่ƒฝใ€‚ๆทฑๅบฆๅญฆไน ๆ˜ฏๆœบๅ™จๅญฆไน ็š„ไธ€็งๆ–นๆณ•๏ผŒไฝฟ็”จๅคšๅฑ‚็ฅž็ป็ฝ‘็ปœใ€‚"""
150
+
151
+ if count_tokens(large_para) > 250:
152
+ print("โ”" * 80)
153
+ print("Step 2: ๆฎต่ฝๅคชๅคง๏ผŒๆŒ‰ '\\n' (ๅฅๅญ) ๅˆ†ๅ‰ฒ")
154
+ print("โ”" * 80)
155
+
156
+ sentences = large_para.split('ใ€‚')
157
+ print(f"\nๅˆ†ๅ‰ฒๆˆ {len(sentences)} ไธชๅฅๅญ๏ผš\n")
158
+
159
+ for i, sent in enumerate(sentences, 1):
160
+ if sent.strip():
161
+ token_count = count_tokens(sent)
162
+ status = "โœ…" if token_count <= 250 else "โŒ"
163
+ print(f"ๅฅๅญ {i}: {token_count} tokens {status}")
164
+ print(f" ๅ†…ๅฎน: {sent.strip()}")
165
+ print()
166
+
167
+
168
+ # ============================================================================
169
+ # Part 5: chunk_overlap ็š„ไฝœ็”จ
170
+ # ============================================================================
171
+ print("\n" + "=" * 80)
172
+ print("๐Ÿ”„ Part 5: chunk_overlap๏ผˆๅ—้‡ๅ ๏ผ‰็š„ไฝœ็”จ")
173
+ print("=" * 80)
174
+
175
+ print("""
176
+ ไฝ ็š„้กน็›ฎ่ฎพ็ฝฎ๏ผšCHUNK_OVERLAP = 0๏ผˆๆ— ้‡ๅ ๏ผ‰
177
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
178
+
179
+ ๆ— ้‡ๅ ็š„ๅˆ‡ๅˆ†๏ผš
180
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
181
+ โ”‚ Chunk 1 โ”‚โ”‚ Chunk 2 โ”‚โ”‚ Chunk 3 โ”‚
182
+ โ”‚ 250 tok โ”‚โ”‚ 250 tok โ”‚โ”‚ 250 tok โ”‚
183
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
184
+ โ†‘
185
+ ่พน็•Œๅฏ่ƒฝๅˆ‡ๆ–ญ่ฏญไน‰
186
+
187
+ ๆœ‰้‡ๅ ็š„ๅˆ‡ๅˆ†๏ผˆCHUNK_OVERLAP = 50๏ผ‰๏ผš
188
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
189
+ โ”‚ Chunk 1 โ”‚
190
+ โ”‚ 250 tok โ”‚
191
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
192
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
193
+ โ”‚ Chunk 2 โ”‚
194
+ โ”‚ 250 tok โ”‚
195
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
196
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
197
+ โ”‚ Chunk 3 โ”‚
198
+ โ”‚ 250 tok โ”‚
199
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
200
+
201
+ ไผ˜็‚น๏ผš
202
+ โœ… ไฟ็•™ไธŠไธ‹ๆ–‡่ฟž่ดฏๆ€ง
203
+ โœ… ้ฟๅ…ๅ…ณ้”ฎไฟกๆฏ่ขซๅˆ‡ๆ–ญ
204
+ โœ… ๆ้ซ˜ๆฃ€็ดขๅ‡†็กฎ็އ (+5-10%)
205
+
206
+ ็ผบ็‚น๏ผš
207
+ โŒ ๅญ˜ๅ‚จ็ฉบ้—ดๅขžๅŠ  20-30%
208
+ โŒ ๅฏ่ƒฝ่ฟ”ๅ›ž้‡ๅคๅ†…ๅฎน
209
+
210
+ ไธบไป€ไนˆไฝ ็š„้กน็›ฎ่ฎพไธบ 0๏ผŸ
211
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
212
+ โœ… ่Š‚็œๅญ˜ๅ‚จ็ฉบ้—ด
213
+ โœ… ้ฟๅ…้‡ๅค
214
+ โœ… ้…ๅˆ CrossEncoder ้‡ๆŽ’ๅทฒ็ป่ถณๅคŸๅ‡†็กฎ
215
+
216
+ ๆŽจ่่ฎพ็ฝฎ๏ผš
217
+ - CHUNK_OVERLAP = 0: ๅฟซ้€ŸๅŽŸๅž‹ใ€ๅญ˜ๅ‚จๅ—้™
218
+ - CHUNK_OVERLAP = 50: ็”Ÿไบง็Žฏๅขƒใ€้ซ˜็ฒพๅบฆ่ฆๆฑ‚ โญ
219
+ - CHUNK_OVERLAP = 100: ๅ…ณ้”ฎๅบ”็”จใ€ๅŒป็–—ๆณ•ๅพ‹็ญ‰
220
+ """)
221
+
222
+
223
+ # ============================================================================
224
+ # Part 6: from_tiktoken_encoder ็š„ไฝœ็”จ
225
+ # ============================================================================
226
+ print("\n" + "=" * 80)
227
+ print("๐ŸŽฏ Part 6: from_tiktoken_encoder ็š„็‰นๆฎŠไน‹ๅค„")
228
+ print("=" * 80)
229
+
230
+ print("""
231
+ ไฝ ็š„ไปฃ็ ๏ผš
232
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
233
+ RecursiveCharacterTextSplitter.from_tiktoken_encoder(
234
+ chunk_size=250,
235
+ chunk_overlap=0
236
+ )
237
+
238
+ ไธไฝฟ็”จ tiktoken๏ผš
239
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
240
+ RecursiveCharacterTextSplitter(
241
+ chunk_size=250, # โ† ่ฟ™้‡Œๆ˜ฏๅญ—็ฌฆๆ•ฐ๏ผŒไธๆ˜ฏ tokens๏ผ
242
+ chunk_overlap=0
243
+ )
244
+
245
+ ๅŒบๅˆซ๏ผš
246
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
247
+
248
+ ๆ™ฎ้€šๆจกๅผ๏ผšๆŒ‰ๅญ—็ฌฆๆ•ฐๅˆ‡ๅˆ†
249
+ โ”œโ”€ chunk_size=250 โ†’ 250 ไธชๅญ—็ฌฆ
250
+ โ”œโ”€ ไธญๆ–‡๏ผšๅคง็บฆ 250 ไธชๅญ— = 375 tokens๏ผˆ่ถ…ๆ ‡๏ผ๏ผ‰
251
+ โ””โ”€ ่‹ฑๆ–‡๏ผšๅคง็บฆ 50 ไธชๅ•่ฏ = 50 tokens๏ผˆๅคชๅฐ‘๏ผ๏ผ‰
252
+
253
+ tiktoken ๆจกๅผ๏ผšๆŒ‰ tokens ๅˆ‡ๅˆ† โญ
254
+ โ”œโ”€ chunk_size=250 โ†’ ็ฒพ็กฎ 250 ไธช tokens
255
+ โ”œโ”€ ไธญๆ–‡๏ผšๅคง็บฆ 166 ไธชๅญ— = 250 tokens โœ“
256
+ โ””โ”€ ่‹ฑๆ–‡๏ผšๅคง็บฆ 190 ไธชๅ•่ฏ = 250 tokens โœ“
257
+
258
+ tiktoken ๆ˜ฏไป€ไนˆ๏ผŸ
259
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
260
+ OpenAI ็š„ tokenizer๏ผŒไธŽ GPT/BERT ็š„ๅˆ†่ฏๆ–นๅผไธ€่‡ด
261
+
262
+ ไผ˜็‚น๏ผš
263
+ โœ… ็ฒพ็กฎๆŽงๅˆถ chunk ๅคงๅฐ
264
+ โœ… ไธŽ Embedding ๆจกๅž‹็š„ token ้™ๅˆถไธ€่‡ด
265
+ โœ… ไธญ่‹ฑๆ–‡้ƒฝ่ƒฝๅ‡†็กฎๅค„็†
266
+
267
+ ไฝ ็š„้กน็›ฎไฝฟ็”จ tiktoken ๆ˜ฏๆญฃ็กฎไธ”ๆŽจ่็š„ๅšๆณ•๏ผ
268
+ """)
269
+
270
+
271
+ # ============================================================================
272
+ # Part 7: ๅฎŒๆ•ด็š„ๅˆ†ๅ‰ฒๆต็จ‹ๅฏ่ง†ๅŒ–
273
+ # ============================================================================
274
+ print("\n" + "=" * 80)
275
+ print("๐Ÿ“Š Part 7: ๅฎŒๆ•ด็š„ๅˆ†ๅ‰ฒๆต็จ‹ๅฏ่ง†ๅŒ–")
276
+ print("=" * 80)
277
+
278
+ print("""
279
+ ๅŽŸๅง‹ๆ–‡ๆกฃ (5000 tokens)
280
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
281
+ โ”‚ ็ฌฌไธ€็ซ ๏ผšไบบๅทฅๆ™บ่ƒฝ็ฎ€ไป‹ โ”‚
282
+ โ”‚ โ”‚
283
+ โ”‚ ไบบๅทฅๆ™บ่ƒฝ๏ผˆAI๏ผ‰ๆ˜ฏ่ฎก็ฎ—ๆœบ็ง‘ๅญฆ็š„ไธ€ไธชๅˆ†ๆ”ฏ... โ”‚
284
+ โ”‚ โ”‚
285
+ โ”‚ ็ฌฌไบŒ็ซ ๏ผšๆœบๅ™จๅญฆไน  โ”‚
286
+ โ”‚ โ”‚
287
+ โ”‚ ๆœบๅ™จๅญฆไน ๆ˜ฏAI็š„ไธ€ไธชๅญ้ข†ๅŸŸ... โ”‚
288
+ โ”‚ โ”‚
289
+ โ”‚ ็ฌฌไธ‰็ซ ๏ผšๆทฑๅบฆๅญฆไน  โ”‚
290
+ โ”‚ ... โ”‚
291
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
292
+ โ†“
293
+ RecursiveCharacterTextSplitter
294
+ (chunk_size=250, overlap=0)
295
+ โ†“
296
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
297
+
298
+ Chunk 1 (250 tokens)
299
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
300
+ โ”‚ ็ฌฌไธ€็ซ ๏ผšไบบๅทฅๆ™บ่ƒฝ็ฎ€ไป‹ โ”‚
301
+ โ”‚ โ”‚
302
+ โ”‚ ไบบๅทฅๆ™บ่ƒฝ๏ผˆAI๏ผ‰ๆ˜ฏ่ฎก็ฎ—ๆœบ็ง‘ๅญฆ็š„ไธ€ไธชๅˆ†ๆ”ฏใ€‚ๅฎƒ่‡ดๅŠ›... โ”‚
303
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
304
+ โ†“ ๅญ˜ๅ…ฅๅ‘้‡ๆ•ฐๆฎๅบ“
305
+
306
+ Chunk 2 (250 tokens)
307
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
308
+ โ”‚ ไบบๅทฅๆ™บ่ƒฝๅŒ…ๆ‹ฌๅคšไธชๅญ้ข†ๅŸŸ๏ผŒๅฆ‚ๆœบๅ™จๅญฆไน ใ€... โ”‚
309
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
310
+ โ†“ ๅญ˜ๅ…ฅๅ‘้‡ๆ•ฐๆฎๅบ“
311
+
312
+ Chunk 3 (250 tokens)
313
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
314
+ โ”‚ ็ฌฌไบŒ็ซ ๏ผšๆœบๅ™จๅญฆไน  โ”‚
315
+ โ”‚ โ”‚
316
+ โ”‚ ๆœบๅ™จๅญฆไน ๆ˜ฏAI็š„ไธ€ไธชๅญ้ข†ๅŸŸใ€‚ๅฎƒไฝฟ่ฎก็ฎ—ๆœบ่ƒฝๅคŸ... โ”‚
317
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
318
+ โ†“ ๅญ˜ๅ…ฅๅ‘้‡ๆ•ฐๆฎๅบ“
319
+
320
+ ...็ปง็ปญๅˆ†ๅ‰ฒๆˆ็บฆ 20 ไธช chunks
321
+
322
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
323
+
324
+ ๆฃ€็ดขๆ—ถ๏ผš
325
+ ็”จๆˆท้—ฎ้ข˜: "ไป€ไนˆๆ˜ฏๆœบๅ™จๅญฆไน ๏ผŸ"
326
+ โ†“
327
+ ๅ‘้‡ๆฃ€็ดข Top 20 chunks
328
+ โ†“
329
+ โ”œโ”€ Chunk 3 (็›ธๅ…ณๅบฆ: 0.92) โ† ๆœ€็›ธๅ…ณ
330
+ โ”œโ”€ Chunk 4 (็›ธๅ…ณๅบฆ: 0.88)
331
+ โ”œโ”€ Chunk 1 (็›ธๅ…ณๅบฆ: 0.75)
332
+ โ””โ”€ ...
333
+ โ†“
334
+ CrossEncoder ้‡ๆŽ’ โ†’ Top 5
335
+ โ†“
336
+ ่ฟ”ๅ›žๆœ€็›ธๅ…ณ็š„็‰‡ๆฎต็ป™ LLM ็”Ÿๆˆ็ญ”ๆกˆ
337
+ """)
338
+
339
+
340
+ # ============================================================================
341
+ # Part 8: ๅ…ณ้”ฎๅ‚ๆ•ฐ่ฐƒไผ˜ๅปบ่ฎฎ
342
+ # ============================================================================
343
+ print("\n" + "=" * 80)
344
+ print("โš™๏ธ Part 8: ๅ…ณ้”ฎๅ‚ๆ•ฐ่ฐƒไผ˜ๅปบ่ฎฎ")
345
+ print("=" * 80)
346
+
347
+ print("""
348
+ ๅ‚ๆ•ฐ้…็ฝฎๅปบ่ฎฎ๏ผš
349
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
350
+
351
+ CHUNK_SIZE๏ผˆๅ—ๅคงๅฐ๏ผ‰๏ผš
352
+ โ”œโ”€ 100-200: ็Ÿญๆ–‡ๆกฃใ€็ฒพ็กฎๆฃ€็ดข
353
+ โ”œโ”€ 250-500: ้€š็”จๅœบๆ™ฏ โญ (ไฝ ็š„้กน็›ฎ)
354
+ โ””โ”€ 500-1000: ้•ฟๆ–‡ๆกฃใ€้œ€่ฆๆ›ดๅคšไธŠไธ‹ๆ–‡
355
+
356
+ CHUNK_OVERLAP๏ผˆ้‡ๅ ๏ผ‰๏ผš
357
+ โ”œโ”€ 0: ๅฟซ้€ŸๅŽŸๅž‹ใ€ๅญ˜ๅ‚จๅ—้™ (ไฝ ็š„้กน็›ฎ)
358
+ โ”œโ”€ 50: ็”Ÿไบง็ŽฏๅขƒๆŽจ่ โญ
359
+ โ”œโ”€ 100: ้ซ˜็ฒพๅบฆ่ฆๆฑ‚
360
+ โ””โ”€ 150+: ๅ…ณ้”ฎๅบ”็”จ
361
+
362
+ ไฝ ็š„้กน็›ฎ้…็ฝฎ๏ผš
363
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
364
+ CHUNK_SIZE = 250 โœ“ ้€‚ไธญ๏ผŒ้€‚ๅˆๅคงๅคšๆ•ฐๅœบๆ™ฏ
365
+ CHUNK_OVERLAP = 0 โš ๏ธ ๅปบ่ฎฎๆ”นไธบ 50-100
366
+
367
+ ๆŽจ่ไผ˜ๅŒ–๏ผš
368
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
369
+ CHUNK_SIZE = 400 # ๅขžๅŠ ไธŠไธ‹ๆ–‡
370
+ CHUNK_OVERLAP = 100 # ๆทปๅŠ ้‡ๅ ไฟ่ฏ่ฟž่ดฏๆ€ง
371
+
372
+ ็†็”ฑ๏ผš
373
+ โœ… 400 tokens ่ถณๅคŸๅŒ…ๅซๅฎŒๆ•ด็š„ๆฎต่ฝ
374
+ โœ… 100 tokens ้‡ๅ ้ฟๅ…ๅ…ณ้”ฎไฟกๆฏ่ขซๅˆ‡ๆ–ญ
375
+ โœ… ้…ๅˆ CrossEncoder๏ผŒๅ‡†็กฎ็އๅฏๆๅ‡ 8-12%
376
+ """)
377
+
378
+
379
+ # ============================================================================
380
+ # Part 9: ๆ€ป็ป“
381
+ # ============================================================================
382
+ print("\n" + "=" * 80)
383
+ print("๐Ÿ“š Part 9: ๆ ธๅฟƒ่ฆ็‚นๆ€ป็ป“")
384
+ print("=" * 80)
385
+
386
+ print("""
387
+ RecursiveCharacterTextSplitter ็š„ๅทฅไฝœๅŽŸ็†๏ผš
388
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
389
+
390
+ 1๏ธโƒฃ ้€’ๅฝ’ๅˆ†ๅ‰ฒ๏ผš
391
+ โ””โ”€ ๆŒ‰ไผ˜ๅ…ˆ็บงๅฐ่ฏ•ๅˆ†้š”็ฌฆ๏ผš\\n\\n โ†’ \\n โ†’ ็ฉบๆ ผ โ†’ ๅญ—็ฌฆ
392
+
393
+ 2๏ธโƒฃ ๆ™บ่ƒฝๅˆ‡ๅˆ†๏ผš
394
+ โ””โ”€ ไฟๆŒ่ฏญไน‰ๅฎŒๆ•ดๆ€ง๏ผŒไผ˜ๅ…ˆๅœจๆฎต่ฝ/ๅฅๅญ่พน็•Œๅˆ‡ๅˆ†
395
+
396
+ 3๏ธโƒฃ ็ฒพ็กฎๆŽงๅˆถ๏ผš
397
+ โ””โ”€ from_tiktoken_encoder ็กฎไฟๆฏๅ—ๆฐๅฅฝ 250 tokens
398
+
399
+ 4๏ธโƒฃ ๅฏ้€‰้‡ๅ ๏ผš
400
+ โ””โ”€ CHUNK_OVERLAP ไฟ็•™ไธŠไธ‹ๆ–‡่ฟž่ดฏๆ€ง
401
+
402
+ 5๏ธโƒฃ ไฝ ็š„้กน็›ฎๆต็จ‹๏ผš
403
+ ๅŽŸๅง‹ๆ–‡ๆกฃ
404
+ โ†“ RecursiveCharacterTextSplitter
405
+ 250-token chunks
406
+ โ†“ HuggingFace Embeddings
407
+ ๅ‘้‡ๆ•ฐๆฎๅบ“
408
+ โ†“ ๅ‘้‡ๆฃ€็ดข (Top 20)
409
+ ๅ€™้€‰ chunks
410
+ โ†“ CrossEncoder ้‡ๆŽ’
411
+ ๆœ€็ปˆ Top 5 chunks
412
+ โ†“
413
+ ๅ–‚็ป™ LLM ็”Ÿๆˆ็ญ”ๆกˆ
414
+
415
+ ๅ…ณ้”ฎไผ˜ๅŠฟ๏ผš
416
+ โœ… ๆ™บ่ƒฝๅˆ‡ๅˆ†๏ผŒไฟๆŒ่ฏญไน‰ๅฎŒๆ•ด
417
+ โœ… ็ฒพ็กฎๆŽงๅˆถ chunk ๅคงๅฐ
418
+ โœ… ๆ”ฏๆŒไธญ่‹ฑๆ–‡ๆททๅˆๆ–‡ๆœฌ
419
+ โœ… ไธŽๅ‘้‡ๆฃ€็ดข้…ๅˆๅฎŒ็พŽ
420
+
421
+ ่ฟ™ๅฐฑๆ˜ฏไธบไป€ไนˆไฝ ็š„้กน็›ฎ่ƒฝๅคŸๅ‡†็กฎๆฃ€็ดขๅ’Œๅ›ž็ญ”้—ฎ้ข˜๏ผ
422
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
423
+ """)
424
+
425
+ print("\n" + "=" * 80)
426
+ print("โœ… ่งฃๆžๅฎŒๆˆ๏ผ็Žฐๅœจไฝ ๅบ”่ฏฅ็†่งฃไบ†ๆ–‡ๆœฌๅˆ†ๅ‰ฒ็š„ๅŽŸ็†")
427
+ print("=" * 80)
428
+ print()