AI Agent与向量数据库:打造语义搜索引擎
AI Agentä¸åéæ°æ®åºï¼æé è¯ä¹æç´¢å¼æ
å¨ä¿¡æ¯çç¸çæ¶ä»£ï¼ä¼ ç»çå ³é®è¯æç´¢å·²é¾ä»¥æ»¡è¶³ç¨æ·å¯¹ç²¾åãè¯ä¹åä¿¡æ¯æ£ç´¢çéæ±ãAI Agentç»ååéæ°æ®åºææ¯ï¼æ£å¨éå¡æç´¢ä½éªçè¾¹çãæ¬æå°æ·±å ¥æ¢è®¨åéæ°æ®åºçæ ¸å¿åçãEmbedding模åçä½ç¨ãç¸ä¼¼åº¦æç´¢æºå¶ï¼ä»¥åå¦ä½å°è¿ä¸åéæå°AI Agentä¸ï¼æé ä¼ä¸çº§çè¯ä¹æç´¢å¼æã
ä¸ã为ä»ä¹éè¦åéæ°æ®åº
ä¼ ç»çå ³ç³»åæ°æ®åºæ é¿å¤çç»æåæ°æ®ç精确å¹é æ¥è¯¢ï¼ä¾å¦WHERE name = 'å¼ ä¸'ãä½å¨é¢å¯¹"è¯ä¹ç¸ä¼¼"è¿æ ·ç模ç³éæ±æ¶ï¼å®ä»¬æ¾å¾åä¸ä»å¿ãæ¯å¦ç¨æ·æç´¢"å¦ä½å¦ä¹ æºå¨å¦ä¹ "ï¼ä¼ ç»æç´¢åªè½å¹é å å«è¿äºå ³é®è¯çææ¡£ï¼èæ æ³çè§£"å ¥é¨æç¨"ã"MLæå"ã"深度å¦ä¹ åºç¡"çè¯ä¹ç¸å ³ç表达ã
åéæ°æ®åºçæ ¸å¿ææ³æ¯å°ææ¬ãå¾åãé³é¢çéç»æåæ°æ®ï¼éè¿Embedding模å转æ¢ä¸ºé«ç»´åéï¼éå¸¸æ¯æ°ç¾å°æ°åç»´çæµ®ç¹æ°ç»ï¼ï¼ç¶åå¨åé空é´ä¸åå¨åæ£ç´¢ãè¯ä¹ç¸è¿çå 容ï¼å ¶åéå¨ç©ºé´ä¸è·ç¦»ä¹æ´è¿ãè¿ç§"ä»¥æææ"çè½åï¼æ£æ¯è¯ä¹æç´¢çåºç³ã
常è§çåéæ°æ®åºå æ¬ï¼
- Milvusï¼å¼æºã髿§è½ï¼æ¯æå亿级åéæ£ç´¢ï¼éåå¤§è§æ¨¡ä¼ä¸çº§é¨ç½²
- Pineconeï¼å ¨æç®¡äºæå¡ï¼ä¸æç®åï¼éåå¿«éååéªè¯
- Chromaï¼è½»é级æ¬å°åéåºï¼éåå¼åæµè¯åå°ååºç¨
- FAISSï¼Facebook弿ºç髿ç¸ä¼¼åº¦æç´¢åºï¼æ§è½åè¶
äºãEmbedding模åï¼è¯ä¹è½¬åçæ¡¥æ¢
Embeddingæ¨¡åæ¯å°ææ¬æ å°å°åé空é´çå ³é®ãå®éè¿æ·±åº¦å¦ä¹ ï¼é常æ¯Transformeræ¶æï¼æè·ææ¬çè¯ä¹ä¿¡æ¯ï¼çæåºå®é¿åº¦çå¯éåé表示ã
2.1 主æµEmbedding模å
- OpenAI text-embedding-ada-002ï¼1536ç»´åéï¼éç¨æ§å¼ºï¼ææç¨³å®
- BGE (BAAI General Embedding)ï¼ä¸æè¯ä¹çè§£ä¼ç§ï¼å¼æºå è´¹
- Sentence-BERTï¼åºäºåå¡ç»æçå¥åç¼ç 模åï¼éåè¯ä¹ç¸ä¼¼åº¦ä»»å¡
- E5 (Embeddings from bidirectional Encoder)ï¼å¾®è½¯å¼æºï¼æ¯æå¤è¯è¨
2.2 åéè¡¨ç¤ºçæ¬è´¨
䏿®µææ¬ç»è¿Embedding模åç¼ç åï¼å¾å°ç±»ä¼¼è¿æ ·çåéï¼
[0.023, -0.156, 0.789, ..., -0.034] # 1536ç»´æµ®ç¹æ°ç»åé空é´ä¸ï¼ä½å¼¦ç¸ä¼¼åº¦ææ¬§æ°è·ç¦»å¯ä»¥è¡¡éä¸¤ä¸ªææ¬çè¯ä¹å ³èç¨åº¦ãä¾å¦ï¼"è¹ææ¯çç"å"æ°´æå³éå¾å¥½"çåéè·ç¦»ï¼ä¼æ¯"è¹ææ¯çç"å"è¹æå ¬å¸åå¸äºæ°iPhone"æ´è¿ã
ä¸ãç¸ä¼¼åº¦æç´¢åç
3.1 è·ç¦»åº¦éæ¹æ³
æå¸¸ç¨ç两ç§ç¸ä¼¼åº¦åº¦éæ¹å¼ï¼
ä½å¼¦ç¸ä¼¼åº¦ï¼è¡¡é两个åé夹è§çä½å¼¦å¼ï¼å ³æ³¨æ¹åèéé¿åº¦ã
import numpy as np def cosine_similarity(a, b): return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)) vec1 = np.array([0.1, 0.2, 0.3]) vec2 = np.array([0.15, 0.25, 0.35]) print(cosine_similarity(vec1, vec2)) # è¾åºæ¥è¿1çæ°å¼ï¼è¡¨ç¤ºè¯ä¹ç¸ä¼¼æ¬§æ°è·ç¦»ï¼è¡¡éåé空é´ä¸çç´çº¿è·ç¦»ï¼è¶å°è¡¨ç¤ºè¶ç¸ä¼¼ã
3.2 è¿ä¼¼æè¿é»æç´¢ï¼ANNï¼
å½åéæ°éè¾¾å°ç¾ä¸çè³åäº¿çº§å«æ¶ï¼æ´å计ç®å ¨éåéçç¸ä¼¼åº¦å·²ä¸å¯è¡ãè¿ä¼¼æè¿é»ç®æ³éè¿çºç²æå°çç²¾åº¦æ¥æ¢åæ°éçº§çæ§è½æåï¼
- HNSWï¼Hierarchical Navigable Small Worldï¼ï¼å¾ç´¢å¼ç®æ³ï¼æå»ºå¤å±å¯¼èªå¾ï¼æç´¢æçé«
- IVFï¼Inverted File Indexï¼ï¼å°åé空é´åå为å¤ä¸ªèç±»ä¸å¿ï¼å å®ä½åéåºåå精确æç´¢
- PQï¼Product Quantizationï¼ï¼å°é«ç»´åéå缩为ä½ç»´è¡¨ç¤ºï¼å¤§å¹ åå°å åå ç¨
FAISSåºæä¾äºè¿äºç®æ³çæçå®ç°ï¼æ¯å·¥ä¸ççé¦éæ¹æ¡ã
åãAI Agentéæåéæ°æ®åº
AI Agentéè¿éæåéæ°æ®åºï¼å¯ä»¥æå»ºå ·å¤é¿æè®°å¿åç¥è¯æ£ç´¢è½åçæºè½ç³»ç»ã以䏿¯ä¸ä¸ªå®æ´çéæç¤ºä¾ï¼ä½¿ç¨FAISSä½ä¸ºåéåå¨å¼æã
4.1 ç¯å¢åå¤
pip install faiss-cpu sentence-transformers numpy4.2 æ ¸å¿å®ç°ä»£ç
import faiss import numpy as np from sentence_transformers import SentenceTransformer class SemanticSearchAgent: def __init__(self, embedding_model='BAAI/bge-large-zh-v1.5'): # å è½½Embedding模å self.encoder = SentenceTransformer(embedding_model) self.dim = self.encoder.get_sentence_embedding_dimension() # åå§åFAIS