CLRlove7

๐Ÿ” ้ข†ๅŸŸ็Ÿฅ่ฏ†ๅบ“ๆฃ€็ดขๅขžๅผบ

ๅŸบไบŽๅคšๆจกๆ€ๆททๅˆๆฃ€็ดข็š„้ข†ๅŸŸ็Ÿฅ่ฏ†ๅขžๅผบๆŠ€ๆœฏ


๐Ÿ“Œ ๆŠ€ๆœฏ่ƒŒๆ™ฏ

ๅœจ่ˆช็ฉบ่ฝฏไปถๆต‹่ฏ•ๅœบๆ™ฏไธญ๏ผŒๆต‹่ฏ•็”จไพ‹็”Ÿๆˆ้ซ˜ๅบฆไพ่ต–้ข†ๅŸŸไธ“ไธš็Ÿฅ่ฏ†๏ผš


๐Ÿ—๏ธ ๆ•ดไฝ“ๆžถๆž„

ไธ‰้˜ถๆฎตๆต็จ‹

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                     ๆฃ€็ดข้˜ถๆฎต (Retrieval)                    โ”‚
โ”‚  ็‰นๅพๆๅ– โ†’ ็ดขๅผ•ๆž„ๅปบ โ†’ ็ฒ—ๆฃ€็ดข โ†’ ็ป†ๆฃ€็ดข                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                            โ†“
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                     ่ฎญ็ปƒ้˜ถๆฎต (Training)                     โ”‚
โ”‚  ๅˆคๅˆซๅ™จ็ฝ‘็ปœ โ†’ ๅฏนๆฏ”ๆŸๅคฑ โ†’ ็ปผๅˆๆŸๅคฑ โ†’ ๆจกๅž‹ๅพฎ่ฐƒ                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                            โ†“
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                     ๆต‹่ฏ•้˜ถๆฎต (Testing)                      โ”‚
โ”‚  ็”จไพ‹็”Ÿๆˆ โ†’ ้—ญ็Žฏ่ฟญไปฃ โ†’ ็Ÿฅ่ฏ†ๅบ“ๆ›ดๆ–ฐ                           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

1๏ธโƒฃ ๅคšๆจกๆ€ๆททๅˆๆฃ€็ดขๆœบๅˆถ

็‰นๅพๆๅ–

ๅฏนๆฏไธชๅพ…ๆต‹ๅ‡ฝๆ•ฐ $C$ ่ฟ›่กŒๅ››็ปดๅบฆ็‰นๅพๆๅ–๏ผš

็‰นๅพ็ฑปๅž‹ ๆๅ–ๆ–นๆณ• ่กจ็คบ็ปดๅบฆ ไฝœ็”จ
่ฏญๆณ•็‰นๅพ AST ่งฃๆž 512็ปด ็ป“ๆž„ไฟกๆฏ
่ฏญไน‰็‰นๅพ BERT 768็ปด ่ฏญไน‰็†่งฃ
ๆ–‡ๆœฌ็‰นๅพ Word2Vec 128็ปด ๅ‘ฝๅๆจกๅผ
ๆณจ้‡Š็‰นๅพ TF-IDF 256็ปด ๆ–‡ๆกฃๅ…ณ่”

ๆททๅˆ็‰นๅพๅ‘้‡

\[F_{mixed}(C) = \alpha \cdot F_{AST} \oplus \beta \cdot F_{semantic} \oplus \gamma \cdot F_{name} \oplus \delta \cdot F_{comment}\]

ๅ…ถไธญ $\alpha + \beta + \gamma + \delta = 1$๏ผŒๆƒ้‡้€š่ฟ‡่ฎญ็ปƒๅญฆไน ใ€‚

็ดขๅผ•ๆž„ๅปบ

ๅŒๅฑ‚็ดขๅผ•็ป“ๆž„๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚           ๅ€’ๆŽ’็ดขๅผ• (็ฒ—ๆฃ€็ดข)              โ”‚
โ”‚  - ๅฟซ้€Ÿ่ฟ‡ๆปคๅ€™้€‰้›†                       โ”‚
โ”‚  - O(1) ๆ—ถ้—ดๅคๆ‚ๅบฆๆฃ€็ดข                   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
           โ†“
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚           ๅ‘้‡็ดขๅผ• (็ป†ๆฃ€็ดข)              โ”‚
โ”‚  - ็ฒพ็กฎ็›ธไผผๅบฆ่ฎก็ฎ—                       โ”‚
โ”‚  - ไฝ™ๅผฆ็›ธไผผๅบฆ: similarity = cos(ฮธ)     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆฃ€็ดขๆต็จ‹

