compressSimple 基于规则的简单压缩
(prompt string, opts *CompressOptions)
| 150 | |
| 151 | // compressSimple 基于规则的简单压缩 |
| 152 | func (c *EnhancedPromptCompressor) compressSimple(prompt string, opts *CompressOptions) string { |
| 153 | // 分析段落 |
| 154 | sections := c.analyzeSections(prompt) |
| 155 | |
| 156 | // 评分和排序 |
| 157 | scoredSections := c.scoreSections(sections, opts.PreserveSections) |
| 158 | |
| 159 | // 根据目标长度选择段落 |
| 160 | targetLen := opts.TargetLength |
| 161 | if targetLen == 0 { |
| 162 | // 根据压缩级别计算目标长度 |
| 163 | switch opts.Level { |
| 164 | case CompressionLevelLight: |
| 165 | targetLen = int(float64(len(prompt)) * 0.65) |
| 166 | case CompressionLevelModerate: |
| 167 | targetLen = int(float64(len(prompt)) * 0.45) |
| 168 | case CompressionLevelAggressive: |
| 169 | targetLen = int(float64(len(prompt)) * 0.25) |
| 170 | default: |
| 171 | targetLen = int(float64(len(prompt)) * 0.50) |
| 172 | } |
| 173 | } |
| 174 | |
| 175 | // 选择段落 |
| 176 | var result []string |
| 177 | currentLen := 0 |
| 178 | |
| 179 | // 首先添加必须保留的段落 |
| 180 | for _, ss := range scoredSections { |
| 181 | if ss.MustKeep { |
| 182 | result = append(result, ss.Content) |
| 183 | currentLen += len(ss.Content) |
| 184 | } |
| 185 | } |
| 186 | |
| 187 | // 然后按评分添加其他段落 |
| 188 | for _, ss := range scoredSections { |
| 189 | if !ss.MustKeep && currentLen+len(ss.Content) <= targetLen { |
| 190 | result = append(result, ss.Content) |
| 191 | currentLen += len(ss.Content) |
| 192 | } |
| 193 | } |
| 194 | |
| 195 | // 应用基本优化 |
| 196 | compressed := strings.Join(result, "\n\n") |
| 197 | compressed = c.removeDuplicateEmptyLines(compressed) |
| 198 | compressed = c.compactFormat(compressed) |
| 199 | |
| 200 | return compressed |
| 201 | } |
| 202 | |
| 203 | // compressLLM LLM 驱动的压缩 |
| 204 | func (c *EnhancedPromptCompressor) compressLLM(ctx context.Context, prompt string, opts *CompressOptions) (string, error) { |
no test coverage detected