generateContext 生成上下文
(_ context.Context, items []*RetrievalItem, _ string)
| 492 | |
| 493 | // generateContext 生成上下文 |
| 494 | func (r *RAG) generateContext(_ context.Context, items []*RetrievalItem, _ string) (string, []*KnowledgeItem, error) { |
| 495 | var contextItems []*KnowledgeItem |
| 496 | var contextParts []string |
| 497 | |
| 498 | switch r.config.ContextStrategy { |
| 499 | case ContextStrategyAll: |
| 500 | for _, item := range items { |
| 501 | contextItems = append(contextItems, item.Item) |
| 502 | contextParts = append(contextParts, r.formatContextItem(item.Item)) |
| 503 | } |
| 504 | |
| 505 | case ContextStrategyTopK: |
| 506 | topK := min(len(items), 5) |
| 507 | for i := range topK { |
| 508 | contextItems = append(contextItems, items[i].Item) |
| 509 | contextParts = append(contextParts, r.formatContextItem(items[i].Item)) |
| 510 | } |
| 511 | |
| 512 | case ContextStrategyDiverse: |
| 513 | contextItems = r.selectDiverseItems(items, 5) |
| 514 | for _, item := range contextItems { |
| 515 | contextParts = append(contextParts, r.formatContextItem(item)) |
| 516 | } |
| 517 | |
| 518 | case ContextStrategyChain: |
| 519 | // TODO: 实现推理链生成 |
| 520 | for _, item := range items { |
| 521 | contextItems = append(contextItems, item.Item) |
| 522 | contextParts = append(contextParts, r.formatContextItem(item.Item)) |
| 523 | } |
| 524 | } |
| 525 | |
| 526 | context := strings.Join(contextParts, "\n\n") |
| 527 | |
| 528 | // 上下文压缩 |
| 529 | if r.config.ContextCompression && len(context) > r.config.MaxContextLength { |
| 530 | context = r.compressContext(context) |
| 531 | } |
| 532 | |
| 533 | return context, contextItems, nil |
| 534 | } |
| 535 | |
| 536 | // selectDiverseItems 选择多样化的项目 |
| 537 | func (r *RAG) selectDiverseItems(items []*RetrievalItem, maxCount int) []*KnowledgeItem { |
no test coverage detected