def hybrid_retrieve(query: Code, top_k: int = 10) -> List[KnowledgeEntry]:
    # 1. ็‰นๅพๆๅ–
    features = extract_multimodal_features(query)
    
    # 2. ็ฒ—ๆฃ€็ดข๏ผšๅ€’ๆŽ’็ดขๅผ•ๅฟซ้€Ÿ่ฟ‡ๆปค
    candidates = inverted_index.recall(features)
    
    # 3. ็ป†ๆฃ€็ดข๏ผšๅ‘้‡็›ธไผผๅบฆๆŽ’ๅบ
    scored = []
    for candidate in candidates:
        similarity = cosine_similarity(features, candidate.features)
        scored.append((candidate, similarity))
    
    # 4. ้‡ๆŽ’ๅบ
    scored.sort(key=lambda x: x[1], reverse=True)
    return [item[0] for item in scored[:top_k]]

2๏ธโƒฃ ๅคš่พ“ๅ…ฅๅŒน้…ๅˆคๅˆซๅ™จ็ฝ‘็ปœ

็ฝ‘็ปœๆžถๆž„

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      ๅˆคๅˆซๅ™จ็ฝ‘็ปœ                             โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚ ๆŸฅ่ฏข็‰นๅพ โ”‚ โ”€โ†’ โ”‚ ไบคๅ‰ๆณจๆ„ๅŠ›โ”‚ โ”€โ†’ โ”‚ ๅทฎๅผ‚็‰นๅพๆๅ–ๅ™จ        โ”‚ โ”‚
โ”‚  โ”‚  Q       โ”‚    โ”‚  A(Q,K)  โ”‚    โ”‚  D_ij = |Q_i - K_j|  โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”              โ†“              โ”‚
โ”‚  โ”‚ ๅ€™้€‰็‰นๅพ โ”‚ โ”€โ†’ โ”‚ ๅ€ผ V      โ”‚    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚  K       โ”‚    โ”‚          โ”‚    โ”‚    MLP ๅˆคๅˆซๅคด        โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚  Output: Match/Not   โ”‚ โ”‚
โ”‚                                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆŸๅคฑๅ‡ฝๆ•ฐ

ๅฏนๆฏ”ๆŸๅคฑ (Contrastive Loss)๏ผš \(L_{contrastive} = \sum_{i,j} y_{ij} \cdot D_{ij}^2 + (1 - y_{ij}) \cdot \max(0, m - D_{ij})^2\)

ๅ…ถไธญ๏ผš

็ปผๅˆๆŸๅคฑ๏ผš \(L_{total} = \lambda_1 \cdot L_{contrastive} + \lambda_2 \cdot L_{cls}\)


3๏ธโƒฃ ๆœฌๅœฐ็Ÿฅ่ฏ†ๅบ“ๆž„ๅปบ

ไปฃ็ ๅบ“ๆ ‡็ญพไฝ“็ณป

ๅคง็ฑป ๅญๅˆ†็ฑป ็คบไพ‹ ๆต‹่ฏ•้‡็‚น
ๆ•ฐๆฎๅค„็†็ฑป ๆ•ฐๆฎ่ฝฌๆข RGBโ†’็ฐๅบฆๅ›พๅƒ ็ฒพๅบฆๆ ก้ชŒ
ย  ๆ•ฐๆฎ่ฎก็ฎ— ็Ÿฉ้˜ตไน˜ๆณ•ใ€ๅนณๅ‡ๅ€ผ ๆ•ฐๅ€ผๅ‡†็กฎๆ€ง
ย  ๆ•ฐๆฎ็ญ›้€‰ ๆกไปถ่ฟ‡ๆปค ่พน็•Œๆกไปถ
้€ป่พ‘ๆŽงๅˆถ็ฑป ๆกไปถๅˆคๆ–ญ ๅนด้พ„ๅˆคๆ–ญ ๅˆ†ๆ”ฏ่ฆ†็›–
ย  ๅพช็ŽฏๆŽงๅˆถ ่ฟญไปฃๆฑ‚ๅ’Œ ๅพช็Žฏ็ปˆๆญข
่พ“ๅ…ฅ่พ“ๅ‡บ็ฑป ่พ“ๅ…ฅๅค„็† ๅŠ ๅฏ†่งฃๅฏ† ๅฎ‰ๅ…จๆ ก้ชŒ
ย  ่พ“ๅ‡บ็”Ÿๆˆ ๆŠฅๅ‘Š็”Ÿๆˆ ๆ ผๅผๆ ก้ชŒ
ไบคไบ’็ฑป ๅ†…้ƒจไบคไบ’ ๅ‡ฝๆ•ฐ่ฐƒ็”จ ๆŽฅๅฃๅฅ‘็บฆ
ย  ๅค–้ƒจไบคไบ’ ๆ•ฐๆฎๅบ“ๆ“ไฝœ ไบ‹ๅŠกๅค„็†

็Ÿฅ่ฏ†ๅบ“ๅ†…ๅฎน

