[AI] 1-1. 何謂人工智慧?

人工智慧(Artificial Intelligence, 簡稱 AI),但何謂人工智慧? 首先我們先探討人工智慧、機器學習、深度學習之間的關係。 一般而言,人工智慧包含了機器學習,然後機器學習包含了深度學習。 人工智慧 符號式 AI(Symbolic AI) 人工智慧出現在 1950 年代,其簡單定義為「能自動化地執行一般人類的智慧工作」,故包含了機器學習、深度學習,同時也涵蓋了許多不涉及學習的做法。 在 1980 年代以前,大部分的 AI 科學家都認為,想要讓人工智慧與人類匹敵,需要靠工程師編寫大量的規則來操控人工智慧的行為。這種人工智慧被稱為 Symbolic AI,意即符號式 AI,或稱 Rule-based AI。這種 AI 的形式在流行於 1950 至 1980 年代,隨著專家系統興起而達到顛峰。 Symbolic AI 可以解決規則清楚的問題,如棋盤遊戲、卡牌遊戲,但對於更複雜、更模糊的問題,如影像辨識、語音辨識或語言翻譯,要找出明確規則是相當困難的。故需要新方法來取代 Symbolic AI,那就是 Machine Learning。 機器學習(Machine Learning) Symbolic AI 需要透過明確的步驟,定義出規則;而機器學習反其道而行:機器根據輸入資料及相應答案,自己找出有哪些規則。換句話說,機器學習系統是透過訓練(training)來學習,而非透過定義規則。 為了實現機器學習,有三個要素: 輸入資料 標準答案 判斷好或壞 機器學習將輸入資料轉換成有意義的輸出,並且和輸入資料所附帶的標準答案進行比對修正來學習。因此,機器學習的核心就是要對資料進行有意義的轉換。 故機器學習通常需要人工特徵工程,適合結構化的數據與較小規模的數據集。 比方說要做手寫數字辨識,可能要透過封閉環的數量、橫向與縱向的直方圖來定義規則,這些形式的規則也許可以得到不錯的結果,但因為仰賴人力來維護,故這種方式很吃力,也可能導致系統非常地脆弱,因為每一個新的樣本,都可能對先前建立好的規則產生致命的影響,因此必須在既有的架構上添加新的資料轉換規則,進而與既存的規則產生影響。 常用的包含決策樹、SVM、隨機森林、類神經網路(Neural Network)等演算法。 深度學習(Deep Learning) 既然找出「有意義的轉換方式」是如此痛苦的,科學家便開始嘗試將系統性地將這一過程自動化。 透過使用卷積類神經網路(Convolutional Neural Network, CNN),並強調使用連續、多層的學習方式,使表達式更有意義。 深度指的是一個模型用了多少「層」來處理資料,與機器學習通常 1~2 層的資料表示法相比(有時稱為淺層學習(shallow learning)),深度學習通常涉及數十層,甚至上百層,這樣的學習法被稱為分層或階層表示法的學習(layered representation learning, hierarchical representation learning)。 在深度學習中,所謂「層」會對輸入資料做怎樣的轉換,取決於儲存在該層的權重(weight),而權重是多個數字組成的,權重也被稱為層的參數(parameters),而「學習」就是指幫神經網路的每一層找出適當的權重值。 \( \boxed{ \begin{array}{ccc} && \text{輸入資料 X} & \\ && \downarrow & \\ \red{\boxed{\text{權重}}} & \red{\rightarrow} & \boxed{\text{層(資料轉換)}} \\ && \downarrow & \\ \red{\boxed{\text{權重}}} & \red{\rightarrow} & \boxed{\text{層(資料轉換)}} \\ && \downarrow & \\ && \boxed{\text{預測 Y’}} & \end{array} } \) ...

December 3, 2024 · 2 分鐘 · Rain Hu

[AI] Catalog

