å客ï¼https://wenjie.blog.csdn.net/
ä½è ï¼è¾æç¼ç¨
æé³ï¼è¾æç¼ç¨ï¼å ³æ³¨æå享å°ç¥è¯
ä»ç»ï¼è®¡ç®æºç¡å£«ï¼10ï¼å·¥ä½ç»éªï¼ææ¯å产åè´è´£äººï¼ç°å°±èBAT大åä¸çº¿ææ¯ä¸å®¶ã
èµæè·åï¼è¯·å¤§å®¶æ¥çæç« ææ«å°¾ã
å¦å®æ¨å°æ¶è·
ä»0å°1æå»ºåºäºææ¬è¯ä¹çæºè½é®çæºå¨äºº
äºè§£æºè½é®çç³»ç»å·¥ä¸åºç¨åææ¯æ¹æ¡
ææ¡ææ¬åéåæç´¢å¼æå¨å·¥ä¸çåºç¨
ææ¡ææ¬è¯ä¹å¹é æ£ç´¢ç³»ç»å®ç°
ææ¡ææ¬è¯ä¹çFAQæºè½é®çå®ç°
éå人群ï¼
NLPç®æ³å·¥ç¨å¸ï¼æ³äºè§£æºè½é®çç³»ç»ä»ä¸äººåï¼è½¯ä»¶ç å人åç
ç®æ ï¼
ææ¡ä»0å°1æå»ºåºäºææ¬è¯ä¹çæºè½é®çæºå¨äººï¼ææ¡BERT模ååFaissç®æ³åºå¨é¡¹ç®çåºç¨
æ¬é¡¹ç®ç»å Facebook AI ç ç©¶é¢å¼æºçé对èç±»åç¸ä¼¼æ§æç´¢åºFaiss ãGoogleæä¾çBERT模åå®ç°ä¸ä¸ªåºäºææ¬è¯ä¹çæºè½é®çç³»ç»ãéè¿é¡¹ç®æ¡ä¾ä»0å°1æå»ºFAQæºè½é®çæºå¨äººï¼è®©å¤§å®¶è½»æ¾ææ¡ ææ¬è¯ä¹ç¸ä¼¼åº¦ææ¬æ£ç´¢ç³»ç»åFAQé®çæºå¨äººå¨å·¥ä¸çåºç¨ã
1 å¼ç¯ä»ç»
é®çç³»ç»æ¯èªç¶è¯è¨å¤çé¢åä¸ä¸ªå¾ç»å ¸çé®é¢ï¼å®ç¨äºåç人们以èªç¶è¯è¨å½¢å¼æåºçé®é¢ï¼æç广æ³çåºç¨ã
ç»å ¸åºç¨åºæ¯å æ¬ï¼æºè½è¯é³äº¤äºãå¨çº¿å®¢æãç¥è¯è·åãæ æç±»è天çã
常è§çåç±»æï¼çæåãæ£ç´¢åé®çç³»ç»ï¼åè½®é®çãå¤è½®é®çç³»ç»ï¼é¢å弿¾é¢åãç¹å®é¢åçé®çç³»ç»ã
æ¬ææ¶åçä¸»è¦æ¯å¨æ£ç´¢åãé¢åç¹å®é¢åçé®çç³»ç»ââæºè½å®¢ææºå¨äººã
ä¼ ç»å®¢ææºå¨äººçæå»ºæµç¨
é常éè¦å°ç¸å ³é¢åçç¥è¯ï¼Domain Knowledgeï¼ï¼è½¬å为ä¸ç³»åçè§ååç¥è¯å¾è°±ãæå»ºè¿ç¨ä¸é度ä¾èµâäººå·¥âæºè½ï¼æ¢ä¸ªåºæ¯ï¼æ¢ä¸ªç¨æ·é½éè¦å¤§éçéå¤å³å¨ã
深度å¦ä¹ -æºè½é®çæºå¨äºº
深度è¯è¨æ¨¡åä¼å°é®é¢åææ¡£è½¬å为è¯ä¹åéï¼ä»èæ¾å°æåçå¹é çæ¡ãæ¬æåå©Google弿ºçBert模åç»åFaiss弿ºåéæç´¢å¼æï¼å¿«éæå»ºåºäºè¯ä¹çè§£çå¯¹è¯æºå¨äººã
æ¡ä¾å享ï¼FAQé®çæºå¨äºº
FAQæ¯Frequently Asked Questionsçç®ç§°ãå宿们æä¸ä¸ªå¸¸è§é®é¢åçæ¡çæ°æ®åºï¼ç°å¨ç¨æ·æåºäºä¸ä¸ªæ°é®é¢ï¼è½ä¸è½èªå¨ä»å¸¸è§é®é¢åºä¸æ½ååºæç¸å ³çé®é¢åçæ¡æ¥ä½çå¢ï¼å¨è¿ä¸ªé¡¹ç®ä¸ï¼æä»¬ä¼æ¢ç´¢å¦ä½æå»ºè¿æ ·é®çæºå¨äººã
é¡¹ç®æ ¸å¿ææ¯ç¹ï¼
- éè¿æ·±åº¦å¦ä¹ 模å夿é®é¢ä¸çæ¡çå¹é å¾å
- 使ç¨BERT模åç¹å¾æå并夿é®é¢ç¸ä¼¼åº¦
- ä½¿ç¨æ£ç´¢å¼æFaissç´¢å¼æå»ºåæ£ç´¢
- æå»ºå¨çº¿FAQé®çç³»ç»
1-1 å¦ä»ä¹
ç»åFaissåbertæä¾ç模åå®ç°äºä¸ä¸ªä¸æé®çç³»ç»ãæ¨å¨æä¾ä¸ä¸ªç¨Faissç»ååç§AI模åå®ç°è¯ä¹ç¸ä¼¼åº¦å¹é çè§£å³æ¹æ¡ãæåéè¿é¡¹ç®æ¡ä¾å®ç°ï¼ææ¬è¯ä¹ç¸ä¼¼åº¦ææ¬æ£ç´¢ç³»ç»åFAQé®çæºå¨äººã
1-2 å¨çº¿ç³»ç»DEMO
- ææ¬è¯ä¹ç¸ä¼¼åº¦å¹é æ£ç´¢
- ææ¬è¯ä¹FAQé®çæºå¨äºº
项ç®å®ç°ä»¥ä¸ç§å¹³å°åæè·¯å»ºè®®ç³»ç»ï¼æ¯ä¸ä¸ªéç¨çè§£å³æ¹æ¡ãå¼åè åªéè¦æç §æ°æ®è§èå³å¯ï¼ä¸éè¦ä¿®æ¹ä»£ç å°±å¯ä»¥è¿è¡ç³»ç»äº
2 åºç¨åºæ¯ä»ç»
CSDN é®çç³»ç»ï¼https://ask.csdn.net/
ç¾åº¦ç¥éï¼https://zhidao.baidu.com/
360é®çï¼https://wenda.so.com/search/
2-1 对è¯ç³»ç»æ´ä½ç®ä»
2-2 ææ¬æç´¢åºæ¯
2-3 论åç¸ä¼¼é®çç³»ç»
汽车ä¹å®¶æ¥æå ¨çæå¤§ç汽车社åºè®ºåã积累äºä¸°å¯çç¨æ·é®çæ°æ®ï¼è½å¤è§£å³ç¨æ·å¨ç车ã买车ãç¨è½¦çæ¹é¢éå°çåç§é®é¢ãéå¯¹ç¨æ·å¨å¹³å°ä¸æåºçåç§é®é¢ï¼ä»æµ·éçé«è´¨éé®çåºä¸å¹é è¯ä¹æç¸ä¼¼çé®é¢åçæ¡
ææ¬æ°æ®å ·æè¡¨è¾¾å¤æ ·åãç¨è¯ä¸è§èï¼å¦ï¼è½¦å车系ç¨è¯åå¨å¤§é缩åãç®åãè¯åºé¢ åçç°è±¡ï¼ãæ§ä¹æ§å¼ºï¼å¦ï¼âå京âå¯è½ææ±½è½¦åçï¼ä¹å¯è½æåå¸ï¼çç¹ç¹ï¼è¿ç»ä¼ ç»åºäºå ³é®è¯å¹é çæç´¢æ¹æ³å¸¦æ¥äºå¾å¤§ææãå æ¤ï¼å¨ä¼ ç»å ³é®è¯å¹é çåºç¡ä¸ï¼è¿ä¸æ¥å¼å ¥è¯ä¹æç´¢ææ¯ï¼å°ç²¾åé®çåºçé®é¢æ å°ä¸ºå¤ç»´åéï¼è¿è¡è¯ä¹å¹é ï¼æåé®é¢å¹é åç¡®æ§ã
2-4 æºè½å¯¹è¯é²èç³»ç»
æ°æ®æ ¼å¼ï¼ query-answer 对å¦ä¸
ä¸è¦éªäºº 好çï¼å¬ä½ çå°±è¡äº
ä¸è¦éªäººä¸¥éçç´æ¥ç¦è¨ 好çï¼å¬ä½ çå°±è¡äº
ä¸è¦éªäººäºå§ 好çï¼å¬ä½ çå°±è¡äº
ä¸è¦éªäººå¦ 好çï¼å¬ä½ çå°±è¡äº
ä¸è¦éªäººå°å¿å°å·å 好çï¼å¬ä½ çå°±è¡äº
ä¸è®¤è¯ä½ ä¸è®°å¾ä½ ä½ å½æå»é¼å
ä¸è®¤è¯ä½ æ ä½ å½æå»é¼å
ä¸è®¤è¯ä½ èå¥äº ä½ å½æå»é¼å
3 é®çç³»ç»åå±ç°ç¶
FAQæ£ç´¢åé®çæµç¨æ¯æ ¹æ®ç¨æ·çæ°Queryå»FAQç¥è¯åºæ¾å°æåéççæ¡å¹¶åé¦ç»ç¨æ·ã
æ£ç´¢è¿ç¨å¦å¾æç¤º
å ¶ä¸ï¼Qiæ¯ç¥è¯åºéçæ åé®ï¼Aiæ¯æ åé®å¯¹åºççæ¡ã
å ·ä½å¤çæµç¨ä¸ºï¼
- åéé离线建好索å¼
- çº¿ä¸æ¶å°ç¨æ· query ï¼å¬å䏿¹åééä½ä¸ºç²æç»æä¼ å ¥ä¸ä¸æ¨¡åè¿è¡è¿ä¸æ¥ç²¾ç¡®æåºï¼
- å©ç¨matching模å计ç®ç¨æ·queryåFAQç¥è¯åºä¸é®é¢æçæ¡çå¹é ç¨åº¦ï¼
- å©ç¨ranking 模å对åééå rerank å¹¶è¿å topk个åéçæ¡ã
- matching 模åè´è´£å¯¹ (query, reply) pair åç¹å¾å¹é ï¼å ¶è¾åºç matching score é常ä¼ä½ä¸º ranking 模åçä¸ç»´ç¹å¾ï¼
- ranking 模åè´è´£å ·ä½ç reranking å·¥ä½ï¼å ¶è¾å ¥æ¯åéåå¤å¯¹åºçç¹å¾åéï¼æ ¹æ®å®é éæ±æé ä¸åç±»åï¼å¦ï¼pointwise, pairwise, listwiseï¼çæå¤±å½æ°ï¼å ¶è¾åºç ranking score æ¯åéåå¤çæç»æåºä¾æ®ã
- æäºæ£ç´¢ç³»ç»å¯è½ä¸ä¼æç¡®åºå matching å ranking è¿ä¸¤ä¸ªè¿ç¨ã
3-1 æºè½é®ç常ç¨è§£å³æ¹æ¡
é对FAQæ£ç´¢å¼é®çç³»ç»ï¼ä¸è¬å¤çæµç¨
- é®çå¯¹æ°æ®éçæ¸ æ´
- Embedding
- 模åè®ç»
- è®¡ç®ææ¬ç¸ä¼¼åº¦
- å¨é®çåºä¸éåºä¸è¾å ¥é®é¢ç¸ä¼¼åº¦æé«çé®é¢
- è¿åç¸ä¼¼åº¦æé«çé®é¢æå¯¹åºççæ¡
æå»ºä¸ä¸ªFAQé®çç³»ç»ä¸è¬å®ç°æ¹æ³
- åºäºESçæºè½é®é¢ç³»ç»
ï¼éè¿å ³é®è¯å¹é è·åçæ¡ï¼ç±»ä¼¼çµåãæ°é»æç´¢é¢åå ³é®è¯å¬åï¼
- åºäºTF-IDFæ¹å¼
ï¼è®¡ç®æ¯ä¸ªåè¯çtfidfæ°å¼ï¼åè¯åæ¢ç®å¥å表示ã TF-IDF æ¹å¼ä¹å¨ç¨å¨å ³é®è¯æåï¼
- åºäºDoc2Vec 模åï¼èèè¯å段ï¼ç¸æ¯äºword2vecæ¥è¯´æäºæ®µè½ä¿¡æ¯ï¼
- éè¿æ·±åº¦å¦ä¹ è¯è¨æ¨¡åbert æååéï¼ç¶å计ç®ç¸ä¼¼åº¦
æ¹æ¡å¯ä»¥æ©å±å°çä¸å¡éæ±ï¼æ¬æä»ç»çæ¯ä¸ç§ææ¬è¯ä¹å¹é éç¨è§£å³æ¹æ¡ï¼
- æºè½å®¢æé¢åè¯ä¹å¹é
ï¼å¯¹è¯ç³»ç»æ£ç´¢å¼æºè½é®çç³»ç»ï¼çæ¡å¨ç¥è¯åºä¸ä¸è¿åå¯ä¸çæ°æ®è®°å½ï¼
- ä»¥å¾æç´¢ï¼resnet å¾çåéå表示ï¼
- æ°é»é¢åææ¬ç¸ä¼¼æ¨èï¼ç¸ä¼¼æ°é»æ¨èçï¼
- åºäºææ¬è¯ä¹å¹é æ£ç´¢ç³»ç»ï¼ææ¬ç¸ä¼¼æ§rank ï¼
é对è¿ç±»é®é¢ï¼éç¹ææ¬çéè¿æç§æ¹å¼è¿è¡åéå表示ï¼word2vecãdoc2vecãelmoãbertçï¼ï¼ç¶åæè¿ç§ç¹å¾åéè¿è¡ç´¢å¼ï¼faiss/Milus) ,æç»å®ç°å¨çº¿æå¡ç³»ç»çæ£ç´¢ï¼ç¶ååéè¿ä¸å®çè§åè¿è¡è¿æ»¤ï¼è·åæç»çæ°æ®å 容ã
3-2 ä¼ ç»ææ¬å¹é æ¹æ³åå¨é®é¢
ä¼ ç»çææ¬å¹é ææ¯æBoWãVSMãTF-IDFã BM25ãJaccordãSimHashçç®æ³ï¼ä¸»è¦è§£å³åé¢ç¸ä¼¼åº¦é®é¢ã
é¢ä¸´çå°é¾ï¼
ç± äºä¸æå«ä¹ç䏰坿§ï¼é常å¾é¾ç´æ¥æ ¹æ®å ³é®åå¹é æè åºäºæºå¨å¦ä¹ çæµ 屿¨¡åæ¥ç¡®å®ä¸¤ä¸ªå¥åä¹é´çè¯ä¹ç¸ä¼¼åº¦ã
3-3 深度å¦ä¹ ææ¬å¹é
深度å¦ä¹ æ¨¡åææ¬åè¯ä¹è¡¨ç¤ºéæ¸åºç¨äºæ£ç´¢å¼é®çç³»ç»ã
ç¸æ¯ä¼ ç»ç模åä¼ç¹ï¼
- è½å¤èç人工æåç¹å¾ç大é人åç©å
- ä»å¤§éçæ ·æ¬ä¸èªå¨æååºè¯è¯ä¹é´çå ³ç³»ï¼å¹¶è½ç»åçè¯å¹é ä¸çç»æä¿¡æ¯åææ¬å¹é ç屿¬¡åç¹æ§ï¼åæä¼ ç»æ¨¡åå¾é¾åæçéå«å¨å¤§éæ°æ®ä¸å«ä¹ä¸ææ¾çç¹å¾
æ¬æéç¨ç¸ä¼¼é®é¢å¹é æ¥å®ç°ä¸ä¸ªFAQé®çç³»ç»ã
é®é¢ï¼ä»ä¹æ¯ç¸ä¼¼é®é¢å¹é ï¼
çæ¡ï¼å³å¯¹æ¯ç¨æ·é®é¢ä¸ç°æFAQç¥è¯åºä¸é®é¢çç¸ä¼¼åº¦ï¼è¿åç¨æ·é®é¢å¯¹åºçæåç¡®ççæ¡
深度è¯ä¹å¹é 模åå¯ä»¥å为两大类ï¼å嫿¯representation-based method å interaction-based methodï¼è¿éæä»¬é对Represention-based Methodè¿ç§æ¹æ³è¿è¡æ¢ç´¢ã
è¿ç±»ç®æ³é¦å å°å¾ å¹é ç两个对象éè¿æ·±åº¦å¦ä¹ 模åè¿è¡è¡¨ç¤ºï¼ä¹å计ç®è¿ä¸¤ä¸ªè¡¨ç¤ºä¹é´çç¸ä¼¼åº¦ä¾¿å¯è¾åºä¸¤ä¸ªå¯¹è±¡çå¹é 度ãé对å¹é åº¦å½æ°f(x,y)ç计ç®é常æä¸¤ç§æ¹æ³: cosine 彿° å å¤å±æç¥å¨ç½ç»ï¼MLPï¼
对æ¯ä¸¤ç§å¹é æ¹æ³çä¼ç¼ºç¹
- cosine 彿°ï¼éè¿ç¸ä¼¼åº¦åº¦é彿°è¿è¡è®¡ç®ï¼å®é 使ç¨è¿ç¨ä¸æå¸¸ç¨çå°±æ¯ cosine 彿°ï¼è¿ç§æ¹å¼ç®å髿ï¼å¹¶ä¸å¾ååºé´å¯æ§æä¹æç¡®
- å¤å±æç¥å¨ç½ç»ï¼MLPï¼ï¼å°ä¸¤ä¸ªåé忥ä¸ä¸ªå¤å±æç¥å¨ç½ç»ï¼MLPï¼ï¼éè¿æ°æ®å»è®ç»æååºä¸ä¸ªå¹é 度å¾åï¼æ´å çµæ´»æåè½åæ´å¼ºï¼ä½å¯¹è®ç»çè¦æ±ä¹æ´é«
4 é®çç³»ç»å ³é®ææ¯
Google ç BERT 模åå¨ NLP é¢åä¸å ·æå·¨å¤§çå½±ååã宿¯ä¸ä¸ªéç¨çè¯è¨è¡¨ç¤ºæ¨¡åï¼å¯ä»¥åºç¨äºè¯¸å¤é¢åãæ¬æçé¡¹ç®æ¯å° Faissä¸ BERT 模åç»åæå»ºææ¬è¯ä¹å¹é æ£ç´¢ç³»ç»ï¼ä½¿ç¨ BERT 模åå°ææ¬æ°æ®è½¬æåéï¼ç»å Faissç¹å¾åéç¸ä¼¼åº¦æç´¢å¼æå¯ä»¥å¿«éæç´¢ç¸ä¼¼ææ¬ï¼æç»è·åæ³è¦çç»æ
4-1 Faiss
Faissæ¯Facebook AIå¢é弿ºçé对èç±»åç¸ä¼¼æ§æç´¢åºï¼ä¸ºç¨ å¯åéæä¾é«æç¸ä¼¼åº¦æç´¢åèç±»ï¼æ¯æå亿级å«åéçæç´¢ï¼æ¯ç®åæä¸ºæççè¿ä¼¼è¿é»æç´¢åºãå®å å«å¤ç§æç´¢ä»»æå¤§å°åééï¼å¤æ³¨ï¼åéé大å°ç±RAMå åå³å®ï¼çç®æ³ï¼ä»¥åç¨äºç®æ³è¯ä¼°ååæ°è°æ´çæ¯æä»£ç ãFaissç¨C++ç¼åï¼å¹¶æä¾ä¸Numpyå®ç¾è¡æ¥çPythonæ¥å£ã餿¤ä»¥å¤ï¼å¯¹ä¸äºæ ¸å¿ç®æ³æä¾äºGPUå®ç°ãç¸å ³ä»ç»åèãFaissï¼Facebook 弿ºçç¸ä¼¼æ§æç´¢ç±»åºã
4-2 BERT
BERT æ¨¡åæ¯ Google åå¸çä¸ä¸ªæ°çè¯è¨è¡¨è¾¾æ¨¡åï¼Language Representation Modelï¼ï¼å ¨ç§°æ¯ Bidirectional Encoder Representations from Transformersï¼å³ååç¼ç è¡¨å¾æ¨¡åãBERT 模åçä¼å¿ä½ç°å¨ä¸¤æ¹é¢ã
- 䏿¹é¢ï¼å®ä½¿ç¨åºäºç¹å«è®¾è®¡ç注æåæºå¶ï¼Attention Mechanismï¼çç®åå ¨è¿æ¥ç½ç»å代äºå¤æç CNN å RNN ç½ç»ãä¸ä½å¤§å¤§åå°äºè®ç»æ¶é´ï¼åæ¶ææå°æåäºç½ç»æ§è½ã
- å¦ä¸æ¹é¢ï¼BERT æ¨¡åæ¯ç¬¬ä¸ä¸ªçæ£æè·ä¸ä¸æè¯ä¹ä¿¡æ¯çé¢è®ç»è¯è¨è¡¨ç¤ºæ¨¡åãè¿æ¯å 为 BERT 模å使ç¨äº Transformer ä½ä¸ºç®æ³çä¸»è¦æ¡æ¶ï¼è Transformer æ¡æ¶è½æ´å½»åºå°ææè¯å¥ä¸çååå ³ç³»ã
Google æä¾äºä¸äºé¢å è®ç»ç模åï¼å ¶ä¸æåºæ¬çä¸¤ä¸ªæ¨¡åæ¯BERT-base 模åå BERT-large 模åãå ·ä½åæ°å¦ä¸è¡¨æç¤ºï¼
BERT-base 模åå BERT-large 模åçåæ°æ»é大å°åç½ç»å±æ°ä¸åï¼BERT-large 模åæå è®¡ç®æºå åè¾å¤ï¼æä»¥æ¬æé¡¹ç®éç¨ BERT-base 模åå¯¹ææ¬æ°æ®è¿è¡åé转åãï¼æ³¨ï¼å ¶ä¸ï¼å±æ°ï¼å³ Transformer å个æ°ï¼è¡¨ç¤ºä¸º Lï¼éè尺寸表示为 H ï¼èªæ³¨æå头æ°è¡¨ç¤ºä¸º A ãï¼
5 é®çç³»ç»å®ç°
å ³äºmain.py 主è¦åæ°
$ python main.py --help
usage: main.py [-h] --task TASK [--load] [--index] [--n_total N_TOTAL]
[--search] [--sentence SENTENCE] [--topK TOPK]
optional arguments:
-h, --help show this help message and exit
--task TASK project task name
--load load data into db
--index load data text vector into faiss
--n_total N_TOTAL take data n_sample ,generate it into faiss
--search search matched text from faiss
--sentence SENTENCE query text data
--topK TOPK take matched data in topK
ç¬¬ä¸æ¥ï¼ç¥è¯åºåå¨ < id,answer>
$ python main.py --task medical --load
ç¬¬äºæ¥ï¼ç´¢å¼æå»º<id,question>
$ python main.py --task medical --index --n_total 120000
ç¬¬ä¸æ¥ï¼ææ¬è¯ä¹ç¸ä¼¼åº¦å¹é æ£ç´¢
$ python main.py --task medical_120000 --search --sentence å¾äºä¹èæä¹æ²»ç
夿³¨ï¼medical_120000 ä¸task_${ç´¢å¼è®°å½æ°} ç»å
宿ä¸è¿°åè½åï¼æä»¬å¯ä»¥å¨æ¤åºç¡ä¸ï¼æ ¹æ®ä¸å¡ä¸åæå»ºä¸äºç¸å ³åºç¨ï¼ä¾å¦ï¼
- å¯ä»¥å®ç°FAQæºè½é®ç
- å¯ä»¥å®ç°æ°é»èµè®¯å å®¹ç±»ææ¬è¯ä¹å¹é å¬å
- å¯ä»¥å®ç°åºäºææ¬è¯ä¹ç䏿æ£ç´¢ç³»ç»
ç¬¬åæ¥ï¼åºäºææ¬è¯ä¹æ£ç´¢æå¡å®ç°FAQé®ç
$ python main.py --task medical_120000 --search --sentence 身ä¸åºç° --topK 10
ç¬¬äºæ¥ï¼åºäºææ¬è¯ä¹æ£ç´¢æå¡Webæå¡
å¯å¨æå¡python app.py --task medical_120000 ï¼ç¶å访é®å°å http://xx.xx.xx.xx:5000/
æä»¬è¿éå¢ï¼ä½¿ç¨ä¸è¿°åºç¡æå¡å®æä¸ä¸ªFAQé®çæºå¨äºº
5-1 æ°æ®è§è
é¡¹ç®æ°æ®éå å«ä¸ä¸ªé¨åï¼é®é¢æ°æ®é+çæ¡æ°æ®é+é®é¢-çæ¡å¯ä¸æ è¯ï¼æ°æ®æ¯ä¸ä¸å¯¹åºçã
é对ä¸åçä¸å¡ç³»ç»ï¼æä»¬åªéè¦æä¾è¿ç§æ°æ®æ ¼å¼ï¼éè¿æ¬æç模æ¿å°±å¯ä»¥å¿«éæå»ºä¸ä¸ªdemoäºï¼ç¥å¤§å®¶å¦ä¹ æå¿«ã
5-2 ç³»ç»æ´ä½æ¶æ
æ¬æçææ¬è¯ä¹å¹é æç´¢é¡¹ç®ä½¿ç¨ç FaissåBERTçæ´ä½æ¶æå¦å¾æç¤ºï¼
ï¼æ³¨ï¼æ·±èè²çº¿ä¸ºæ°æ®å¯¼å ¥è¿ç¨ï¼æ©é»è²çº¿ä¸ºç¨æ·æ¥è¯¢è¿ç¨ãï¼
- é¦å ï¼æ¬æé¡¹ç®ä½¿ç¨å¼æºç bert-serving ï¼ BERTåå¥åç¼ç å¨ï¼æ 颿°æ®è½¬å为åºå®é¿åº¦
- 为 768 ç»´çç¹å¾åéï¼å¹¶å¯¼å ¥ Milvus æè Faissåºã
- ç¶åï¼å¯¹åå ¥ Milvus/Faiss åºä¸çç¹å¾åéè¿è¡åå¨å¹¶å»ºç«ç´¢å¼ï¼åæ¶åå§æ°æ®æä¾å¯ä¸IDç¼ç ï¼å° ID å对åºå 容åå¨å¨ PostgreSQL ä¸ã
- æåï¼ç¨æ·è¾å ¥ä¸ä¸ªæ é¢ï¼BERT å°å ¶è½¬æç¹å¾åéãMilvus/Faiss 对ç¹å¾åéè¿è¡ç¸ä¼¼åº¦æ£ç´¢ï¼å¾å°ç¸ä¼¼çæ é¢ç ID ï¼å¨ ç¥è¯åºï¼PostgreSQL/MySQL/SQLiteãããï¼ ä¸æ¾åº ID 对åºç详ç»ä¿¡æ¯è¿å
6-3 ææ¬åéæå¡ bert-serving
å¦ä¹ èµæï¼
https://github.com/hanxiao/bert-as-service
https://github.com/tensorflow/tensorflow
https://blog.csdn.net/abc50319/article/details/107171952ï¼å ³äºbert-as-service ä½¿ç¨æç« ï¼
使ç¨bert as service æå¡
ç¬¬ä¸æ¥ï¼å®è£ tensorflow
Python >= 3.5
Tensorflow >= 1.10 (one-point-ten)
ubuntuç³»ç»-gpuä¸è½½ç¦»çº¿å®è£ æä»¶å¹¶pipå®è£
tensorboard-1.15.0-py3-none-any.whl
tensorflow_estimator-1.15.1-py2.py3-none-any.whl
tensorflow_gpu-1.15.3-cp37-cp37m-manylinux2010_x86_64.whl
ä¹å¯ä»¥éè¿ä¸é¢çæ¹å¼å¿«éä¸è½½ï¼è¿éä¸è½½cpuçæ¬ï¼
pip install tensorflow==1.15.0 --user -i https://pypi.tuna.tsinghua.edu.cn/simple
MAC ç³»ç»cpuçæ¬å®è£
pip3 install --upgrade https://files.pythonhosted.org/packages/dc/65/a94519cd8b4fd61a7b002cb752bfc0c0e5faa25d1f43ec4f0a4705020126/tensorflow-1.15.0-cp37-cp37m-macosx_10_11_x86_64.whl
https://blog.csdn.net/u012359618/article/details/107054741
https://www.tensorflow.org/install/pip?hl=zh-cn#system-install
http://www.yebaochen.com/deep-learning/install-tensorflow-on-mac
éªè¯æ¯å¦å®è£
import tensorflow as tf
print(tf.__version__)
ç¬¬äºæ¥ï¼bert-serving æå¡æå»º
ï¼ æä»¬å¨ubuntuç³»ç»æå»ºå®æbert-serving ï¼ç®å½ï¼/home/ubuntu/teacher/ ï¼
éè¿bert-servingæå¡ï¼å¸®å©æä»¬è§£å³ï¼ææ¬-> åéç转æ¢
1ãåègithub æä¾ç代ç
git clone https://github.com/hanxiao/bert-as-service.git
2ãå®è£ serveråclient
pip install bert-serving-server # server
pip install bert-serving-client # client, independent of `bert-serving-server`
3ãä¸è½½pretrained BERT models
Chinese Simplified and Traditional, 12-layer, 768-hidden, 12-heads, 110M parameters
https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip
è§£åæ¨¡åï¼
chinese_L-12_H-768_A-12
âââ bert_config.json
âââ bert_model.ckpt.data-00000-of-00001
âââ bert_model.ckpt.index
âââ bert_model.ckpt.meta
âââ vocab.txt
bert_config.json: bert 模åé ç½®åæ°
vocab.txt: åå ¸
bert_model: é¢è®ç»ç模å
4ãå¯å¨bert-service
nohup bert-serving-start -model_dir chinese_L-12_H-768_A-12 -num_worker 1 -max_seq_len 64 >start_bert_serving.log 2>&1 &
( CPUåGPU 模å¼é½å¯ä»¥ )
é对æ¯ä¸ªå段è¿è¡è¯´æ
workers = 4 è¡¨ç¤ºåæ¶å¹¶åå¤çè¯·æ±æ°
model_dir é¢è®ç»ç模å
max_seq_len ä¸å¡åæå¥åçé¿åº¦
å ³éæå¡
bert-serving-terminate -port 5555
5ãæµè¯ææ¬-> åéè¡¨ç¤ºç»æ
from bert_serving.client import BertClient
bc = BertClient()
result = bc.encode(['First do it'])
print(result)
5-4 åéç¸ä¼¼åº¦æç´¢å¼æ
产åå¦ä¹ æå
5-5 ç¥è¯åºåå¨
ç¥è¯åºï¼å¯ä»¥åå¨mongo/PostgreSQL/mysql æ ¹æ®æ°æ®éè¿è¡éæ©
æ¬æç»å¤§å®¶å享çå å®¹ï¼æ°æ®åå¨å¨mysqlä¸ã
夿³¨ï¼å ³äºmysql çå ·ä½å®è£ ï¼å¤§å®¶å»ä¸ç½æ¥æ¾ä¸ä¸ãï¼root,12345678)
大家å¨å¦ä¹ è¿ç¨ä¸ï¼å¦ææä»»ä½çé®é¢ï¼å¯ä»¥ç½ç«çè¨ï¼æè aiwen2100)
create database faiss_qa;
use faiss_qa;
CREATE TABLE `answer_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`answer` mediumtext COLLATE utf8mb4_bin,
PRIMARY KEY (`id`),
KEY `answer_info_index_id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
5-6 ç´¢å¼æå»º
$ python main.py --task medical --index --n_total 120000
5-7 ææ¬è¯ä¹ç¸ä¼¼åº¦å¹é æç´¢
$ python main.py --task medical --search --sentence å°å®ä¿¡è´·
宿ä¸è¿°åè½åï¼æä»¬å¯ä»¥å¨æ¤åºç¡ä¸ï¼æ ¹æ®ä¸å¡ä¸åæå»ºä¸äºç¸å ³åºç¨ï¼ä¾å¦ï¼
- å¯ä»¥å®ç°FAQæºè½é®ç
- å¯ä»¥å®ç°æ°é»èµè®¯å å®¹ç±»ææ¬è¯ä¹å¹é å¬å
- å¯ä»¥å®ç°åºäºææ¬è¯ä¹ç䏿æ£ç´¢ç³»ç»
对è¾å ¥æ°æ®å¾®å°çå·®å«ççæä»ä¹ä¸åï¼
5-8 ææ¬è¯ä¹FAQé®çæºå¨äºº-APIæ¥å£
é¦å ï¼æä»¬å¯å¨æå¡ï¼python app.py
ç¶åï¼è¯·æ±API æå¡å°åæ¥çæ£ç´¢æ£ç´¢
$ curl -H "Content-Type:application/json" -X POST --data '{"query": "ä¹èæä¹æ²»ç"}' http://localhost:5000/api/v1/search | jq
5-9 ææ¬è¯ä¹FAQé®çæºå¨äºº-Webçé¢
å¯å¨æå¡ python app.pyï¼ç¶å访é®å°å http://xx.xx.xx.xx:5000/
ç¨æ·è¡¨è¾¾çç»å¾®å·®å«ï¼éè¿ææ¬è¯ä¹å¹é æ»ä¹è½æ¾å°æä½³ççæ¡ï¼æç»åé¦ç»ç¨æ·ã
ä¾å¦ï¼ 两ç§è¯è¨è¡¨è¾¾ççææ
第ä¸å¥ï¼ å°å©åæååä»ä¹
第äºå¥ï¼ å°å©åæåä¸è½åä»ä¹
ä¸è¿°ææ¾è¡¨è¾¾çæ¯ä¸¤ä¸ªå«ä¹ï¼èéè¿ææ¬è¯ä¹çæ¹å¼ä¹å¾å¥½å¾è¯å«åºæ¥äºï¼ææè¿ä¸éã
æä»¬ççå端æå¡å°åæ°æ®
注æï¼FAQç³»ç»ä¾èµbert-serving æå¡ï¼è¯·ç¡®è®¤æ£å¸¸å·¥ä½ã
http://xx.xx.xx.xx:5000/status,æ£å¸¸æ åµä¸çè¿åç»ææ ¼å¼å¦ä¸ï¼
{
"status":"success",
"ip":"127.0.0.1",
"port":5555,
"identity":"cbc94483-1cd6-406d-b170-0cb04e77725bb"
}
6 æ»ç»å±æ
å¨ AI é«éåå±çæ¶ä»£ï¼æä»¬å¯ä»¥ä½¿ç¨æ·±åº¦å¦ä¹ 模åå»å¤çåç§ç±»åçéç»æåæ°æ®ï¼ä¾å¦å¾çãææ¬ãè§é¢åè¯é³çãæ¬æé¡¹ç®éè¿ BERT 模åå¯ä»¥å°è¿äºéç»æåæ°æ®æå为ç¹å¾åéï¼ç¶åéè¿Faiss 对è¿äºç¹å¾åéè¿è¡è®¡ç®ï¼å®ç°å¯¹éç»æåæ°æ®çåæä¸æ£ç´¢ã
æ¬æå©ç¨Faissæå»ºçFAQé®çç³»ç»ä¹åªæ¯å ¶ä¸ä¸ä¸ªåºæ¯ï¼å±ç¤ºäºFaisså¨éç»æåæ°æ®å¤çä¸çåºç¨ã欢è¿å¤§å®¶å¯¼å ¥èªå·±çæ°æ®å»ºç«èªå·±çFAQé®çç³»ç»ï¼æè ææ¬æç´¢ãæºè½å®¢æçæ°ç³»ç»ï¼ãFaissåéç¸ä¼¼åº¦æ£ç´¢å¼ææç´¢å亿åéä» éæ¯«ç§ååºæ¶é´ãä½ å¯ä»¥ä½¿ç¨ Faissæ¢ç´¢æ´å¤ AI ç¨æ³ï¼
å ·ä½ç¸å ³èµæè¯·ç§ä¿¡çè¨ï¼å享大家ã