ð¥ ä» MySQL å° MilvusïŒçš AI æ¥è®°æ¬é¡¹ç®ææåéæ°æ®åºå RAG
æèŠïŒäœ è¿åšçš
WHERE content LIKE '%å ³é®è¯%'æçŽ¢ææ¬ïŒå€ªèœåäºïŒæ¬æçšäžäžªãAI æ¥è®°æ¬ã项ç®ïŒåžŠäœ ä»é¶ææåéæ°æ®åº Milvus å RAGïŒè®©äœ ç AI åºçšçæ£æ¥æ"è®°å¿"ã
ð åèš
äžåšæäžªéæ±ïŒçšæ·èŸå ¥äžå¥è¯ïŒç³»ç»èŠä»å åæ¡æ¥è®°éæŸå°è¯ä¹æçžå ³çå æ¡ã
æç¬¬äžååºæ¯ MySQL å šææçŽ¢ïŒäœåŸå¿«åç°äžå¯¹ïŒ
| çšæ·æçŽ¢ | æ¥è®°åæ | MySQL ç»æ |
|---|---|---|
| "å¿æ å¥œçæ¥å" | "ä»å€©é³å æåªïŒå»å ¬åæ£æ¥äº" | â æäžå° |
| "åæååºå»ç©" | "åšæ«åå¥ä»¬å¿å»ç¬å±±äº" | â æäžå° |
| "å·¥äœåå倧" | "ä»å€©deadlineïŒç¯çå ç" | â æäžå° |
å ³é®è¯å®å šå¯¹äžäžïŒäœè¯ä¹äžé«åºŠçžå ³ïŒ
è¿å°±æ¯äŒ ç»æ°æ®åºççç¹ ââ å®åªèœååé¢å¹é ïŒçè§£äžäºè¯ä¹ã
çŽå°ææ¥è§Šäº Milvus åéæ°æ®åº + RAGïŒæåç°ïŒåæ¥ AI åºçšç"è®°å¿"å¯ä»¥è¿æ ·åã
ð¯ æ¬æéåè°
- æ Node.js åºç¡ïŒæ³äºè§£åéæ°æ®åºçå端/å šæ åŒåè
- å¬è¿ RAG äœäžç¥éæä¹èœå°çååŠ
- æ³ç»èªå·±ç AI åºçšå "é¿æè®°å¿"çåŒåè
ð å ææïŒä»ä¹æ¯åéæ°æ®åºïŒ
çšåŸä¹ŠéŠç±»æ¯
æ³è±¡äœ å»åŸä¹ŠéŠæŸä¹ŠïŒ
| æ¹åŒ | MySQL | Milvus |
|---|---|---|
| æä¹æŸ | æä¹ŠåãISBN æ¥ïŒç²Ÿç¡®å¹é ïŒ | åè¯ç®¡çå"ææ³çäžæ¬å ³äºå€ç¬çç§å¹»å°è¯Ž"ïŒè¯ä¹å¹é ïŒ |
| åºå±é»èŸ | WHERE title = 'äžäœ' | æäœ çæè¿°åæ¯æ¬ä¹Šç"è¯ä¹æçº¹"åçžäŒŒåºŠè®¡ç® |
| æ é¿ | ç»æåæ°æ®ç粟确æ¥è¯¢ | éç»æåæ°æ®çæš¡ç³è¯ä¹æ£çŽ¢ |
æ žå¿æŠå¿µïŒEmbeddingïŒåéåïŒ
åéæ°æ®åºççµéæ¯ Embedding ââ æä»»æææ¬åæäžç»æ°åïŒåéïŒïŒ
"ä»å€©å¿æ
åŸå¥œ" â [0.12, -0.34, 0.56, ..., 0.78] ïŒ1024 äžªæµ®ç¹æ°ïŒ
"åŒå¿çäžå€©" â [0.11, -0.33, 0.55, ..., 0.77] ïŒè¯ä¹çžè¿ïŒæ°å乿¥è¿ïŒ
"项ç®äžçº¿äº" â [0.89, 0.12, -0.45, ..., 0.23] ïŒè¯ä¹äžåïŒæ°åå·®è·å€§ïŒ
è¯ä¹çžè¿çææ¬ïŒåéåšç©ºéŽäžçè·çŠ»ä¹è¿ ââ è¿å°±æ¯åéæçŽ¢çåçã
ð¡ 䞺ä»ä¹éèŠ EmbeddingïŒ å äžºè®¡ç®æºäžæäžæïŒäœå®ææ°åãEmbedding å°±æ¯æäººç±»è¯èšç¿»è¯æè®¡ç®æºèœçè§£ç"è¯ä¹åæ "ã
ð ïž é¡¹ç®å®æïŒAI æ¥è®°æ¬
ðР宿޿ºç ïŒGitee - milvus-demo/demo2/src
åŠä¹ 路线åŸïŒ4 䞪æä»¶çéè¿é»èŸ
æä»¬çš 4 䞪æä»¶ïŒåŸªåºæžè¿å°åŠä¹ ïŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â 第 1 æ¥ïŒmain.mjs â å
çš"åæ°æ®"è·éæå°éç¯ â
â ç®çïŒçè§£ Milvus çæ žå¿æäœïŒå»ºè¡š â ææ°æ® â æçŽ¢ â
â ç¹ç¹ïŒæå 4 绎åéïŒå¿«ééªè¯æµçš â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â 第 2 æ¥ïŒindex.mjs â çšç宿°æ® + Embedding æš¡ååå
¥ â
â ç®çïŒåŠäŒçš Embedding æš¡åèªåšçæåé â
â ç¹ç¹ïŒä»"åæ°æ®"å级å°"ç宿¥è®°æ°æ®" â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â 第 3 æ¥ïŒquery.mjs â çšèªç¶è¯èšæçŽ¢æ¥è®° â
â ç®çïŒåŠäŒçšèªç¶è¯èšæ£çŽ¢åéæ°æ® â
â ç¹ç¹ïŒæçŽ¢"æ·å€æŽ»åš"èœæŸå°"ç¬å±±"å"å
¬åæ£æ¥" â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â 第 4 æ¥ïŒrag.mjs â æ£çŽ¢ + LLM = AI æ¥è®°å©æ â
â ç®çïŒææ£çŽ¢ç»æåç» LLMïŒçææºèœåç â
â ç¹ç¹ïŒå®æŽ RAG æµçšïŒAI çæ£"读æ"äºäœ çæ¥è®° â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
端å°ç«¯æ°æ®æµïŒä»ææ¬å°åç
åšåŒå§å代ç ä¹åïŒå çææŽäžªæ°æ®æµïŒ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â æ°æ®åå
¥é¶æ®µïŒindex.mjsïŒ â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â â
â æ¥è®°ææ¬ïŒ"ä»å€©å€©æ°åŸå¥œïŒå»å
¬åæ£æ¥äº" â
â â â
â ⌠â
â âââââââââââââââââââââââââââââââ â
â â Embedding æš¡å â ææ¬ â åé â
â â text-embedding-3-small â â
â ââââââââââââââââ¬âââââââââââââââ â
â ⌠â
â åéïŒ[0.12, -0.34, 0.56, ..., 0.78]ïŒ1536 ç»ŽïŒ â
â â â
â ⌠â
â âââââââââââââââââââââââââââââââ â
â â Milvus åéæ°æ®åº â ååšåé + å
æ°æ® â
â â ai_dairy éå â â
â âââââââââââââââââââââââââââââââ â
â â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â æ£çŽ¢ + çæé¶æ®µïŒrag.mjsïŒ â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â â
â çšæ·æé®ïŒ"ææè¿åäºä»ä¹è®©ææå°å¿«ä¹çäºæ
ïŒ" â
â â â
â ⌠â
â âââââââââââââââââââââââââââââââ â
â â Embedding æš¡å â æé®é¢ä¹èœ¬æåé â
â ââââââââââââââââ¬âââââââââââââââ â
â ⌠â
â é®é¢åéïŒ[0.15, -0.32, 0.58, ..., 0.76] â
â â â
â ⌠â
â âââââââââââââââââââââââââââââââ â
â â Milvus æ£çŽ¢ â æŸå°æçžäŒŒç 2 æ¡æ¥è®° â
â â COSINE çžäŒŒåºŠæçŽ¢ â â
â ââââââââââââââââ¬âââââââââââââââ â
â ⌠â
â æ£çŽ¢ç»æïŒ â
â - æ¥è®°1ïŒ"ä»å€©å€©æ°åŸå¥œïŒå»å
¬åæ£æ¥äº"ïŒçžäŒŒåºŠ 0.89ïŒ â
â - æ¥è®°2ïŒ"åšæ«åæåå»ç¬å±±"ïŒçžäŒŒåºŠ 0.85ïŒ â
â â â
â ⌠â
â âââââââââââââââââââââââââââââââ â
â â æŒæ¥ Prompt â æ¥è®°å
容 + é®é¢ â å®æŽæç€ºè¯ â
â ââââââââââââââââ¬âââââââââââââââ â
â ⌠â
â âââââââââââââââââââââââââââââââ â
â â LLM çæ â AI åºäºæ¥è®°å
容çæåç â
â ââââââââââââââââ¬âââââââââââââââ â
â ⌠â
â "ä»äœ çæ¥è®°æ¥çïŒæè¿è®©äœ å¿«ä¹çäºæ
æïŒ â
â 1. å»å
¬åæ£æ¥ïŒæåæ¥å€©ççŸå¥œ â
â 2. åæåç¬å±±ïŒäº«åæ·å€æ¶å
" â
â â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ð¡ 䞺ä»ä¹éèŠè¿äžªæµçšïŒ å 䞺 LLM èªå·±æ²¡æäœ çæ¥è®°æ°æ®ïŒå®äŒ"å¹»è§"ãRAG 让 AI å æ¥èµæååçïŒä¿è¯åçææ®å¯äŸã
1ïžâ£ main.mjs â Milvus å ¥éšïŒå è·éæå°éç¯
䞺ä»ä¹èŠä»è¿éåŒå§ïŒ å 䞺åšçšç宿°æ®ä¹åïŒå çš"åæ°æ®"éªè¯æµç𿝿å®å šçãå°±ååŠåèå çšäŸ¿å®é£æç»æïŒå«äžäžæ¥å°±çšåçã
è¿æ¥ Zilliz Cloud
import { MilvusClient, IndexType, MetricType } from "@zilliz/milvus2-sdk-node";
const client = new MilvusClient({
address: process.env.MILVUS_ADDRESS, // Zilliz Cloud å°å
token: process.env.MILVUS_TOKEN // API Key
});
// æ£æ¥è¿æ¥
const checkHealth = await client.checkHealth();
console.log(checkHealth.isHealthy ? 'â
è¿æ¥æå' : 'â è¿æ¥å€±èŽ¥');
ð¡ Zilliz Cloud æ¯ Milvus çå šæç®¡äºæå¡ïŒäžçšèªå·±éšçœ²ïŒæ³šåå°±èœçšã
å建éåïŒç±»äŒŒ MySQL 建衚ïŒ
await client.createCollection({
collection_name: 'test',
dimension: 4, // åé绎床ïŒè¿éçš 4 绎æ¹äŸ¿æŒç€º
auto_id: true // èªåšçæ ID
});
åå»ºçŽ¢åŒ ââ 䞺ä»ä¹éèŠïŒ
没æçŽ¢åŒæ¶ïŒæçŽ¢èŠéäžè®¡ç®ææåéççžäŒŒåºŠïŒæ¶éŽå€æåºŠ O(n)ãæ°æ®é倧äºå°±æ ¢åŸçŠ»è°±ã
IVF_FLAT 玢åŒçåç类䌌åŸä¹ŠéŠååºïŒ
没æçŽ¢åŒïŒåšæŽæ 楌éäžæ¬æ¬ç¿» â O(n)
æçŽ¢åŒïŒ å
å»"æåŠåº"ïŒåæŸ"ç§å¹»" â è¿äŒŒ O(1)
await client.createIndex({
collection_name: 'test',
field_name: 'vector',
index_type: IndexType.AUTOINDEX,
metric_type: MetricType.COSINE // çšäœåŒŠçžäŒŒåºŠ
});
æå ¥åæçŽ¢
// æå
¥æ°æ®ïŒæåšæå®ç 4 绎åéïŒ
const data = [
{ vector: [0.1, 0.2, 0.3, 0.4], content: 'è¿æ¯ç¬¬äžæ¡æ°æ®' },
{ vector: [0.5, 0.6, 0.7, 0.8], content: 'è¿æ¯ç¬¬äºæ¡æ°æ®' }
];
await client.insert({ collection_name: 'test', data });
// æçŽ¢ïŒæŸå [0.5, 0.5, 0.6, 0.8] æçžäŒŒç 2 æ¡
const searchRes = await client.search({
collection_name: 'test',
data: [[0.5, 0.5, 0.6, 0.8]],
limit: 2,
output_fields: ['content']
});
console.log('æçŽ¢ç»æïŒ', searchRes.results);
å°è¿éïŒäœ å·²ç»çè§£äº Milvus çæ žå¿äžæ¿æ§ïŒå»ºéå â ææ°æ® â æçŽ¢ã
2ïžâ£ index.mjs â çš Embedding æš¡ååå ¥ç宿°æ®
䞺ä»ä¹èŠå级å°è¿äžæ¥ïŒ å 䞺æååéäžç°å®ãå®é 项ç®äžïŒäœ éèŠçš Embedding æš¡åèªåšæææ¬èœ¬æåéã
å®ä¹éåç»æ
import { DataType } from "@zilliz/milvus2-sdk-node";
await client.createCollection({
collection_name: 'ai_dairy',
fields: [
{ name: 'id', data_type: DataType.VarChar, max_length: 50, is_primary_key: true },
{ name: 'vector', data_type: DataType.FloatVector, dim: 1024 }, // 1024 绎ïŒ
{ name: 'content', data_type: DataType.VarChar, max_length: 5000 },
{ name: 'date', data_type: DataType.VarChar, max_length: 50 },
{ name: 'mood', data_type: DataType.VarChar, max_length: 50 },
{ name: 'tags', data_type: DataType.Array, element_type: DataType.VarChar, max_capacity: 10 }
]
});
è· MySQL 建衚å ä¹äžæ ·ïŒåªæ¯å€äºäžäžª
FloatVectorç±»åçvectoråæ®µã
EmbeddingïŒææ¬ â åé
import { OpenAIEmbeddings } from '@langchain/openai';
const embedding = new OpenAIEmbeddings({
apiKey: process.env.OPENAI_API_KEY,
model: process.env.EMBEDDINGS_MODEL_NAME // æ¯åŠ text-embedding-3-small
});
const getEmbedding = async (text) => {
return await embedding.embedQuery(text); // äžæ®µææ¬ â 1024 绎åé
};
ð¡ 䞺ä»ä¹èŠçš Embedding æš¡åïŒ å 䞺å®èœæ"è¯ä¹"çŒç ææ°åãæåšååéæ æ³ææè¯ä¹ä¿¡æ¯ã
å倿¥è®°æ°æ® + åå ¥
const diaryContents = [
{ id: 'diary_001', content: 'ä»å€©å€©æ°åŸå¥œïŒå»å
¬åæ£æ¥äºïŒå¿æ
æå¿«ã', date: '2026-01-10', mood: 'happy', tags: ['çæŽ»', 'æ£æ¥'] },
{ id: 'diary_002', content: 'ä»å€©å·¥äœåŸå¿ïŒå®æäºäžäžªéèŠç项ç®éçšç¢ã', date: '2026-01-11', mood: 'excited', tags: ['å·¥äœ', 'æå°±'] },
{ id: 'diary_003', content: 'åšæ«åæåå»ç¬å±±ïŒå€©æ°åŸå¥œïŒå¿æ
ä¹åŸæŸæŸã', date: '2026-01-12', mood: 'relaxed', tags: ['æ·å€', 'æå'] },
{ id: 'diary_004', content: 'ä»å€©åŠä¹ äº Milvus åéæ°æ®åºïŒæè§åŸæææã', date: '2026-01-12', mood: 'curious', tags: ['åŠä¹ ', 'ææ¯'] },
{ id: 'diary_005', content: 'æäžåäºäžé¡¿äž°ççæé€ïŒå°è¯äºæ°èè°±ã', date: '2026-01-13', mood: 'proud', tags: ['çŸé£', 'å®¶åº'] }
];
// ç»æ¯æ¡æ¥è®°å äžåé
const diaryData = await Promise.all(
diaryContents.map(async (diary) => ({
...diary,
vector: await getEmbedding(diary.content) // èªåšçæåé
}))
);
// æ¹éæå
¥
const insertResult = await client.insert({
collection_name: 'ai_dairy',
data: diaryData
});
console.log('â
', insertResult.insert_cnt, 'æ¡è®°åœæåæå
¥ã');
// éèŠïŒæå
¥åéæ°å 蜜éåïŒ
await client.loadCollection({ collection_name: 'ai_dairy' });
å ³é®æµçšïŒ
ææ¬æ¥è®° â Embedding æš¡å â 1024 绎åé â åå
¥ Milvus
3ïžâ£ query.mjs â çšèªç¶è¯èšæçŽ¢æ¥è®°
䞺ä»ä¹èŠåç¬è®²æçŽ¢ïŒ å 䞺åå ¥åæçŽ¢æ¯äž€äžªç¬ç«çæäœãåå ¥æ¯äžæ¬¡æ§çïŒæçŽ¢æ¯å®æ¶çãèäžæçŽ¢æ¶å"æçšæ·é®é¢ä¹èœ¬æåé"è¿äžªå ³é®æ¥éª€ã
// çšæ·è¯Žäºäžå¥è¯
const query = 'ææ³ççå
³äºæ·å€æŽ»åšçæ¥è®°';
// 1. ææ¥è¯¢ææ¬ä¹èœ¬æåéïŒè¿äžæ¥åŸå
³é®ïŒïŒ
const queryVector = await getEmbedding(query);
// 2. å» Milvus éæŸæçžäŒŒç 2 æ¡
const searchResult = await client.search({
collection_name: 'ai_dairy',
vector: queryVector,
limit: 2,
metric_type: MetricType.COSINE,
output_fields: ['id', 'content', 'date', 'mood', 'tags']
});
// 3. æå°ç»æ
console.log('ð æçŽ¢ç»æïŒ\n');
searchResult.results.forEach((item, index) => {
console.log(`${index + 1}. [Score: ${item.score.toFixed(4)}]`);
console.log(` å
容ïŒ${item.content}`);
console.log(` å¿æ
ïŒ${item.mood}`);
console.log(` æ¥æïŒ${item.date}\n`);
});
èŸåºå€§æŠæ¯ïŒ
ð æçŽ¢ç»æïŒ
1. [Score: 0.8923]
å
容ïŒåšæ«åæåå»ç¬å±±ïŒå€©æ°åŸå¥œïŒå¿æ
ä¹åŸæŸæŸã
å¿æ
ïŒrelaxed
æ¥æïŒ2026-01-12
2. [Score: 0.8156]
å
容ïŒä»å€©å€©æ°åŸå¥œïŒå»å
¬åæ£æ¥äºïŒå¿æ
æå¿«ã
å¿æ
ïŒhappy
æ¥æïŒ2026-01-10
çšæ·è¯Ž"æ·å€æŽ»åš"ïŒç³»ç»æŸå°äº"ç¬å±±"å"å ¬åæ£æ¥" ââ æ²¡æä»»äœå ³é®è¯å¹é ïŒçº¯é è¯ä¹çè§£ïŒ
4ïžâ£ rag.mjs â æ£çŽ¢ + LLM = AI æ¥è®°å©æ
䞺ä»ä¹èŠå RAGïŒ å äžºå æ£çŽ¢è¿äžå€ãçšæ·é®"ææè¿å¿«ä¹åïŒ"ïŒäœ äžèœåªè¿åå æ¡æ¥è®°ïŒèæ¯èŠè®© AI åæè¿äºæ¥è®°ïŒç»åºäžäžªææž©åºŠçåçã
ä»ä¹æ¯ RAGïŒ
RAG = RetrievalïŒæ£çŽ¢ïŒ+ AugmentedïŒå¢åŒºïŒ+ GenerationïŒçæïŒ
çšåŸä¹ŠéŠç±»æ¯ïŒ
1. æ£çŽ¢ïŒRetrievalïŒ ïŒå»åŸä¹ŠéŠæŸå æ¬çžå
³ç乊
2. å¢åŒºïŒAugmentedïŒ ïŒæä¹Šç¿»å°çžå
³é¡µé¢ïŒæŸåšæ¡äž
3. çæïŒGenerationïŒ ïŒè®© AI ççè¿äºä¹Šæ¥åçé®é¢
没æ RAGïŒAI åªèœé èªå·±ç"è®°å¿"åçïŒå¯èœè¡è¯Žå «éïŒå¹»è§ïŒã æäº RAGïŒAI å æ¥èµæååçïŒæçææ®ã
æš¡åäžïŒæ£çŽ¢ïŒRetrievalïŒ
async function retrieveRelevantDiaries(question, k = 2) {
const queryVector = await getEmbedding(question);
const searchResult = await client.search({
collection_name: 'ai_dairy',
limit: k,
metric_type: MetricType.COSINE,
vector: queryVector,
output_fields: ['id', 'content', 'date', 'mood', 'tags']
});
return searchResult.results;
}
è¿äžæ¥å°±æ¯åé¢ query.mjs åçäº ââ æŸå°æçžå ³ç k æ¡æ¥è®°ã
æš¡åäºïŒå¢åŒºïŒAugmentedïŒ
// ææ£çŽ¢å°çæ¥è®°æŒæäžæ®µ"äžäžæ"
function buildContext(retrievedDiaries) {
return retrievedDiaries.map((diary, i) => `
[æ¥è®° ${i + 1}]
æ¥æïŒ${diary.date}
å¿æ
ïŒ${diary.mood}
æ çŸïŒ${diary.tags?.join(', ')}
å
容ïŒ${diary.content}
`).join('\n----\n');
}
䞺ä»ä¹èŠæŒæ¥äžäžæïŒ å 䞺 LLM éèŠ"åèèµæ"æèœåç¡®åçãå°±åäœ åçé®é¢æ¶ïŒèåžäŒç»äœ äžäºåèææã
æš¡åäžïŒçæïŒGenerationïŒ
async function generateAnswer(question, context) {
const prompt = `äœ æ¯äžäžªæž©æèŽŽå¿çAIæ¥è®°å©æã
åºäºçšæ·çæ¥è®°å
容åçé®é¢ïŒçšäº²åèªç¶çè¯èšã
è¯·æ ¹æ®ä»¥äžæ¥è®°å
容åçé®é¢ïŒ
${context}
çšæ·é®é¢ïŒ${question}
åçèŠæ±ïŒ
1. åŠææ¥è®°äžæçžå
³ä¿¡æ¯ïŒè¯·ç»åæ¥è®°å
容ç»åºè¯Šç»ãæž©æçåçã
2. å¯ä»¥æ»ç»å€ç¯æ¥è®°çå
å®¹ïŒæŸåºå
±åç¹æè¶å¿ã
3. åŠææ¥è®°äžæ²¡æçžå
³ä¿¡æ¯ïŒè¯·æž©ååç¥çšæ·ã
4. çšç¬¬äºäººç§°"äœ "æ¥ç§°åŒæ¥è®°çäœè
ã
5. åçèŠæåçå¿ïŒè®©çšæ·æå°è¢«çè§£åå
³å¿ã
AI 婿åçïŒ`;
const response = await model.invoke(prompt);
return response.content;
}
宿Žè°çšæµçš
// RAG 宿޿µçš
async function aiDiaryAssistant(question) {
console.log(`\nð çšæ·æé®ïŒ${question}\n`);
// 1. æ£çŽ¢
console.log('ð æ£åšæ£çŽ¢çžå
³æ¥è®°...');
const retrievedDiaries = await retrieveRelevantDiaries(question, k = 3);
// 2. æå»ºäžäžæ
const context = buildContext(retrievedDiaries);
// 3. çæåç
console.log('ð€ AI æ£åšçæåç...\n');
const answer = await generateAnswer(question, context);
console.log('ð¡ AI åçïŒ');
console.log(answer);
return answer;
}
// æµè¯
await aiDiaryAssistant('ææè¿åäºä»ä¹è®©ææå°å¿«ä¹çäºæ
ïŒ');
èŸåºç€ºäŸïŒ
ð çšæ·æé®ïŒææè¿åäºä»ä¹è®©ææå°å¿«ä¹çäºæ
ïŒ
ð æ£åšæ£çŽ¢çžå
³æ¥è®°...
ð€ AI æ£åšçæåç...
ð¡ AI åçïŒ
ä»äœ çæ¥è®°æ¥çïŒæè¿è®©äœ æå°å¿«ä¹çäºæ
æïŒ
1. **å»å
¬åæ£æ¥**ïŒ1æ10æ¥ïŒââ äœ æå°"倩æ°åŸå¥œïŒå¿æ
æå¿«"ïŒçåŸåºæ¥äœ åŸäº«å亲è¿èªç¶çæ¶å
ã
2. **åæåç¬å±±**ïŒ1æ12æ¥ïŒââ åšæ«åæåäžèµ·æ·å€æŽ»åšïŒäœ 诎"å¿æ
ä¹åŸæŸæŸ"ïŒåæ
åè¿åšéœè®©äœ åŒå¿ã
3. **å°è¯æ°èè°±**ïŒ1æ13æ¥ïŒââ äœ äžºèªå·±åäºäžé¡¿äž°ççæé€ïŒè¿ç§èªæç
§é¡Ÿçå°ç¡®å¹žä¹åŸçèŽµå¢ ð
çåŸåºæ¥äœ æ¯äžäžªçç±ç掻ãæåŸäº«ååœäžç人ãç»§ç»ä¿æè¿ä»œå¯¹ç掻ççæ
å§ïŒ
ð¡ å ³é®ææ¯ç¹æ»ç»
| æŠå¿µ | äžå¥è¯è§£é | åšé¡¹ç®äžçäœçš |
|---|---|---|
| Milvus | äžéšå忥åéçæ°æ®åº | ååšæ¥è®°çåé衚瀺 |
| Embedding | ææ¬ â æ°åæ°ç» | ææ¥è®°åé®é¢èœ¬æåé |
| COSINE çžäŒŒåºŠ | è¡¡é䞀䞪åéæ¹åççžäŒŒçšåºŠ | æŸå°è¯ä¹æçžå ³çæ¥è®° |
| IVF_FLAT çŽ¢åŒ | èç°çŽ¢åŒïŒå éæçŽ¢ | 让æçŽ¢æŽå¿« |
| RAG | æ£çŽ¢ + LLM çæ | 让 AI åºäºæ¥è®°å 容åç |
| Zilliz Cloud | Milvus çå šæç®¡äºæå¡ | å å»éšçœ²çŠæŒ |
ð èž©åè®°åœ
å 1ïŒæ¥å° 0 æ¡æ°æ®
ç°è±¡ïŒinsert æææåäºïŒsearch è¿å空æ°ç»ã
åå ïŒloadCollection åš insert ä¹åè°çšäºïŒæ°æå
¥çæ°æ®æ²¡æè¢«å 蜜å°å
åã
è§£å³ïŒæå
¥æ°æ®åïŒéæ°è°çš loadCollectionïŒ
await client.insert({ collection_name: 'ai_dairy', data: diaryData });
await client.loadCollection({ collection_name: 'ai_dairy' }); // éæ°å 蜜ïŒ
é¢é²ïŒå »æä¹ æ¯ïŒæ¯æ¬¡ insert åéœ load äžæ¬¡ã
å 2ïŒoutput_fields åæ®µåæŒé
ç°è±¡ïŒè¿åçåæ®µåŒå
𿝠undefinedã
åå ïŒoutput_fields éåçæ¯ 'data'ïŒå®é
åæ®µåæ¯ 'date'ã
è§£å³ïŒä»ç»æ£æ¥éåçåæ®µå®ä¹ïŒå«æŒéã
é¢é²ïŒå€å¶å段åïŒäžèŠææã
å 3ïŒåé绎床äžå¹é
ç°è±¡ïŒå建éåæ¶ dim: 1024ïŒäœ Embedding æš¡åçæçåéç»ŽåºŠäžæ¯ 1024ã
è§£å³ïŒç¡®ä¿ dim åæ°å Embedding æš¡åèŸåºç绎床äžèŽãåžžçšæš¡åç绎床ïŒ
| æš¡å | 绎床 |
|---|---|
| text-embedding-3-small | 1536 |
| text-embedding-3-large | 3072 |
| text-embedding-ada-002 | 1536 |
é¢é²ïŒåšå建éååïŒå è°çšäžæ¬¡ Embedding API 确讀èŸåºç»ŽåºŠã
ð åèèµæ
ð¬ 亀æµè®šè®º
äœ åšé¡¹ç®äžçšè¿åéæ°æ®åºåïŒææ²¡æéå°ä»ä¹åïŒæ¬¢è¿è¯è®ºåºäº€æµïŒ
è§åŸæçšïŒç¹äžªèµ ð æ¶è â å ³æ³š ðïŒåç»äŒæŽæ°æŽå€ AI 宿å 容ïŒ