1. 簡介 1-1 何謂人工智慧? 1-2 機器學習的基礎技術 1-3 深度學習的發展 2. 神經網路(CNN) 2-1 初試神經網路-手寫辨識 mnist 2-2 張量 Tensor 2-3 優化器 Optimizer 3. Keras 與 Tensorflow 簡介 3-1 TensorFlow 介紹 3-2 Keras 介紹 3-3 使用 TensorFlow 與 Keras 函式庫 3-4 實作線性分類器 3-5 Keras API 4. 分類與迴歸 5. 機器學習(ML) 6. 電腦視覺(CV) 7. 時間序列(Time Series) 8. 自然語言處理(NLP) 9. 生成式 AI(Gen AI)

December 3, 2024 · 1 分鐘 · Rain Hu

基於 Ollama 和 LangChain 的 Naive RAG 實作(搭配 streamlit UI)

在此為確保程式碼的可執行性,使用了免費的模型,若要求性能,可以使用替代方案。 完整程式碼 Basic Moves 1. 載入文件 loader = WebBaseLoader(urls_list) documents = loader.load() 使用 WebBaseLoader 從給定的 URL 列表中載入文件。在這裡可以根據需求替換其它 Loader。 PyPDFLoader 用於 PDF 文件。 TextLoader 用於純文本文件。 2. 分割文件 pythonCopytext_splitter = CharacterTextSplitter.from_tiktoken_encoder(chunk_size=7500, chunk_overlap=100) doc_splits = text_splitter.split_documents(documents) 文件分割是一個關鍵步驟。這裡使用 CharacterTextSplitter 並基於 tiktoken 編碼器進行分割。 參數說明: chunk_size: 定義每個 chunk 的最大 token 數。較大的 chunk 可能包含更多上下文,但可能降低檢索精度。 chunk_overlap: 定義相鄰塊之間的重疊 token 數。增加重疊可以幫助保持上下文連續性,但會增加記憶體需求。 替代方案: RecursiveCharacterTextSplitter: 可以更智能地處理文檔結構。 TokenTextSplitter: 直接基於標記進行分割,可能更準確但速度較慢。 3. 選擇 embedding 模型 pythonCopyembeddings = OllamaEmbeddings(model="mistral") 這裡使用 Ollama 的 Mistral 模型生成嵌入。 替代方案: OpenAI HuggingFace Gemini 4. 創建向量資料庫 pythonCopyvector_store = Chroma.from_documents( documents = doc_splits, embedding = embeddings, collection_name = "rag-chroma", ) 替代方案: FAISS (Meta 的) Milvus Pinecone 5. 建立 Retriever Interface retriever = vector_store.as_retriever() 可以通過設置參數 search_type 與 search_kwargs 來調整檢索行為。 6. 執行 RAG rag_chain = ( {"context": retriever, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser() ) 定義 RAG 鏈。可以通過修改 prompt 或使用不同的 LLM 來優化性能。 7. 查詢 return rag_chain.invoke(question) 調用 RAG 鏈針對輸入的問題返回答案。 Advanced Moves 加入 metadata 並進行篩選: loader = WebBaseLoader(urls_list) loader.requests_kwargs = {'verify':False} docs = loader.load() docs = [Document(page_content=doc.page_content, metadata={"source": doc.metadata['source']}) for doc in docs] # 在檢索時使用 metadata 篩選 retriever = vector_store.as_retriever(search_kwargs={"filter": {"source": "特定URL"}}) 加入 pre/post retrieval 處理: from langchain.retrievers import ContextualCompressionRetriever from langchain.retrievers.document_compressors import LLMChainExtractor compressor = LLMChainExtractor.from_llm(llm) compression_retriever = ContextualCompressionRetriever( base_compressor=compressor, base_retriever=retriever ) 加入 rerank 提升回答的加權: from langchain.retrievers import EnsembleRetriever bm25_retriever = BM25Retriever.from_documents(documents) ensemble_retriever = EnsembleRetriever( retrievers=[retriever, bm25_retriever], weights=[0.5, 0.5] ) 改變 naive RAG 為 graph RAG: from langchain.graphs import NetworkxEntityGraph from langchain.indexes import GraphIndexCreator graph_creator = GraphIndexCreator( graph_type=NetworkxEntityGraph, include_embeddings=True ) graph = graph_creator.from_documents(documents) # 使用 graph RAG retrieved_nodes = graph.get_relevant_nodes(query)

July 30, 2024 · 2 分鐘 · Rain Hu