Major Changes: - Add StreamingService with OpenAI Compatible format - Upgrade Chat component V2 with Ant Design X integration - Implement AIA module with 12 intelligent agents - Update API routes to unified /api/v1 prefix - Update system documentation Backend (~1300 lines): - common/streaming: OpenAI Compatible adapter - modules/aia: 12 agents, conversation service, streaming integration - Update route versions (RVW, PKB to v1) Frontend (~3500 lines): - modules/aia: AgentHub + ChatWorkspace (100% prototype restoration) - shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook - Update API endpoints to v1 Documentation: - AIA module status guide - Universal capabilities catalog - System overview updates - All module documentation sync Tested: Stream response verified, authentication working Status: AIA V2.0 core completed (85%)
998 lines
26 KiB
Markdown
998 lines
26 KiB
Markdown
# 撌亙<E6928C>C Day 3 撘<><E69298>𤏸恣<F0A48FB8>?- AI隞<49><E99A9E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>滚𦛚
|
||
|
||
> **<2A><>﹝<EFBFBD><EFB99D>𧋦**: V1.0
|
||
> **<2A>𥕦遣<F0A595A6>交<EFBFBD>**: 2025-12-06
|
||
> **撘<><E69298>𤑳𤌍<F0A491B3>?*: AI隞<49><E99A9E><EFBFBD><EFBFBD><EFBFBD> + Python<6F>扯<EFBFBD> + <20>芣<EFBFBD>靽格迤
|
||
> **憸<>恣撌交𧒄**: 5.5-6撠𤩺𧒄
|
||
> **靘肽<E99D98>**: Day 2撌脣<E6928C><E884A3>琜<EFBFBD>Session蝞∠<E89D9E>嚗?
|
||
|
||
---
|
||
|
||
## <20><> <20>詨<EFBFBD><E8A9A8>喟<EFBFBD><E5969F>餌<EFBFBD>
|
||
|
||
### <20>喟<EFBFBD>1: 撖寡<E69296>摮睃<E691AE><E79D83>孵<EFBFBD> <20>?
|
||
|
||
**<EFBFBD>寞<EFBFBD><EFBFBD>㗇𥋘**: <20>𥕦遣<F0A595A6>祉<EFBFBD>銵?`dc_tool_c_ai_history`
|
||
|
||
**<EFBFBD><EFBFBD>眏**:
|
||
- <20>芣䔉璅∪<E79285><E288AA>航<EFBFBD><E888AA>祉<EFBFBD><E7A589><EFBFBD><EFBFBD>格<EFBFBD><E6A0BC>祉<EFBFBD><E7A589>函蔡
|
||
- 蝚血<E89D9A>Schema<6D>𠉛氖<F0A0899B>笔<EFBFBD>
|
||
- Tool C<>厩鸌畾𠰴<E795BE>畾菟<E795BE>瘙<EFBFBD><E79899>code<64><65>xecuteResult嚗?
|
||
|
||
**<EFBFBD>唳旿摨廍chema**:
|
||
```prisma
|
||
model DcToolCAiHistory {
|
||
id String @id @default(uuid())
|
||
sessionId String // <20>唾<EFBFBD>Tool C Session
|
||
userId String
|
||
role String // user/assistant/system
|
||
content String @db.Text
|
||
|
||
// Tool C<>寞<EFBFBD>摮埈挾
|
||
generatedCode String? @db.Text // AI<41><49><EFBFBD><EFBFBD><EFBFBD>誨<EFBFBD>?
|
||
codeExplanation String? @db.Text // 隞<><E99A9E>閫<EFBFBD><E996AB>
|
||
executeStatus String? // success/failed/pending
|
||
executeResult Json? // <20>扯<EFBFBD>蝏𤘪<E89D8F>
|
||
executeError String? @db.Text // <20>躰秤靽⊥<E99DBD>
|
||
retryCount Int @default(0)
|
||
|
||
model String? // deepseek-v3
|
||
createdAt DateTime @default(now())
|
||
|
||
@@index([sessionId])
|
||
@@index([userId])
|
||
@@map("dc_tool_c_ai_history")
|
||
@@schema("dc_schema")
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### <20>喟<EFBFBD>2: AI隞<49><E99A9E><EFBFBD>扯<EFBFBD>瘚<EFBFBD><E7989A> <20>?
|
||
|
||
**<EFBFBD>寞<EFBFBD><EFBFBD>㗇𥋘**: <20>冽<EFBFBD>蝖株恕<E6A0AA>擧<EFBFBD>銵䕘<E98AB5><E49598>寞<EFBFBD>A嚗?
|
||
|
||
**瘚<><E7989A>**:
|
||
```
|
||
<EFBFBD>冽<EFBFBD>颲枏<EFBFBD><EFBFBD>芰<EFBFBD>霂剛<EFBFBD>
|
||
<20>?
|
||
AI<EFBFBD><EFBFBD><EFBFBD>隞<EFBFBD><EFBFBD> + 閫<><E996AB>
|
||
<20>?
|
||
<EFBFBD>滨垢撅閧內隞<EFBFBD><EFBFBD>嚗<EFBFBD><EFBFBD>鈭殷<EFBFBD>
|
||
<20>?
|
||
<EFBFBD>冽<EFBFBD><EFBFBD>孵稬"<22>扯<EFBFBD>"<22>厰僼 <20>?<3F>冽<EFBFBD>蝖株恕
|
||
<20>?
|
||
Python<EFBFBD>滚𦛚<EFBFBD>扯<EFBFBD>隞<EFBFBD><EFBFBD>
|
||
<20>?
|
||
餈𥪜<EFBFBD>蝏𤘪<EFBFBD> + <20>唳旿憸<E697BF><E686B8>嚗<EFBFBD><E59A97>50銵䕘<E98AB5>
|
||
```
|
||
|
||
**<EFBFBD><EFBFBD>眏**:
|
||
- <20>?<3F>冽<EFBFBD><E586BD>臬恣<E887AC>乩誨<E4B9A9><E8AAA8><EFBFBD>摰匧<E691B0><E58CA7>舀綉嚗?
|
||
- <20>?蝚血<E89D9A>"AI颲<49>𨭌"<22>屸<EFBFBD>"AI<41>芸𢆡"<22><><EFBFBD>雿?
|
||
- <20>?<3F>滢<EFBFBD><E6BBA2>扯<EFBFBD><E689AF>躰秤憌𡡞埯
|
||
|
||
---
|
||
|
||
### <20>喟<EFBFBD>3: System Prompt霈曇恣 <20>?
|
||
|
||
**<EFBFBD>寞<EFBFBD><EFBFBD>㗇𥋘**: 摰峕㟲<E5B395>?0銝東ew-shot蝷箔<E89DB7>
|
||
|
||
**蝷箔<E89DB7><E7AE94><EFBFBD><EFBFBD>**:
|
||
| 蝥批<E89DA5> | <20>圈<EFBFBD> | 蝷箔<E89DB7>蝻硋噡 | <20>箸艶 |
|
||
|------|------|---------|------|
|
||
| Level 1 | 2銝?| 1-2 | 蝻箏仃<E7AE8F>潛<EFBFBD>銝<EFBFBD><E98A9D><EFBFBD>㺭<EFBFBD>潭<EFBFBD>瘣?|
|
||
| Level 2 | 2銝?| 3-4 | 蝻𣇉<E89DBB><F0A38789><EFBFBD><EFBFBD>蝞?|
|
||
| Level 3 | 3銝?| 5-7 | BMI<4D><49>𠯫<EFBFBD>麄<EFBFBD><E9BA84><EFBFBD><EFBFBD>?|
|
||
| Level 4 | 3銝?| 8-10 | 蝞<><E89D9E>訫‵銵乓<E98AB5>?*憭𡁻<E686AD><F0A181BB>坿‘**<2A><>縧<EFBFBD>?|
|
||
|
||
**<EFBFBD>詨<EFBFBD>鈭桃<EFBFBD>**:
|
||
- <20>?<3F><>鉄蝻箏仃<E7AE8F>澆<EFBFBD><E6BE86><EFBFBD><EFBFBD>蝷箔<E89DB7>8嚗?
|
||
- <20>?<3F><>鉄憭𡁻<E686AD><F0A181BB>坿‘MICE嚗<45>內靘?嚗争<E59A97> <20>滨<EFBFBD>
|
||
- <20>?閬<><E996AC>隞𤾸抅蝖<E68A85><E89D96>圈<EFBFBD>蝥批<E89DA5>璇臬漲
|
||
|
||
**<EFBFBD><EFBFBD>﹝雿滨蔭**: [撌亙<EFBFBD>C_AI_Few-shot蝷箔<E89DB7>摨?md](./撌亙<E6928C>C_AI_Few-shot蝷箔<E89DB7>摨?md)
|
||
|
||
---
|
||
|
||
### <20>喟<EFBFBD>4: <20>唳旿<E594B3>嗆<EFBFBD><E59786>恣<EFBFBD>?<3F>?
|
||
|
||
**<EFBFBD>寞<EFBFBD><EFBFBD>㗇𥋘**: Python<6F><6E><EFBFBD>蝏湔擪嚗<E693AA>䲮獢㇃嚗?
|
||
|
||
**<EFBFBD>嗆<EFBFBD>**:
|
||
```
|
||
Session<EFBFBD>𥕦遣 <20>?<3F>唳旿<E594B3>㰘蝸<E3B098>訐ython<6F><6E><EFBFBD>
|
||
<20>?
|
||
AI<EFBFBD>滢<EFBFBD>1 <20>?靽格㺿<E6A0BC><E3BABF><EFBFBD>銝剔<E98A9D>DataFrame
|
||
<20>?
|
||
AI<EFBFBD>滢<EFBFBD>2 <20>?蝏抒賒靽格㺿DataFrame嚗<65>敞蝘荔<E89D98>
|
||
<20>?
|
||
AI<EFBFBD>滢<EFBFBD>N <20>?...
|
||
<20>?
|
||
<EFBFBD>冽<EFBFBD><EFBFBD>孵稬"撖澆枂" <20>?靽嘥<E99DBD><E598A5>記SS
|
||
```
|
||
|
||
**<EFBFBD><EFBFBD><EFBFBD>臬<EFBFBD>箏𦛚**:
|
||
- <20><> Python<6F>滚鍳隡帋腺憭梁𠶖<E6A281>?
|
||
- <20><> <20>芣䔉隡睃<E99AA1>嚗𡁏<E59A97>銋<EFBFBD><E98A8B><EFBFBD>訌edis<69>𤈛SS
|
||
- <20><> <20><>﹝雿滨蔭: [<EFBFBD><EFBFBD><EFBFBD>臬<EFBFBD>箏𦛚皜<EFBFBD><EFBFBD>](../07-<2D><><EFBFBD>臬<EFBFBD>箏𦛚/Tool-C<><43><EFBFBD>臬<EFBFBD>箏𦛚皜<F0A69B9A><E79A9C>.md)
|
||
|
||
---
|
||
|
||
### <20>喟<EFBFBD>5: AI<41>芣<EFBFBD>靽格迤<E6A0BC>箏<EFBFBD> <20>?
|
||
|
||
**<EFBFBD>寞<EFBFBD><EFBFBD>㗇𥋘**: <20><>憭?甈⊿<E79488>霂𤏪<E99C82><F0A48FAA>寞<EFBFBD>B嚗?
|
||
|
||
**瘚<><E7989A>**:
|
||
```python
|
||
attempt = 0
|
||
while attempt < 3:
|
||
# <20><><EFBFBD>隞<EFBFBD><E99A9E>
|
||
code = generate_code(user_message + error_feedback)
|
||
|
||
# <20>扯<EFBFBD>隞<EFBFBD><E99A9E>
|
||
result = execute_code(code)
|
||
|
||
if result.success:
|
||
return result # <20>?<3F>𣂼<EFBFBD>
|
||
|
||
error_feedback = result.error
|
||
attempt += 1
|
||
|
||
# <20>?3甈∩<E79488>憭梯揖嚗諹<E59A97><E8ABB9>𧼮<EFBFBD>憟賡<E6869F>霂?
|
||
return "<EFBFBD>扯<EFBFBD>憭梯揖嚗諹窈靚<EFBFBD>㟲<EFBFBD><EFBFBD>瘙<EFBFBD><EFBFBD><EFBFBD>滩<EFBFBD>"
|
||
```
|
||
|
||
---
|
||
|
||
### <20>喟<EFBFBD>6: LLM璅∪<E79285><E288AA>㗇𥋘 <20>?
|
||
|
||
**隡睃<E99AA1>雿輻鍂**: DeepSeek-V3
|
||
|
||
**<EFBFBD>滨蔭**:
|
||
```typescript
|
||
const llm = LLMFactory.createAdapter('deepseek-v3');
|
||
const response = await llm.chat(messages, {
|
||
temperature: 0.1, // 雿擧萱摨佗<E691A8>蝖桐<E89D96>隞<EFBFBD><E99A9E><EFBFBD><EFBFBD>&<EFBFBD>?
|
||
maxTokens: 2000, // 頞喳<E9A09E><E596B3><EFBFBD><EFBFBD>隞<EFBFBD><E99A9E>+閫<><E996AB>
|
||
topP: 0.9
|
||
});
|
||
```
|
||
|
||
**憭<><E686AD>㗇䲮獢?*:
|
||
- Qwen3-72B: 銝剜<E98A9D><E5899C><EFBFBD>圾<EFBFBD>游末
|
||
- GPT-5-Pro: 隞<><E99A9E>韐券<E99F90><E588B8><EFBFBD>擃矋<E69383><E79F8B>鞉𧋦擃矋<E69383>
|
||
|
||
---
|
||
|
||
### <20>喟<EFBFBD>7: 銝𠹺<E98A9D><F0A0B9BA><EFBFBD><EFBFBD><EFBFBD>?<3F>?
|
||
|
||
**<EFBFBD>滨蔭**: 隡𣳇<E99AA1>埝<EFBFBD>餈?頧桀笆霂?
|
||
|
||
**摰䂿緵**:
|
||
```typescript
|
||
async getConversationHistory(sessionId: string, limit: number = 5) {
|
||
return await prisma.dcToolCAiHistory.findMany({
|
||
where: { sessionId },
|
||
orderBy: { createdAt: 'desc' },
|
||
take: limit * 2, // user + assistant <20>𣂼笆
|
||
});
|
||
}
|
||
|
||
// <20><>遣瘨<E981A3><E798A8>銝𠹺<E98A9D><F0A0B9BA>?
|
||
const messages = [
|
||
{ role: 'system', content: systemPrompt },
|
||
...history.reverse(), // <20><>餈?頧?
|
||
{ role: 'user', content: userMessage }
|
||
];
|
||
```
|
||
|
||
---
|
||
|
||
### <20>喟<EFBFBD>8: <20>扯<EFBFBD>蝏𤘪<E89D8F>撅閧內 <20>?
|
||
|
||
**<EFBFBD>滨蔭**: 餈𥪜<E9A488><F0A5AA9C>?0銵屸<E98AB5>閫?
|
||
|
||
**<EFBFBD>笔<EFBFBD>**:
|
||
- 50銵諹雲憭<E99BB2>䰻<EFBFBD>𧢲㺭<F0A7A2B2>桀<EFBFBD><E6A180>?
|
||
- 銝滢<E98A9D>餈<EFBFBD>之敶勗<E695B6><E58B97>扯<EFBFBD>
|
||
- 蝚血<E89D9A><E8A180>餌<EFBFBD><E9A48C>唳旿<E594B3>箸艶嚗<E889B6><E59A97>𡁜虜<F0A1819C>惩<EFBFBD><E683A9>啣<EFBFBD><E595A3>曇<EFBFBD>嚗?
|
||
|
||
---
|
||
|
||
### <20>喟<EFBFBD>9: Few-shot蝷箔<E89DB7>蝖株恕 <20>?
|
||
|
||
**<EFBFBD><EFBFBD>蝏?0銝芰內靘?*:
|
||
1. 蝏煺<E89D8F>蝻箏仃<E7AE8F>潭<EFBFBD>霈?
|
||
2. <20>啣<EFBFBD>澆<EFBFBD>皜<EFBFBD><E79A9C>嚗<EFBFBD><E59A97>撉<EFBFBD><E69289>潛泵<E6BD9B>瑕<EFBFBD><E79195><EFBFBD><EFBFBD>
|
||
3. <20><>掩<EFBFBD>㗛<EFBFBD>蝻𣇉<E89DBB>嚗<EFBFBD><E59A97>批<EFBFBD><E689B9>?/0嚗?
|
||
4. 餈䂿賒<E482BF>㗛<EFBFBD><E3979B><EFBFBD>拳嚗<E68BB3>僑樴<E58391><E6A8B4>蝏<EFBFBD><E89D8F>
|
||
5. BMI霈∠<E99C88>銝𤾸<E98A9D>蝐?
|
||
6. <20>交<EFBFBD>霈∠<E99C88>嚗<EFBFBD><E59A97><EFBFBD>W予<EFBCB7>堆<EFBFBD>
|
||
7. <20>∩辣蝑偦<E89D91>㚁<EFBFBD><E39A81>亦<EFBFBD><E4BAA6><EFBFBD><EFBFBD>嚗?
|
||
8. 蝞<><E89D9E>閧撩憭勗<E686AD>澆‵銵伐<E98AB5>銝凋<E98A9D><E5878B>堆<EFBFBD>
|
||
9. **憭𡁻<E686AD><F0A181BB>坿‘MICE** 潃?<3F>詨<EFBFBD>
|
||
10. <20>箄<EFBFBD><E7AE84>駁<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>交<EFBFBD>靽萘<E99DBD><E89098><EFBFBD><EFBFBD>堆<EFBFBD>
|
||
|
||
---
|
||
|
||
## <20><>儭?<3F><><EFBFBD>舀沲<E88880><E6B2B2>挽霈?
|
||
|
||
### <20>港<EFBFBD><E6B8AF>嗆<EFBFBD>
|
||
|
||
```
|
||
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||
<EFBFBD>? Frontend (React) <20>?
|
||
<EFBFBD>? - 撖寡<E69296><E5AFA1>屸𢒰嚗㇍ool C銝梶鍂嚗? <20>?
|
||
<EFBFBD>? - 隞<><E99A9E>撅閧內嚗<E585A7><E59A97>鈭殷<E988AD> <20>?
|
||
<EFBFBD>? - <20>扯<EFBFBD><E689AF>厰僼 <20>?
|
||
<EFBFBD>? - 蝏𤘪<E89D8F>憸<EFBFBD><E686B8>嚗㇁G Grid嚗? <20>?
|
||
<EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>砂<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||
<20>?REST API
|
||
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>潑<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||
<EFBFBD>? Node.js Backend (Fastify) <20>?
|
||
<EFBFBD>? <20>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
|
||
<EFBFBD>? <20>?AICodeService <20>? <20>?
|
||
<EFBFBD>? <20>?- generateCode() <20>? <20>?
|
||
<EFBFBD>? <20>?- executeCode() <20>? <20>?
|
||
<EFBFBD>? <20>?- generateAndExecute() (撣阡<E692A3>霂? <20>? <20>?
|
||
<EFBFBD>? <20>?- getHistory() <20>? <20>?
|
||
<EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>砂<EFBFBD><E7A082><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>砂<EFBFBD><E7A082><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
|
||
<EFBFBD>? <20>? <20>? <20>?
|
||
<EFBFBD>? <20>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>潑<EFBFBD><E6BD91><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>潑<EFBFBD><E6BD91><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
|
||
<EFBFBD>? <20>?LLMFactory <20>? <20>?PythonExecutor<6F>? <20>?
|
||
<EFBFBD>? <20>?(<28>𡁶鍂撅<E98D82><E69285><EFBFBD>?<3F>? <20>?Service <20>? <20>?
|
||
<EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>砂<EFBFBD><E7A082><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
|
||
<EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>潑<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||
<20>?HTTP
|
||
<20>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>潑<EFBFBD><E6BD91><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||
<20>?Python Service (FastAPI) <20>?
|
||
<20>?- /api/dc/validate (AST璉<54><E79289>? <20>?
|
||
<20>?- /api/dc/execute (<28>扯<EFBFBD>隞<EFBFBD><E99A9E>) <20>?
|
||
<20>?- Session<6F>嗆<EFBFBD><E59786>恣<EFBFBD><E681A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗? <20>?
|
||
<20>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||
```
|
||
|
||
---
|
||
|
||
### <20>詨<EFBFBD><E8A9A8>滚𦛚霈曇恣
|
||
|
||
#### AICodeService (<28>啣遣嚗斋400銵?
|
||
|
||
```typescript
|
||
// backend/src/modules/dc/tool-c/services/AICodeService.ts
|
||
export class AICodeService {
|
||
|
||
// ==================== <20>詨<EFBFBD><E8A9A8>寞<EFBFBD> ====================
|
||
|
||
/**
|
||
* <20><><EFBFBD>Pandas隞<73><E99A9E>
|
||
* @param sessionId - Tool C Session ID
|
||
* @param userMessage - <20>冽<EFBFBD><E586BD>芰<EFBFBD>霂剛<E99C82><E5899B><EFBFBD>瘙?
|
||
* @returns { code, explanation, messageId }
|
||
*/
|
||
async generateCode(
|
||
sessionId: string,
|
||
userMessage: string
|
||
): Promise<GenerateCodeResult> {
|
||
// 1. <20>瑕<EFBFBD>Session靽⊥<E99DBD>嚗<EFBFBD>㺭<EFBFBD>桅<EFBFBD><E6A185><EFBFBD>㺭<EFBFBD>殷<EFBFBD>
|
||
const session = await sessionService.getSession(sessionId);
|
||
|
||
// 2. <20><>遣System Prompt嚗<74>鉄10銝東ew-shot嚗?
|
||
const systemPrompt = this.buildSystemPrompt(session);
|
||
|
||
// 3. <20>瑕<EFBFBD>撖寡<E69296><E5AFA1><EFBFBD>蟮嚗<E89FAE><E59A97>餈?頧殷<E9A0A7>
|
||
const history = await this.getHistory(sessionId, 5);
|
||
|
||
// 4. 靚<>鍂LLM嚗<4D><E59A97><EFBFBD>汪LMFactory嚗?
|
||
const llm = LLMFactory.createAdapter('deepseek-v3');
|
||
const response = await llm.chat([
|
||
{ role: 'system', content: systemPrompt },
|
||
...history,
|
||
{ role: 'user', content: userMessage }
|
||
], {
|
||
temperature: 0.1,
|
||
maxTokens: 2000
|
||
});
|
||
|
||
// 5. 閫<><E996AB>AI<41>𧼮<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>鈪ode<64>𨫪xplanation嚗?
|
||
const parsed = this.parseAIResponse(response.content);
|
||
|
||
// 6. 靽嘥<E99DBD><E598A5>唳㺭<E594B3>桀<EFBFBD>
|
||
const messageId = await this.saveMessages(
|
||
sessionId,
|
||
userMessage,
|
||
parsed.code,
|
||
parsed.explanation
|
||
);
|
||
|
||
return {
|
||
code: parsed.code,
|
||
explanation: parsed.explanation,
|
||
messageId
|
||
};
|
||
}
|
||
|
||
/**
|
||
* <20>扯<EFBFBD>Python隞<6E><E99A9E>
|
||
* @param sessionId - Tool C Session ID
|
||
* @param code - Python隞<6E><E99A9E>
|
||
* @param messageId - <20>唾<EFBFBD><E594BE><EFBFBD><EFBFBD><EFBFBD>涅D
|
||
* @returns { success, result, newDataPreview }
|
||
*/
|
||
async executeCode(
|
||
sessionId: string,
|
||
code: string,
|
||
messageId: string
|
||
): Promise<ExecuteCodeResult> {
|
||
// 1. 靚<>鍂Python<6F>滚𦛚<E6BB9A>扯<EFBFBD>
|
||
const result = await pythonExecutorService.executeCode(code, {
|
||
sessionId // Python<6F>滚𦛚蝏湔擪Session<6F>嗆<EFBFBD>?
|
||
});
|
||
|
||
// 2. <20>湔鰵瘨<E9B0B5><E798A8><EFBFBD>嗆<EFBFBD>?
|
||
await prisma.dcToolCAiHistory.update({
|
||
where: { id: messageId },
|
||
data: {
|
||
executeStatus: result.success ? 'success' : 'failed',
|
||
executeResult: result.data,
|
||
executeError: result.error
|
||
}
|
||
});
|
||
|
||
// 3. 憒<><E68692><EFBFBD>𣂼<EFBFBD>嚗諹繮<E8ABB9>𡝗鰵<F0A19D97>唳旿憸<E697BF><E686B8>嚗<EFBFBD><E59A97>50銵䕘<E98AB5>
|
||
if (result.success) {
|
||
const preview = result.data?.slice(0, 50);
|
||
return {
|
||
success: true,
|
||
result: result.data,
|
||
newDataPreview: preview
|
||
};
|
||
}
|
||
|
||
return {
|
||
success: false,
|
||
error: result.error
|
||
};
|
||
}
|
||
|
||
/**
|
||
* <20><><EFBFBD>撟嗆<E6929F>銵䕘<E98AB5>撣西䌊<E8A5BF>睲耨甇<E880A8><E79487>
|
||
* @param sessionId - Tool C Session ID
|
||
* @param userMessage - <20>冽<EFBFBD><E586BD><EFBFBD>瘙?
|
||
* @param maxRetries - <20><>憭折<E686AD>霂閙活<E99699>堆<EFBFBD>暺䁅恕3嚗?
|
||
* @returns { code, explanation, executeResult, retryCount }
|
||
*/
|
||
async generateAndExecute(
|
||
sessionId: string,
|
||
userMessage: string,
|
||
maxRetries: number = 3
|
||
): Promise<ProcessResult> {
|
||
let attempt = 0;
|
||
let lastError: string | null = null;
|
||
let generated: GenerateCodeResult | null = null;
|
||
|
||
while (attempt < maxRetries) {
|
||
try {
|
||
// <20><>遣撣阡<E692A3>霂臬<E99C82>擐<EFBFBD><E69390><EFBFBD>鞟內霂?
|
||
const enhancedMessage = attempt === 0
|
||
? userMessage
|
||
: `${userMessage}\n\n銝𦠜活<EFBFBD>扯<EFBFBD><EFBFBD>躰秤嚗?{lastError}\n霂瑚耨甇<EFBFBD>誨<EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
||
|
||
// <20><><EFBFBD>隞<EFBFBD><E99A9E>
|
||
generated = await this.generateCode(sessionId, enhancedMessage);
|
||
|
||
// <20>扯<EFBFBD>隞<EFBFBD><E99A9E>
|
||
const executeResult = await this.executeCode(
|
||
sessionId,
|
||
generated.code,
|
||
generated.messageId
|
||
);
|
||
|
||
if (executeResult.success) {
|
||
// <20>?<3F>𣂼<EFBFBD>
|
||
logger.info(`[AICodeService] <EFBFBD>扯<EFBFBD><EFBFBD>𣂼<EFBFBD>嚗<EFBFBD><EFBFBD>霂?{attempt + 1}甈∴<EFBFBD>`);
|
||
return {
|
||
...generated,
|
||
executeResult,
|
||
retryCount: attempt
|
||
};
|
||
}
|
||
|
||
// <20>?憭梯揖嚗<E68F96><E59A97>憭<EFBFBD><E686AD>霂?
|
||
lastError = executeResult.error || '<27>芰䰻<E88AB0>躰秤';
|
||
attempt++;
|
||
|
||
logger.warn(`[AICodeService] <EFBFBD>扯<EFBFBD>憭梯揖嚗<EFBFBD><EFBFBD>霂?{attempt}/${maxRetries}嚗? ${lastError}`);
|
||
|
||
} catch (error: any) {
|
||
logger.error(`[AICodeService] 撘<EFBFBD>虜: ${error.message}`);
|
||
lastError = error.message;
|
||
attempt++;
|
||
}
|
||
}
|
||
|
||
// 3甈∩<E79488>憭梯揖
|
||
throw new Error(
|
||
`隞<EFBFBD><EFBFBD><EFBFBD>扯<EFBFBD>憭梯揖嚗<EFBFBD>歇<EFBFBD>滩<EFBFBD>${maxRetries}甈∴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡡞<EFBFBD>霂荔<EFBFBD>${lastError}<EFBFBD><EFBFBD> +
|
||
`撱箄悅嚗朞窈靚<EFBFBD>㟲<EFBFBD><EFBFBD>瘙<EFBFBD><EFBFBD>餈唳<EFBFBD><EFBFBD>见𢆡靽格㺿隞<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
);
|
||
}
|
||
|
||
/**
|
||
* <20>瑕<EFBFBD>撖寡<E69296><E5AFA1><EFBFBD>蟮
|
||
*/
|
||
async getHistory(sessionId: string, limit: number = 5): Promise<Message[]> {
|
||
const records = await prisma.dcToolCAiHistory.findMany({
|
||
where: { sessionId },
|
||
orderBy: { createdAt: 'desc' },
|
||
take: limit * 2 // user + assistant <20>𣂼笆
|
||
});
|
||
|
||
return records.reverse().map(r => ({
|
||
role: r.role,
|
||
content: r.content
|
||
}));
|
||
}
|
||
|
||
// ==================== 颲<>𨭌<EFBFBD>寞<EFBFBD> ====================
|
||
|
||
/**
|
||
* <20><>遣System Prompt嚗<74>鉄10銝東ew-shot嚗?
|
||
*/
|
||
private buildSystemPrompt(session: SessionData): string {
|
||
return `雿䭾糓<EFBFBD>餌<EFBFBD>蝘𤑳<EFBFBD><EFBFBD>唳旿皜<EFBFBD><EFBFBD>銝枏振嚗諹<EFBFBD>韐<EFBFBD><EFBFBD><EFBFBD>辥andas隞<EFBFBD><EFBFBD><EFBFBD>交<EFBFBD>瘣埈㟲<EFBFBD><EFBFBD>㺭<EFBFBD>柴<EFBFBD>?
|
||
|
||
## 敶枏<EFBFBD><EFBFBD>唳旿<EFBFBD><EFBFBD>縑<EFBFBD>?
|
||
- <EFBFBD><EFBFBD>辣<EFBFBD>? ${session.fileName}
|
||
- 銵峕㺭: ${session.totalRows}
|
||
- <EFBFBD>埈㺭: ${session.totalCols}
|
||
- <EFBFBD>堒<EFBFBD>: ${session.columns.join(', ')}
|
||
|
||
## 摰匧<EFBFBD>閫<EFBFBD><EFBFBD>嚗<EFBFBD>撩<EFBFBD>塚<EFBFBD>
|
||
1. <EFBFBD>芾<EFBFBD><EFBFBD>滢<EFBFBD>df<EFBFBD>㗛<EFBFBD>嚗䔶<EFBFBD><EFBFBD>賭耨<EFBFBD>孵<EFBFBD>隞硋<EFBFBD><EFBFBD>?
|
||
2. 蝳<EFBFBD>迫撖澆<EFBFBD>os<EFBFBD><EFBFBD>ys<EFBFBD><EFBFBD>ubprocess蝑匧暒<EFBFBD>拇芋<EFBFBD>?
|
||
3. 蝳<EFBFBD>迫雿輻鍂eval<EFBFBD><EFBFBD>xec<EFBFBD><EFBFBD>_import__蝑匧暒<EFBFBD>拙遆<EFBFBD>?
|
||
4. 敹<EFBFBD>◆餈𥡝<EFBFBD>撘<EFBFBD>虜憭<EFBFBD><EFBFBD>
|
||
5. 餈𥪜<EFBFBD><EFBFBD>澆<EFBFBD>敹<EFBFBD>◆<EFBFBD>浥SON: {"code": "...", "explanation": "..."}
|
||
|
||
## Few-shot蝷箔<EFBFBD>
|
||
|
||
### 蝷箔<EFBFBD>1: 蝏煺<EFBFBD>蝻箏仃<EFBFBD>潭<EFBFBD>霈?
|
||
<EFBFBD>冽<EFBFBD>: <EFBFBD>𦠜<EFBFBD><EFBFBD>劐誨銵函撩憭梁<EFBFBD>蝚血噡嚗?<EFBFBD><EFBFBD><EFBFBD>霂艾<EFBFBD><EFBFBD>A<EFBFBD><EFBFBD>/A嚗厩<EFBFBD>銝<EFBFBD><EFBFBD>踵揢銝箸<EFBFBD><EFBFBD><EFBFBD>征<EFBFBD>?
|
||
隞<EFBFBD><EFBFBD>:
|
||
\`\`\`python
|
||
df = df.replace(['-', '銝滩祕', 'NA', 'N/A', '\\\\', '<27>芣䰻'], np.nan)
|
||
\`\`\`
|
||
霂湔<EFBFBD>: 撠<><E692A0>蝘滨撩憭勗<E686AD>潸”蝷箇<E89DB7>銝<EFBFBD>銝摸aN嚗䔶噶鈭𤾸<E988AD>蝏剔<E89D8F>霈∪<E99C88><E288AA>?
|
||
|
||
### 蝷箔<E89DB7>2: <20>啣<EFBFBD>澆<EFBFBD>皜<EFBFBD><E79A9C>
|
||
<EFBFBD>冽<EFBFBD>: <20>𡃏<EFBFBD><F0A1838F>𣂼<EFBFBD><F0A382BC>𣬚<EFBFBD><F0A3AC9A>墧㺭摮㛖泵<E39B96>瑕縧<E79195>㚁<EFBFBD><0.1<EFBFBD>?.05憭<EFBFBD><EFBFBD>嚗諹蓮銝箸㺭<EFBFBD>潛掩<EFBFBD>?
|
||
隞<EFBFBD><EFBFBD>:
|
||
\`\`\`python
|
||
df['creatinine'] = df['creatinine'].astype(str).str.replace('>', '').str.replace('<', '')
|
||
df.loc[df['creatinine'] == '0.1', 'creatinine'] = '0.05'
|
||
df['creatinine'] = pd.to_numeric(df['creatinine'], errors='coerce')
|
||
\`\`\`
|
||
霂湔<EFBFBD>: 璉<>撉𣬚<E69289><F0A3AC9A>唳旿撣詨鉄蝚血噡嚗屸<E59A97>皜<EFBFBD><E79A9C><EFBFBD>擧<EFBFBD><E693A7>質恣蝞?
|
||
|
||
[... 蝷箔<E89DB7>3-8 ...]
|
||
|
||
### 蝷箔<E89DB7>9: 憭𡁻<E686AD><F0A181BB>坿‘嚗㇈ICE嚗争<E59A97> <20>滨<EFBFBD>
|
||
<EFBFBD>冽<EFBFBD>: 雿輻鍂憭𡁻<E686AD><F0A181BB>坿‘瘜訫笆BMI<4D><49>僑樴<E58391><E6A8B4><EFBFBD><EFBFBD><EFBFBD>𣂼<EFBFBD><F0A382BC><EFBFBD>撩憭勗<E686AD>潸<EFBFBD>銵<EFBFBD>‵銵?
|
||
隞<EFBFBD><EFBFBD>:
|
||
\`\`\`python
|
||
from sklearn.experimental import enable_iterative_imputer
|
||
from sklearn.impute import IterativeImputer
|
||
|
||
# <20>㗇𥋘<E39787><F0A58B98>閬<EFBFBD><E996AC>銵亦<E98AB5><E4BAA6>啣<EFBFBD>澆<EFBFBD>
|
||
cols = ['BMI', 'age', 'creatinine']
|
||
|
||
# 憭𡁻<E686AD><F0A181BB>坿‘
|
||
imputer = IterativeImputer(max_iter=10, random_state=0)
|
||
df[cols] = imputer.fit_transform(df[cols])
|
||
\`\`\`
|
||
霂湔<EFBFBD>: <20>拍鍂<E68B8D>㗛<EFBFBD><E3979B>渡㮾<E6B8A1>單<EFBFBD>折<EFBFBD>瘚讠撩憭勗<E686AD>潘<EFBFBD>靽脲<E99DBD><E884B2>唳旿<E594B3><E697BF><EFBFBD><EFBFBD>孵<EFBFBD>嚗屸<E59A97><E5B1B8>鍂鈭穽AR嚗<52><E59A97><EFBFBD>箇撩憭梧<E686AD>
|
||
|
||
### 蝷箔<E89DB7>10: <20>箄<EFBFBD><E7AE84>駁<EFBFBD>
|
||
<EFBFBD>冽<EFBFBD>: <20>㗇<EFBFBD><E39787><EFBFBD>D<EFBFBD>駁<EFBFBD>嚗䔶<E59A97><E494B6>蹱<EFBFBD><E8B9B1>交𠯫<E4BAA4><F0A0AFAB><EFBFBD><EFBFBD>啁<EFBFBD>霈啣<E99C88>
|
||
隞<EFBFBD><EFBFBD>:
|
||
\`\`\`python
|
||
df['check_date'] = pd.to_datetime(df['check_date'])
|
||
df = df.sort_values('check_date').drop_duplicates(subset=['patient_id'], keep='last')
|
||
\`\`\`
|
||
霂湔<EFBFBD>: <20><><EFBFBD><EFBFBD>交<EFBFBD><E4BAA4>鍦<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>駁<EFBFBD>靽萘<E99DBD><E89098><EFBFBD><EFBFBD>𦒘<EFBFBD><F0A69298>∴<EFBFBD><E288B4><EFBFBD><EFBFBD>堆<EFBFBD>
|
||
|
||
## <20>冽<EFBFBD>敶枏<E695B6>霂瑟<E99C82>
|
||
霂瑟覔<EFBFBD>桐誑銝羓內靘见<EFBFBD>敶枏<EFBFBD><EFBFBD>唳旿<EFBFBD><EFBFBD>縑<EFBFBD>荔<EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞<EFBFBD><EFBFBD>撟嗉圾<EFBFBD>𨳍<EFBFBD>?
|
||
`;
|
||
}
|
||
|
||
/**
|
||
* 閫<><E996AB>AI<41>𧼮<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>鈪ode<64>𨫪xplanation嚗?
|
||
*/
|
||
private parseAIResponse(content: string): { code: string; explanation: string } {
|
||
try {
|
||
// <20>寞<EFBFBD>1嚗𡁜<E59A97>霂閗圾<E99697>軃SON
|
||
const json = JSON.parse(content);
|
||
if (json.code && json.explanation) {
|
||
return { code: json.code, explanation: json.explanation };
|
||
}
|
||
} catch {
|
||
// <20>寞<EFBFBD>2嚗𡁏迤<F0A1818F>蹱<EFBFBD><E8B9B1>碶誨<E7A2B6><E8AAA8><EFBFBD>
|
||
const codeMatch = content.match(/```python\n([\s\S]+?)\n```/);
|
||
const code = codeMatch ? codeMatch[1] : '';
|
||
|
||
// <20>𣂼<EFBFBD>閫<EFBFBD><E996AB>嚗<EFBFBD>誨<EFBFBD><E8AAA8><EFBFBD>銋见<E98A8B><E8A781><EFBFBD><EFBFBD><EFBFBD>穿<EFBFBD>
|
||
const explanation = content.replace(/```python[\s\S]+?```/g, '').trim();
|
||
|
||
if (code) {
|
||
return { code, explanation };
|
||
}
|
||
}
|
||
|
||
throw new Error('AI<41>𧼮<EFBFBD><F0A7BCAE>澆<EFBFBD><E6BE86>躰秤嚗峕<E59A97>瘜閙<E7989C><E99699>碶誨<E7A2B6>?);
|
||
}
|
||
|
||
/**
|
||
* 靽嘥<E99DBD>瘨<EFBFBD><E798A8><EFBFBD>唳㺭<E594B3>桀<EFBFBD>
|
||
*/
|
||
private async saveMessages(
|
||
sessionId: string,
|
||
userMessage: string,
|
||
code: string,
|
||
explanation: string
|
||
): Promise<string> {
|
||
// 靽嘥<E99DBD><E598A5>冽<EFBFBD>瘨<EFBFBD><E798A8>
|
||
await prisma.dcToolCAiHistory.create({
|
||
data: {
|
||
sessionId,
|
||
userId: 'test-user', // TODO: 隞𥣡WT<57>瑕<EFBFBD>
|
||
role: 'user',
|
||
content: userMessage
|
||
}
|
||
});
|
||
|
||
// 靽嘥<E99DBD>AI<41>𧼮<EFBFBD>
|
||
const assistantMessage = await prisma.dcToolCAiHistory.create({
|
||
data: {
|
||
sessionId,
|
||
userId: 'test-user',
|
||
role: 'assistant',
|
||
content: explanation,
|
||
generatedCode: code,
|
||
codeExplanation: explanation,
|
||
executeStatus: 'pending',
|
||
model: 'deepseek-v3'
|
||
}
|
||
});
|
||
|
||
return assistantMessage.id;
|
||
}
|
||
}
|
||
|
||
// 撖澆枂<E6BE86>蓥<EFBFBD>
|
||
export const aiCodeService = new AICodeService();
|
||
```
|
||
|
||
---
|
||
|
||
#### AIController (<28>啣遣嚗斋200銵?
|
||
|
||
```typescript
|
||
// backend/src/modules/dc/tool-c/controllers/AIController.ts
|
||
export class AIController {
|
||
|
||
/**
|
||
* POST /api/v1/dc/tool-c/ai/generate
|
||
* <20><><EFBFBD>隞<EFBFBD><E99A9E>嚗<EFBFBD><E59A97><EFBFBD>扯<EFBFBD>嚗?
|
||
*/
|
||
async generateCode(request: FastifyRequest, reply: FastifyReply) {
|
||
try {
|
||
const { sessionId, message } = request.body as any;
|
||
|
||
// <20><>㺭撉諹<E69289>
|
||
if (!sessionId || !message) {
|
||
return reply.code(400).send({
|
||
success: false,
|
||
error: '蝻箏<E89DBB>敹<EFBFBD><E695B9><EFBFBD><EFBFBD>㺭嚗窃essionId<49><64>essage'
|
||
});
|
||
}
|
||
|
||
// <20><><EFBFBD>隞<EFBFBD><E99A9E>
|
||
const result = await aiCodeService.generateCode(sessionId, message);
|
||
|
||
return reply.code(200).send({
|
||
success: true,
|
||
data: result
|
||
});
|
||
} catch (error: any) {
|
||
logger.error(`[AIController] generateCode憭梯揖: ${error.message}`);
|
||
return reply.code(500).send({
|
||
success: false,
|
||
error: error.message
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
* POST /api/v1/dc/tool-c/ai/execute
|
||
* <20>扯<EFBFBD>隞<EFBFBD><E99A9E>
|
||
*/
|
||
async executeCode(request: FastifyRequest, reply: FastifyReply) {
|
||
try {
|
||
const { sessionId, code, messageId } = request.body as any;
|
||
|
||
const result = await aiCodeService.executeCode(sessionId, code, messageId);
|
||
|
||
return reply.code(200).send({
|
||
success: true,
|
||
data: result
|
||
});
|
||
} catch (error: any) {
|
||
logger.error(`[AIController] executeCode憭梯揖: ${error.message}`);
|
||
return reply.code(500).send({
|
||
success: false,
|
||
error: error.message
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
* POST /api/v1/dc/tool-c/ai/process
|
||
* <20><><EFBFBD>撟嗆<E6929F>銵䕘<E98AB5>銝<EFBFBD>甇亙<E79487>雿㵪<E99BBF>撣阡<E692A3>霂𤏪<E99C82>
|
||
*/
|
||
async process(request: FastifyRequest, reply: FastifyReply) {
|
||
try {
|
||
const { sessionId, message, maxRetries = 3 } = request.body as any;
|
||
|
||
const result = await aiCodeService.generateAndExecute(
|
||
sessionId,
|
||
message,
|
||
maxRetries
|
||
);
|
||
|
||
return reply.code(200).send({
|
||
success: true,
|
||
data: result
|
||
});
|
||
} catch (error: any) {
|
||
logger.error(`[AIController] process憭梯揖: ${error.message}`);
|
||
return reply.code(500).send({
|
||
success: false,
|
||
error: error.message
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
* GET /api/v1/dc/tool-c/ai/history/:sessionId
|
||
* <20>瑕<EFBFBD>撖寡<E69296><E5AFA1><EFBFBD>蟮
|
||
*/
|
||
async getHistory(
|
||
request: FastifyRequest<{ Params: { sessionId: string } }>,
|
||
reply: FastifyReply
|
||
) {
|
||
try {
|
||
const { sessionId } = request.params;
|
||
|
||
const history = await aiCodeService.getHistory(sessionId, 10);
|
||
|
||
return reply.code(200).send({
|
||
success: true,
|
||
data: { history }
|
||
});
|
||
} catch (error: any) {
|
||
logger.error(`[AIController] getHistory憭梯揖: ${error.message}`);
|
||
return reply.code(500).send({
|
||
success: false,
|
||
error: error.message
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
export const aiController = new AIController();
|
||
```
|
||
|
||
---
|
||
|
||
## <20><> 撘<><E69298>𤏸恣<F0A48FB8>?
|
||
|
||
### <20>嗆挾1: <20>唳旿摨栞挽霈∴<E99C88>30<33><30><EFBFBD>嚗争蝱 09:00-09:30
|
||
|
||
**隞餃𦛚皜<F0A69B9A><E79A9C>**:
|
||
- [ ] <20>湔鰵 `backend/prisma/schema.prisma`嚗<EFBFBD>溶<EFBFBD>痃cToolCAiHistory璅∪<EFBFBD>嚗?
|
||
- [ ] <20>𥕦遣<F0A595A6>唳旿摨栞<E691A8>蝘餉<E89D98><E9A489>?`create-tool-c-ai-history-table.mjs`
|
||
- [ ] <20>扯<EFBFBD>餈<EFBFBD>宏嚗<E5AE8F><E59A97>撱箄”嚗?
|
||
- [ ] 撉諹<E69289>銵函<E98AB5><E587BD>?
|
||
- [ ] <20><><EFBFBD>Prisma Client (`npx prisma generate`)
|
||
|
||
**鈭支<E988AD><E694AF>?*:
|
||
- <20>?`dc_schema.dc_tool_c_ai_history` 銵典<E98AB5>撱箸<E692B1><E7AEB8>?
|
||
- <20>?Prisma Client<6E>湔鰵摰峕<E691B0>
|
||
|
||
---
|
||
|
||
### <20>嗆挾2: AICodeService摰䂿緵嚗?撠𤩺𧒄嚗争蝱 09:30-11:30
|
||
|
||
**隞餃𦛚皜<F0A69B9A><E79A9C>**:
|
||
- [ ] <20>𥕦遣 `AICodeService.ts` <20>箇<EFBFBD>蝏𤘪<E89D8F>
|
||
- [ ] 摰䂿緵 `buildSystemPrompt()` - 10銝東ew-shot蝷箔<E89DB7><E7AE94><EFBFBD><EFBFBD>
|
||
- [ ] 摰䂿緵 `generateCode()` - AI<41><49><EFBFBD>隞<EFBFBD><E99A9E>
|
||
- [ ] 摰䂿緵 `parseAIResponse()` - 閫<><E996AB>AI<41>𧼮<EFBFBD>
|
||
- [ ] 摰䂿緵 `executeCode()` - <20>扯<EFBFBD>Python隞<6E><E99A9E>
|
||
- [ ] 摰䂿緵 `generateAndExecute()` - <20><><EFBFBD>+<2B>扯<EFBFBD>+<2B>滩<EFBFBD>
|
||
- [ ] 摰䂿緵 `getHistory()` - <20>瑕<EFBFBD>撖寡<E69296><E5AFA1><EFBFBD>蟮
|
||
- [ ] 摰䂿緵 `saveMessages()` - 靽嘥<E99DBD>瘨<EFBFBD><E798A8><EFBFBD>唳㺭<E594B3>桀<EFBFBD>
|
||
- [ ] 瘛餃<E7989B>摰峕㟲<E5B395>躰秤憭<E7A7A4><E686AD><EFBFBD>峕𠯫敹?
|
||
|
||
**鈭支<E988AD><E694AF>?*:
|
||
- <20>?`AICodeService.ts` 摰峕㟲摰䂿緵嚗ǚ400銵䕘<E98AB5>
|
||
- <20>?<3F>訫<EFBFBD>瘚贝<E7989A><E8B49D>朞<EFBFBD>
|
||
|
||
---
|
||
|
||
### <20>嗆挾3: AIController摰䂿緵嚗?撠𤩺𧒄嚗争蝱 11:30-12:30
|
||
|
||
**隞餃𦛚皜<F0A69B9A><E79A9C>**:
|
||
- [ ] <20>𥕦遣 `AIController.ts`
|
||
- [ ] 摰䂿緵 `POST /ai/generate` - <20><><EFBFBD>隞<EFBFBD><E99A9E>
|
||
- [ ] 摰䂿緵 `POST /ai/execute` - <20>扯<EFBFBD>隞<EFBFBD><E99A9E>
|
||
- [ ] 摰䂿緵 `POST /ai/process` - 銝<>甇亙<E79487>雿?
|
||
- [ ] 摰䂿緵 `GET /ai/history/:sessionId` - 撖寡<E69296><E5AFA1><EFBFBD>蟮
|
||
- [ ] 瘛餃<E7989B><E9A483><EFBFBD>㺭撉諹<E69289>
|
||
- [ ] 瘛餃<E7989B><E9A483>躰秤憭<E7A7A4><E686AD>
|
||
|
||
**鈭支<E988AD><E694AF>?*:
|
||
- <20>?`AIController.ts` 摰峕㟲摰䂿緵嚗ǚ200銵䕘<E98AB5>
|
||
- <20>?4銝服PI蝡舐<E89DA1>撠梁貌
|
||
|
||
---
|
||
|
||
### <20><><EFBFBD> <20>?12:30-13:30
|
||
|
||
---
|
||
|
||
### <20>嗆挾4: 頝舐眏<E88890>滨蔭嚗?5<><35><EFBFBD>嚗争蝱 13:30-13:45
|
||
|
||
**隞餃𦛚皜<F0A69B9A><E79A9C>**:
|
||
- [ ] <20>湔鰵 `routes/index.ts`
|
||
- [ ] 瘜典<E7989C>AI<41>詨<EFBFBD>頝舐眏
|
||
- [ ] 瘚贝<E7989A>頝舐眏<E88890>航挪<E888AA>格<EFBFBD>?
|
||
|
||
**鈭支<E988AD><E694AF>?*:
|
||
- <20>?AI頝舐眏瘜典<E7989C>摰峕<E691B0>
|
||
- <20>?Swagger<65><72>﹝<EFBFBD>湔鰵嚗<E9B0B5><E59A97><EFBFBD>㚁<EFBFBD>
|
||
|
||
---
|
||
|
||
### <20>嗆挾5: 瘚贝<E7989A>撉峕𤣰嚗?.5撠𤩺𧒄嚗争蝱 13:45-15:15
|
||
|
||
#### 5.1 <20>箇<EFBFBD>瘚贝<E7989A>嚗?0<><30><EFBFBD>嚗?
|
||
|
||
**瘚贝<E7989A><E8B49D>其<EFBFBD>**:
|
||
1. [ ] 瘚贝<E7989A>1: 蝏煺<E89D8F>蝻箏仃<E7AE8F>潭<EFBFBD>霈?
|
||
2. [ ] 瘚贝<E7989A>2: <20>啣<EFBFBD>澆<EFBFBD>皜<EFBFBD><E79A9C>
|
||
3. [ ] 瘚贝<E7989A>3: <20>批<EFBFBD>蝻𣇉<E89DBB>
|
||
4. [ ] 瘚贝<E7989A>4: 撟湧<E6929F><E6B9A7><EFBFBD><EFBFBD>
|
||
|
||
**撉峕𤣰<E5B395><F0A4A3B0><EFBFBD>**:
|
||
- AI<41>賣迤蝖桃<E89D96><E6A183>𣂷誨<F0A382B7>?
|
||
- 隞<><E99A9E><EFBFBD>舀<EFBFBD>銵?
|
||
- 蝏𤘪<E89D8F>蝚血<E89D9A>憸<EFBFBD><E686B8>
|
||
|
||
#### 5.2 銝剔漣瘚贝<E7989A>嚗?0<><30><EFBFBD>嚗?
|
||
|
||
**瘚贝<E7989A><E8B49D>其<EFBFBD>**:
|
||
5. [ ] 瘚贝<E7989A>5: BMI霈∠<E99C88>
|
||
6. [ ] 瘚贝<E7989A>6: 雿誯堺憭拇㺭霈∠<E99C88>
|
||
7. [ ] 瘚贝<E7989A>7: <20>∩辣蝑偦<E89D91>?
|
||
|
||
#### 5.3 擃条漣瘚贝<E7989A>嚗?0<><30><EFBFBD>嚗?
|
||
|
||
**瘚贝<E7989A><E8B49D>其<EFBFBD>**:
|
||
8. [ ] 瘚贝<E7989A>8: 銝凋<E98A9D><E5878B>啣‵銵?
|
||
9. [ ] 瘚贝<E7989A>9: 憭𡁻<E686AD><F0A181BB>坿‘MICE 潃?
|
||
10. [ ] 瘚贝<E7989A>10: <20>箄<EFBFBD><E7AE84>駁<EFBFBD>
|
||
|
||
#### 5.4 <20>寞<EFBFBD>瘚贝<E7989A>嚗?0<><30><EFBFBD>嚗?
|
||
|
||
**瘚贝<E7989A><E8B49D>其<EFBFBD>**:
|
||
11. [ ] <20>芣<EFBFBD>靽格迤瘚贝<E7989A>嚗<EFBFBD><E59A97><EFBFBD>誯<EFBFBD>霂荔<E99C82>撉諹<E69289><E8ABB9>滩<EFBFBD><E6BBA9>箏<EFBFBD>嚗?
|
||
12. [ ] 颲寧<E9A2B2>瘚贝<E7989A>嚗<EFBFBD><E59A97>銝滚<E98A9D><E6BB9A>具<EFBFBD><E585B7><EFBFBD><EFBFBD>函撩憭梁<E686AD>嚗?
|
||
13. [ ] 撟嗅<E6929F>瘚贝<E7989A>嚗<EFBFBD><E59A97><EFBFBD>冽<EFBFBD><E586BD>峕𧒄雿輻鍂嚗?
|
||
14. [ ] 蝡臬<E89DA1>蝡舀<E89DA1>霂𤏪<E99C82>銝𠹺<E98A9D><F0A0B9BA>𡒶I憭<49><E686AD><EFBFBD>垍<EFBFBD><E59E8D>𣈯<EFBFBD>霂<EFBFBD><E99C82>
|
||
|
||
**鈭支<E988AD><E694AF>?*:
|
||
- <20>?瘚贝<E7989A><E8B49D>𡁏𧋦 `test-tool-c-day3.mjs`
|
||
- <20>?瘚贝<E7989A><E8B49D>亙<EFBFBD>嚗<EFBFBD><E59A97>朞<EFBFBD><E69C9E><EFBFBD>竉90%嚗?
|
||
|
||
---
|
||
|
||
### <20>嗆挾6: <20><>﹝銝𦒘<E98A9D><F0A69298>吔<EFBFBD>30<33><30><EFBFBD>嚗争蝱 15:15-15:45
|
||
|
||
**隞餃𦛚皜<F0A69B9A><E79A9C>**:
|
||
- [ ] <20>𥕦遣<F0A595A6><E981A3><EFBFBD>臬<EFBFBD>箏𦛚皜<F0A69B9A><E79A9C> `Tool-C<><43><EFBFBD>臬<EFBFBD>箏𦛚皜<F0A69B9A><E79A9C>.md`
|
||
- [ ] <20>湔鰵璅∪<E79285><E288AA>嗆<EFBFBD><E59786><EFBFBD>獢?`00-撌亙<E6928C>C敶枏<E695B6><E69E8F>嗆<EFBFBD><E59786><EFBFBD>撘<EFBFBD><E69298>烐<EFBFBD><E78390>?md`
|
||
- [ ] <20>𥕦遣Day 3撘<33><E69298>穃<EFBFBD><E7A983>鞉<EFBFBD>餌<EFBFBD>
|
||
- [ ] <20>𣂷漱Git撟嗆綫<E59786>?
|
||
|
||
**鈭支<E988AD><E694AF>?*:
|
||
- <20>?<3F><><EFBFBD>臬<EFBFBD>箏𦛚<E7AE8F><F0A69B9A>﹝
|
||
- <20>?Day 3撘<33><E69298>𤏸扇敶?
|
||
- <20>?Git<69>𣂷漱<F0A382B7>𣂼<EFBFBD>
|
||
|
||
---
|
||
|
||
## <20>㴓 撉峕𤣰<E5B395><F0A4A3B0><EFBFBD>
|
||
|
||
### <20>蠘<EFBFBD>撉峕𤣰
|
||
|
||
| <20>蠘<EFBFBD> | 撉峕𤣰<E5B395><F0A4A3B0><EFBFBD> | <20>嗆<EFBFBD>?|
|
||
|------|---------|------|
|
||
| AI隞<49><E99A9E><EFBFBD><EFBFBD><EFBFBD> | 10銝芰內靘见㦤<E8A781>?00%<25>舐<EFBFBD><E88890>鞉迤蝖桐誨<E6A190>?| <20>賂<EFBFBD> |
|
||
| 隞<><E99A9E><EFBFBD>扯<EFBFBD> | <20><><EFBFBD><EFBFBD><EFBFBD>誨<EFBFBD><E8AAA8>虾<EFBFBD>𣂼<EFBFBD><F0A382BC>扯<EFBFBD> | <20>賂<EFBFBD> |
|
||
| <20>芣<EFBFBD>靽格迤 | 憭梯揖<E6A2AF>舘<EFBFBD><E88898>芸𢆡<E88AB8>滩<EFBFBD>嚗<EFBFBD><E59A97>憭?甈∴<E79488> | <20>賂<EFBFBD> |
|
||
| 撖寡<E69296><E5AFA1><EFBFBD>蟮 | <20>質繮<E8B3AA>𡝗<EFBFBD>餈?頧桀笆霂?| <20>賂<EFBFBD> |
|
||
| <20>唳旿憸<E697BF><E686B8> | <20>扯<EFBFBD><E689AF>舘<EFBFBD><E88898>𧼮<EFBFBD>50銵屸<E98AB5>閫?| <20>賂<EFBFBD> |
|
||
|
||
### <20><><EFBFBD>舫<EFBFBD><E888AB>?
|
||
|
||
| <20><><EFBFBD> | <20>格<EFBFBD> | <20>嗆<EFBFBD>?|
|
||
|------|------|------|
|
||
| 隞<><E99A9E>韐券<E99F90> | <20><>ypeScript<70>躰秤 | <20>賂<EFBFBD> |
|
||
| 鈭穃<E988AD><E7A983>蠘<EFBFBD><E8A098>?| 100%蝚血<E89D9A> | <20>賂<EFBFBD> |
|
||
| <20>躰秤憭<E7A7A4><E686AD> | <20><><EFBFBD>匧<EFBFBD>撣賊<E692A3><E8B38A>匧<EFBFBD><E58CA7>?| <20>賂<EFBFBD> |
|
||
| <20>亙<EFBFBD>摰峕㟲<E5B395>?| <20>喲睸<E596B2>滢<EFBFBD><E6BBA2>賣<EFBFBD><E8B3A3>亙<EFBFBD> | <20>賂<EFBFBD> |
|
||
| 瘚贝<E7989A>閬<EFBFBD><E996AC><EFBFBD>?| <20>?0% | <20>賂<EFBFBD> |
|
||
|
||
### <20>扯<EFBFBD>撉峕𤣰
|
||
|
||
| <20><><EFBFBD> | <20>格<EFBFBD> | <20>嗆<EFBFBD>?|
|
||
|------|------|------|
|
||
| AI<41><49><EFBFBD><EFBFBD>園𡢿 | <5蝘?| <20>賂<EFBFBD> |
|
||
| 隞<><E99A9E><EFBFBD>扯<EFBFBD><E689AF>園𡢿 | <3蝘𡜐<E89D98>蝞<EFBFBD><E89D9E>閙<EFBFBD>雿頣<E99BBF> | <20>賂<EFBFBD> |
|
||
| 蝡臬<E89DA1>蝡舀𧒄<E88880>?| <10蝘?| <20>賂<EFBFBD> |
|
||
|
||
---
|
||
|
||
## <20>𣑐 鈭支<E988AD>皜<EFBFBD><E79A9C>
|
||
|
||
### 隞<><E99A9E><EFBFBD><EFBFBD>辣嚗?銝迎<E98A9D>
|
||
|
||
1. <20>?`backend/prisma/schema.prisma` - <20>啣<EFBFBD>DcToolCAiHistory璅∪<E79285>
|
||
2. <20>?`backend/scripts/create-tool-c-ai-history-table.mjs` - 撱箄”<E7AE84>𡁏𧋦
|
||
3. <20>?`backend/src/modules/dc/tool-c/services/AICodeService.ts` - 400銵?
|
||
4. <20>?`backend/src/modules/dc/tool-c/controllers/AIController.ts` - 200銵?
|
||
5. <20>?`backend/src/modules/dc/tool-c/routes/index.ts` - <20>湔鰵
|
||
6. <20>?`backend/test-tool-c-day3.mjs` - 瘚贝<E7989A><E8B49D>𡁏𧋦
|
||
|
||
### <20><>﹝<EFBFBD><EFB99D>辣嚗?銝迎<E98A9D>
|
||
|
||
1. <20>?`撌亙<E6928C>C_AI_Few-shot蝷箔<E89DB7>摨?md` - 10銝芰內靘贝祕閫?
|
||
2. <20>?`撌亙<E6928C>C_Day3撘<33><E69298>𤏸恣<F0A48FB8>?md` - <20>祆<EFBFBD>獢?
|
||
3. <20>?`Tool-C<><43><EFBFBD>臬<EFBFBD>箏𦛚皜<F0A69B9A><E79A9C>.md` - 敺<><E695BA><EFBFBD>㚚★
|
||
4. <20>?`2025-12-06_撌亙<E6928C>C_Day3撘<33><E69298>穃<EFBFBD><E7A983>鞉<EFBFBD>餌<EFBFBD>.md` - <20>餌<EFBFBD><E9A48C>亙<EFBFBD>
|
||
|
||
---
|
||
|
||
## <20><> <20>詨<EFBFBD><E8A9A8><EFBFBD>﹝
|
||
|
||
- [撌亙<EFBFBD>C_AI_Few-shot蝷箔<E89DB7>摨?md](./撌亙<E6928C>C_AI_Few-shot蝷箔<E89DB7>摨?md)
|
||
- [撌亙<EFBFBD>C_MVP撘<EFBFBD><EFBFBD>𤏸恣<EFBFBD>𦚱V1.0.md](./撌亙<E6928C>C_MVP撘<50><E69298>𤏸恣<F0A48FB8>𦚱V1.0.md)
|
||
- [<EFBFBD>𡁶鍂撖寡<EFBFBD><EFBFBD>滚𦛚<EFBFBD>賢<EFBFBD>霈∪<EFBFBD>.md](../../../08-憿寧𤌍蝞∠<E89D9E>/05-<2D><><EFBFBD>臬<EFBFBD>箏𦛚/<2F>𡁶鍂撖寡<E69296><E5AFA1>滚𦛚<E6BB9A>賢<EFBFBD>霈∪<E99C88>.md)
|
||
- [鈭穃<EFBFBD><EFBFBD>笔<EFBFBD><EFBFBD>𤏸<EFBFBD><EFBFBD>?md](../../../04-撘<><E69298>𤏸<EFBFBD><F0A48FB8>?08-鈭穃<E988AD><E7A983>笔<EFBFBD><E7AC94>𤏸<EFBFBD><F0A48FB8>?md)
|
||
|
||
---
|
||
|
||
## <20><> 憌𡡞埯蝞∠<E89D9E>
|
||
|
||
### 憌𡡞埯1: AI<41><49><EFBFBD>隞<EFBFBD><E99A9E>韐券<E99F90>銝滨迅摰?
|
||
|
||
**摨𥪜笆<F0A5AA9C>芣鴌**:
|
||
- <20>?雿輻鍂10銝東ew-shot蝷箔<E89DB7><E7AE94>𣂼<EFBFBD>韐券<E99F90>
|
||
- <20>?<3F>滢<EFBFBD>temperature<72>?.1
|
||
- <20>?摰墧鴌3甈⊿<E79488>霂閙㦤<E99699>?
|
||
- <20>?瘛餃<E7989B>AST<53>蹱<EFBFBD><E8B9B1><EFBFBD><EFBFBD>伐<EFBFBD>Python<6F>滚𦛚嚗?
|
||
|
||
### 憌𡡞埯2: LLM靚<4D>鍂頞<E98D82>𧒄
|
||
|
||
**摨𥪜笆<F0A5AA9C>芣鴌**:
|
||
- <20>?霈曄蔭<E69B84><E894AD><EFBFBD><EFBFBD><EFBFBD>imeout嚗?0蝘𡜐<E89D98>
|
||
- <20>?<3F>滨垢<E6BBA8>曄內<E69B84>㰘蝸<E3B098>嗆<EFBFBD>?
|
||
- <20>?瘛餃<E7989B><E9A483>滩<EFBFBD><E6BBA9>箏<EFBFBD>
|
||
|
||
### 憌𡡞埯3: Python<6F>扯<EFBFBD>憭梯揖
|
||
|
||
**摨𥪜笆<F0A5AA9C>芣鴌**:
|
||
- <20>?AI<41>芣<EFBFBD>靽格迤嚗<E8BFA4><E59A97>憭?甈∴<E79488>
|
||
- <20>?<3F>见末<E8A781>躰秤<E8BAB0>鞟內
|
||
- <20>?撱箄悅<E7AE84>冽<EFBFBD>靚<EFBFBD>㟲<EFBFBD><E39FB2>瘙?
|
||
|
||
---
|
||
|
||
## <20><> 憸<><E686B8><EFBFBD>鞉<EFBFBD>
|
||
|
||
**Day 3摰峕<E691B0><E5B395>?*:
|
||
- <20>?Tool C<>冽<EFBFBD><E586BD>舫<EFBFBD>朞<EFBFBD><E69C9E>芰<EFBFBD>霂剛<E99C82>皜<EFBFBD><E79A9C><EFBFBD>唳旿
|
||
- <20>?AI<41>賜<EFBFBD><E8B39C>?0%<25>箸艶<E7AEB8><E889B6>迤蝖桐誨<E6A190>?
|
||
- <20>?憭梯揖<E6A2AF>箸艶<E7AEB8>㕑䌊<E39591>券<EFBFBD>霂閙㦤<E99699>?
|
||
- <20>?摰峕㟲<E5B395><E39FB2>笆霂嘥<E99C82><E598A5>脩恣<E884A9>?
|
||
|
||
**<EFBFBD>港<EFBFBD>餈𥕦漲**:
|
||
- Day 1: Python敺格<E695BA><E6A0BC>?<3F>?
|
||
- Day 2: Session蝞∠<E89D9E> <20>?
|
||
- Day 3: AI隞<49><E99A9E><EFBFBD><EFBFBD><EFBFBD> <20>賂<EFBFBD>
|
||
- Day 4-5: <20>滨垢撘<E59EA2><E69298>?
|
||
- Day 6: 蝡臬<E89DA1>蝡舀<E89DA1>霂?
|
||
|
||
---
|
||
|
||
## <20><> <20>湔鰵霈啣<E99C88>
|
||
|
||
| <20>交<EFBFBD> | <20><>𧋦 | <20>湔鰵<E6B994><E9B0B5>捆 | <20>湔鰵鈭?|
|
||
|------|------|---------|--------|
|
||
| 2025-12-06 | V1.0 | <20>嘥<EFBFBD><E598A5>𥕦遣嚗峕<E59A97>蝖?憭批<E686AD>蝑硋<E89D91>撘<EFBFBD><E69298>𤏸恣<F0A48FB8>?| AI Assistant |
|
||
|
||
---
|
||
|
||
**<EFBFBD><EFBFBD>﹝<EFBFBD>嗆<EFBFBD>?*: <20>?撌脩&霈?
|
||
**銝衤<E98A9D>甇?*: 撘<>憪𧢲<E686AA>銵<EFBFBD><E98AB5><EFBFBD>𤏸恣<F0A48FB8>𡜐<EFBFBD>憸<EFBFBD>恣5.5-6撠𤩺𧒄嚗?
|
||
|
||
**<EFBFBD><EFBFBD><EFBFBD>撘<EFBFBD>憪见<EFBFBD><EFBFBD>𡢅<EFBFBD>** <20><>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|