KnowledgeEntry:
    code_snippet: str          # ไปฃ็ ็‰‡ๆฎต
    test_cases: List[TestCase] # ็›ธๅ…ณๆต‹่ฏ•็”จไพ‹
    coverage_info: CoverageData # ่ฆ†็›–ไฟกๆฏ
    domain_tags: List[str]     # ้ข†ๅŸŸๆ ‡็ญพ
    success_rate: float        # ๅކๅฒๆˆๅŠŸ็އ
    last_used: datetime        # ๆœ€ๅŽไฝฟ็”จๆ—ถ้—ด

4๏ธโƒฃ ๆต‹่ฏ•็”จไพ‹็”ŸๆˆไธŽ่ฟญไปฃ

ๅฎŒๆ•ดๆต็จ‹

# 1. ่พ“ๅ…ฅๅพ…ๆต‹ๅ‡ฝๆ•ฐ
def discount_price(prices, rate=0.1):
    if not 0 <= rate <= 1:
        raise ValueError("rate must be between 0 and 1")
    if not all(p >= 0 for p in prices):
        raise ValueError("all prices must be non-negative")
    return [round(p * (1 - rate), 2) for p in prices]

# 2. ้ข„ๅค„็†
preprocessed = preprocess(discount_price)
# - ไปฃ็ ๆ ผๅผๅŒ–
# - ๅฎๅฎšไน‰่ฟ˜ๅŽŸ
# - ๅŠŸ่ƒฝๆ ‡็ญพ: ["price", "discount", "float_round"]

# 3. ๆฃ€็ดข็›ธไผผๆกˆไพ‹
similar_cases = knowledge_base.retrieve(preprocessed)

# 4. ๅˆคๅˆซๅ™จๅˆคๆ–ญ้€‚้…ๆ€ง
is_suitable = discriminator.judge(preprocessed, similar_cases)

# 5. ็”Ÿๆˆๆต‹่ฏ•็”จไพ‹
if is_suitable:
    test_case = generator.generate(preprocessed, similar_cases)

# 6. ้—ญ็Žฏ่ฟญไปฃ
result = run_test(test_case)
coverage = analyze_coverage(result)
if coverage < TARGET:
    # ๆœช่ฆ†็›–่ทฏๅพ„ โ†’ ่กฅๅ……็”จไพ‹ โ†’ ๆ›ดๆ–ฐ็Ÿฅ่ฏ†ๅบ“
    supplementary = generate_supplementary(coverage.gaps)
    knowledge_base.update(discount_price, supplementary)

่ฟญไปฃ็คบไพ‹

้ฆ–ๆฌกๆต‹่ฏ•๏ผš่กŒ่ฆ†็›– 88%๏ผŒๅˆ†ๆ”ฏ 75%
     โ†“
ๆœช่ฆ†็›–ๅˆ†ๆ”ฏ๏ผšround ่กŒไธบ่พน็•Œ๏ผˆๅฆ‚ 9.995 โ†’ 10.00๏ผ‰
     โ†“
ๆจกๅž‹่กฅๅ……็”จไพ‹๏ผš
def test_round_edge():
    assert discount_price([9.995], 0.01) == [9.9]
     โ†“
ๅ†ๆฌก่ฟ่กŒ๏ผš่กŒ่ฆ†็›– 100%๏ผŒๅˆ†ๆ”ฏ 100%
     โ†“
ๅฐ† <discount_price, test_discount_price.py> ่ฟฝๅŠ ไปฃ็ ๅบ“
็‰ˆๆœฌๅท๏ผšpy-disc-v1.1

๐Ÿ“Š ๆ•ˆๆžœ้ชŒ่ฏ

ๆŒ‡ๆ ‡ ๆ—  RAG ๅŸบ็ก€ RAG ๆˆ‘ไปฌ็š„ๆ–นๆณ•
ๆฃ€็ดขๅ‡†็กฎ็އ 45% 72% 91%
็”จไพ‹็”Ÿๆˆๆ—ถ้—ด 12min 5min 2.3min
้ฆ–ๆฌก่ฆ†็›–็އ 62% 78% 94%
็Ÿฅ่ฏ†ๅบ“ๅฌๅ›ž็އ 23% 58% 87%

๐Ÿ”ฎ ไผ˜ๅŒ–ๆ–นๅ‘

  1. ๅขž้‡ๅญฆไน ๏ผšๆŒ็ปญๅธๆ”ถๆ–ฐ็š„ๆต‹่ฏ•ๆˆๅŠŸๆกˆไพ‹
  2. ่ทจ้กน็›ฎ่ฟ็งป๏ผšๆž„ๅปบ่ˆช็ฉบ้ข†ๅŸŸ้€š็”จ็Ÿฅ่ฏ†ๅ›พ่ฐฑ
  3. ๅคšๆจกๆ€ๆ‰ฉๅฑ•๏ผšๆ”ฏๆŒๅ›พ่กจใ€่ง„่Œƒๆ–‡ๆกฃ็ญ‰ๅคšๆจกๆ€่พ“ๅ…ฅ