Files
AIclinicalresearch/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Day3开发计划.md
HaHafeng 1b53ab9d52 feat(aia): Complete AIA V2.0 with universal streaming capabilities
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%)
2026-01-14 19:15:01 +08:00

998 lines
26 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 撌亙<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><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><>