RetrieveMultiHop 多跳检索
(ctx context.Context, query string, maxHops int)
| 187 | |
| 188 | // RetrieveMultiHop 多跳检索 |
| 189 | func (r *RAG) RetrieveMultiHop(ctx context.Context, query string, maxHops int) (*RAGResult, error) { |
| 190 | if !r.config.EnableMultiHop { |
| 191 | return r.Retrieve(ctx, query) |
| 192 | } |
| 193 | |
| 194 | if maxHops <= 0 { |
| 195 | maxHops = r.config.MaxHops |
| 196 | } |
| 197 | |
| 198 | var allItems []*RetrievalItem |
| 199 | var allContextItems []*KnowledgeItem |
| 200 | var expandedQuery = query |
| 201 | |
| 202 | for range maxHops { |
| 203 | result, err := r.Retrieve(ctx, expandedQuery, WithMaxResults(r.config.MaxRetrievalResults/2)) |
| 204 | if err != nil { |
| 205 | break |
| 206 | } |
| 207 | |
| 208 | if len(result.Results) == 0 { |
| 209 | break |
| 210 | } |
| 211 | |
| 212 | // 添加到总结果 |
| 213 | allItems = append(allItems, result.Results...) |
| 214 | allContextItems = append(allContextItems, result.ContextItems...) |
| 215 | |
| 216 | // 使用top结果扩展查询 |
| 217 | if len(result.Results) > 0 { |
| 218 | expandedQuery = r.expandQuery(expandedQuery, result.Results[0].Item) |
| 219 | } |
| 220 | } |
| 221 | |
| 222 | // 去重和重新排序 |
| 223 | allItems = r.deduplicate(allItems) |
| 224 | allItems = r.rerank(ctx, query, allItems) |
| 225 | if len(allItems) > r.config.MaxRetrievalResults { |
| 226 | allItems = allItems[:r.config.MaxRetrievalResults] |
| 227 | } |
| 228 | |
| 229 | context, _, _ := r.generateContext(ctx, allItems, query) |
| 230 | |
| 231 | return &RAGResult{ |
| 232 | Query: query, |
| 233 | Results: allItems, |
| 234 | EnhancedQuery: expandedQuery, |
| 235 | Context: context, |
| 236 | ContextItems: allContextItems, |
| 237 | Confidence: r.calculateConfidence(allItems), |
| 238 | TotalTime: time.Since(time.Now()), |
| 239 | }, nil |
| 240 | } |
| 241 | |
| 242 | // RAGOption RAG选项 |
| 243 | type RAGOption func(*RAGOptions) |
nothing calls this directly
no test coverage detected