[Gemini/Firebase] 土炮打造- 透過 Firebase 作為 Embedding Vector DB 透過 Gemini 來幫你的 Github Page Blog 做 RAG 服務

RAG

前提

我是一個很喜歡寫作的人,經常學習到東西都會記錄在這一個網站裡面。陸陸續續從 2002 年也寫了 20 多年的部落格。但是經常自己也是會忘記我曾經寫過什麼樣的內容。

之前我也曾經說明過:將我會的東西整理成部落格,主要不是為了幫助其他人,最重要是可以幫助到未來的自己。總有一天你會遇到類似的問題,而你的文章的思緒跟脈絡就跟你想的一樣。只要透過類似的關鍵字,馬上就可以找到你的回憶。

伴隨著 LLM 生成式 AI 的爆發性成長,其實再也不需要透過 Google Search 來搜尋自己寫過的內容。 其實你可以透過 RAG 的方式來直接去詢問一個聊天機器人來達到類似的工作。

相關的內容其實有很多,透過 LangChain 要來做一個 RAG 的功能更是相當的簡潔。 但是本篇文章將反樸歸真,透過 Python 與 Google Gemini 與 Firebase DB 直接告訴你如何打造 Embedding DB ,做成一個可以簡易的查詢功能的 RAG 應用。

完整相關程式碼:

https://github.com/kkdai/jekyll-rag-firebase

透過 Firebase Realtime DB 來當成 Vector DB

程式碼: https://github.com/kkdai/jekyll-rag-firebase/blob/main/embedding.py

image-20240823122740989

之前就一直在思考,究竟有沒有方式可以透過 Firebase 來做 Vector DB。其實是可以的,方式如下:

def generate_embedding(text):
    result = genai.embed_content(
        model="models/text-embedding-004",
        content=text,
        task_type="retrieval_document",
        title="Embedding of single string"
    )
    embedding = result['embedding']
    return embedding

這是一個透過 tex-embedding-004 的 gemini model ,可以幫助你直接將一串文字直接產生 Embedding 的 Vector Value 。

如果要將資料儲存在 Firebase 的資料庫內,其實也沒有那麼複雜。以下程式碼可以很快速了解。

def store_embedding(embedding_data):
    ref = db.reference('embeddings')
    ref.child(embedding_data['id']).set(embedding_data)
    print(f"Embedding data for {embedding_data['id']} stored successfully.")

完整範例大概如下:


# 範例文字
text_1 = "What is the meaning of life?"
text_2 = "How to learn Python programming?"
text_3 = "The quick brown fox jumps over the lazy dog."

# Embedding Vector Value
embedding_vector_1 = generate_embedding(text_1)
embedding_vector_2 = generate_embedding(text_2)
embedding_vector_3 = generate_embedding(text_3)

# 產生 DB data
embedding_data_1 = {
    'id': 'embedding_1',
    'vector': embedding_vector_1
}

embedding_data_2 = {
    'id': 'embedding_2',
    'vector': embedding_vector_2
}

embedding_data_3 = {
    'id': 'embedding_3',
    'vector': embedding_vector_3
}

# 儲存資料
store_embedding(embedding_data_1)
store_embedding(embedding_data_2)
store_embedding(embedding_data_3)

如何解析 Github Page 的 Blog 資料? (以 Jekyll 打造的 Blog 為例子)

範例部落格資料: https://github.com/kkdai/kkdai.github.io

程式碼:

image-20240823124515723

裡面會看到,公開的文章會放在 _posts 資料夾下面。 雖然裡面是 Markdown 的內容,但是這樣的內容往往更適合給 LLM 作為總結與 Embedding 使用。 接下來來看一下程式碼。

取得 Github Token

請參考這篇文章,有完整教學該如何取的 Github Token 作為 Github 操作之用。

讀取 Github 上面的檔案資料

def git_article(github_token, repo_owner, repo_name, directory_path):
    g = Github(github_token)
    repo = g.get_repo(f"{repo_owner}/{repo_name}")
    contents = repo.get_contents(directory_path)
    
    files_data = []
    
    while contents:
        file_content = contents.pop(0)
        if file_content.type == "dir":
            contents.extend(repo.get_contents(file_content.path))
        else:
            files_data.append({
                'file_name': file_content.name,
                'content': file_content.decoded_content.decode('utf-8')
            })
            print(f"Downloaded {file_content.name}")
    
    result = {
        'files': files_data,
        'total_count': len(files_data)
    }
    return result

這段程式碼,可以指定給他 tokenrepo_owner, repo_namedirectory_path 之後。他會將裡面的檔案一個個存取出來。

整個打包 - 讀取 Github Page 然後製作 Embedding Vector 在 Firebase 上

程式碼: https://github.com/kkdai/jekyll-rag-firebase/blob/main/blog_embedding.py

直接單獨執行這個程式碼即可。但是整個資料夾時間會比較久,也會花費相當程度的費用。

這部分程式碼中,請記得要將以下資料改成你的資料夾資料。

  • REPO_OWNER = ‘kkdai’
  • REPO_NAME = ‘kkdai.github.io’
  • DIRECTORY_PATH = ‘_posts’
def git_article(github_token, repo_owner, repo_name, directory_path):
    g = Github(github_token)
    repo = g.get_repo(f"{repo_owner}/{repo_name}")
    contents = repo.get_contents(directory_path)
    
    files_data = []

    while contents:
        file_content = contents.pop(0)
        if file_content.type == "dir":
            contents.extend(repo.get_contents(file_content.path))
        else:
            file_id = file_content.name.split('.')[0]
            if check_if_exists(file_id):
                print(f"File {file_id} already exists in the database. Skipping.")
                continue
            
            file_content_decoded = file_content.decoded_content.decode('utf-8')
            cleaned_content = remove_html_tags(file_content_decoded)
            embedding = generate_embedding(cleaned_content)
            
            embedding_data = {
                'id': file_id,
                'vector': embedding.tolist(),  # 将 numpy 数组转换为列表
                'content': cleaned_content
            }
            store_embedding(embedding_data)
            
            files_data.append({
                'file_name': file_id,
                'content': cleaned_content
            })
            print(f"Downloaded and processed {file_id}")
    
    result = {
        'files': files_data,
        'total_count': len(files_data)
    }
    return result

這邊稍微解釋一下,整個邏輯:

  • 讀取 jekyll 目錄底下 _posts
  • 取出檔案名稱,比如 2024-08-10-reading-elon-musk 作為 firebase 的 I
  • 先檢查是否已經在 Firebase Realtime DB 中有存在的物件
    • 如果有,就 skip 到下一個檔案
  • 取出裡面 utf-8 編碼的內容 file_content.decoded_content.decode('utf-8')
  • 並且去除掉所有 HTML tags remove_html_tags
  • 透過 generate_embedding 來產生整篇文章的 embedding vector value
  • 存入資料庫

透過 Firebase Realtime DB詢問資料

程式碼: https://github.com/kkdai/jekyll-rag-firebase/blob/main/blog_query.py

直接單獨執行這個程式碼即可。

# 示例调用
if __name__ == "__main__":    
    # 示例查询和生成响应
    question = "我哪一天架設 oracle8i 的?"
    response = query_and_generate_response(question, top_k=1)
    for res in response:
        print(f"File ID: {res['file_id']}, Similarity: {res['similarity']}")
        # print(f"Content: {res['content']}")
        content_str = res['content']
        # print(f'content_str: {content_str}')
        prompt = f"""
        use the following CONTEXT to answer the QUESTION at the end.
        If you don't know the answer, just say that you don't know, don't try to make up an answer.

        CONTEXT: {content_str}
        QUESTION: {question}

        reply in zh_tw
        """

        # print(f'prompt: {prompt}')
        completion = generate_gemini_text_complete(prompt)
        print(completion.text)
  • 先產生問句 question 的 Embedding

  • query_and_generate_response(question, top_k=1) 其中 k=1 只要最接近的一個答案。

    • def query_embedding(question, top_k=1):
          # 生成问句的嵌入
          question_embedding = generate_embedding(question)
              
          # 从数据库中获取所有存储的嵌入
          ref = db.reference('blog_embeddings')
          all_embeddings = ref.get()
              
          if not all_embeddings:
              return "No embeddings found in the database."
              
          # 计算问句嵌入与存储嵌入之间的相似度
          similarities = []
          for file_id, embedding_data in all_embeddings.items():
              stored_embedding = np.array(embedding_data['vector'])
              similarity = 1 - cosine(question_embedding, stored_embedding)
              similarities.append((file_id, similarity))
              
          # 按相似度排序并返回最相关的结果
          similarities.sort(key=lambda x: x[1], reverse=True)
          top_results = similarities[:top_k]
              
          results = []
          for file_id, similarity in top_results:
              file_content = ref.child(file_id).get()
              results.append({
                  'file_id': file_id,
                  'similarity': similarity,
                  'content': file_content
              })
              
          return results
      
    • 講問題與每一個資料的比對結果存入 similarities

    • 透過排序之後,挑選最相似的答案

      • similarities.sort(key=lambda x: x[1], reverse=True)
        top_results = similarities[:top_k]
        
  • 取出資料之後,將問句跟參考資料放入 prompt 之中來詢問。

    • prompt = f"""
      use the following CONTEXT to answer the QUESTION at the end.
      If you don't know the answer, just say that you don't know, don't try to make up an answer.
          
      CONTEXT: {content_str}
      QUESTION: {question}
          
      reply in zh_tw
      """
      
  • 回覆答案。

未來發展

本篇文章透過一些簡單的程式碼,來了解如何透過 Gemini 與 Firebase Realtime DB 來打造一個 RAG 的應用。程式碼儘可能使用原生的一些套件,儘量不使用比較複雜的 LangChain 或是 LlamaIndex 。

雖然使用 LangChain 或是 LlamaIndex 打造出來的 RAG 會更加的效果好甚至程式碼更少。但是我們還是需要知道 RAG 的原理是什麼,這樣才能針對相關的細節來優化與改善。

接下來我們可以持續改善的方向如下:

  • Embedding 的方式與演算法
  • 如果文章修改了,可以自動來更新 Embedding DB
  • 透過 LINE 官方帳號的應對與回覆,可以有更漂亮的畫面與相關應用。

[研討會筆記] Made by Google 一些雜記

在 20240814 凌晨有 Made by Google 的線上發表會,這裡快速記錄一些資訊。

手機相關功能

連接 YouTube 的 RAG

image-20240814130417331

直接問說影片裡面主角吃了什麼食物?後來就全部列下來。

預設電話筆記

Google Chrome 2024-08-14 12.52.23

  • 全程語音 STT 記錄下來
  • 資料放手機端
  • 不過應該還是會有隱私的問題。

Make you look

image-20240814131558885

拍小朋友照片,總是難以抓到小孩注意力。

這個小功能很聰明誒~我很喜歡。

一些心得

Google 也在自己手機加上了 on-device LLM ,首先看到幾個不錯的應用。

  • 電話筆記本真的很實用,不過會不會有隱私問題,我也很好奇就是。
  • 連接 YT 的 RAG 詢問,感覺會是需要付費的功能。(Gemini Advance)

期待著九月 iPhone 發表會會有什麼應對?

相關資料:

Google 舉辦了年度 Made By Google 發表會,推出了 Pixel 9 系列手機、Pixel Watch 3 手錶和 Pixel Buds Pro 2 耳機,並整合了 Gemini AI 技術。

重點:

  • Gemini Live 語音對話功能上線: 允許用戶與 Gemini AI 進行自然語音對話,並選擇回應的聲音。目前僅支援英語,提供給 Gemini Advanced 訂閱用戶。
  • Pixel 9 系列手機: 搭載 Tensor G4 晶片,支援多項 AI 功能,包括 Pixel Weather、Call Notes、Pixel Screenshots、Pixel Studio 等。攝錄功能也升級,新增 Add Me、Made You Look 和 Magic Editor 等 AI 功能。
  • Pixel 9 Pro Fold: 首次推出摺疊螢幕手機,搭載 16GB 記憶體,具備 Pixel Pro Camera。
  • Pixel Watch 3: 延續經典圓弧造型,新增 Lost of Pulse Detection 功能,可偵測用戶脈搏並緊急通報。
  • Pixel Buds Pro 2: 搭載 Tensor A1 晶片,體積更小、重量更輕,ANC 降噪功能更強,並支援 Gemini 語音助理。

總體而言,Google 在這次發表會上展示了其在 AI 和硬體方面的最新進展,並強調了 Gemini AI 在各項產品中的

[好書分享] 馬斯克傳:唯一不設限、全公開傳記

馬斯克傳:唯一不設限、全公開傳記
Elon Musk
 共 138 人評分
作者: 華特.艾薩克森  原文作者: Walter Isaacson  譯者: 吳凱琳  出版社:天下雜誌出版 

買書推薦網址:

前言:

這是 2024 年第 9 本讀完的書。這本在當初要出刊的時候就相當的轟動,但是實際看到實體書之後,應該也會不少人會被勸退。 但是其實書籍本身還是蠻有趣的,蠻推薦大家可以看一下。

內容摘要:

馬斯克唯一不設限、全公開傳記
權威傳記作家艾薩克森重磅力作

兩年深度跟訪,解密全世界最令人好奇,也最具爭議性的創新者——
是狂人還是造勢天才?是破壞者還是創新者?是混蛋還是英雄?
想要了解最真實的馬斯克,只能透過這本書!

★第一視角觀察馬斯克獨有的英雄模式與惡魔模式
★深入解讀馬斯克旗下六大事業的商業與創新策略
★揭露AI、自動駕駛、太空探險三大尖端科技趨勢

「不管你喜歡與否,我們都生活在馬斯克創造的世界裡。」—《時代》

馬斯克引領世界進入電動車時代、開發私人太空探險、嚴肅想像人工智慧,他改變了三大關鍵產業,也改變了我們的未來。喔,他還買下了推特。

他是打破常規的夢想家,沒有開不出的路徑,沒有打不破的框架,沒有丟不掉的包袱。對風險,不但冷靜計算,更熱情擁抱,冒險不設限。當其他企業家在發展世界觀時,馬斯克已在構建他的宇宙觀。

比任何科幻小說都更精采的傳奇人生,他旗下的每一個事業:特斯拉、SpaceX 與星鏈、X(原為推特)、鑽孔公司、Neuralink、xAI,都在改寫歷史。未來,他會如何進一步改變科技世界﹖

《賈伯斯傳》作者、最能捕捉天才腦中靈光的艾薩克森,跟隨馬斯克長達兩年,跟他一起開會、走訪工廠,採訪馬斯克本人、他的家人、朋友、同事和對手,寫出這部考證詳實、藏著驚人內幕的人生故事。寫作過程中,馬斯克從不掌控內容走向,也不要求在出版前先看過,甚至鼓勵他的對手、前員工跟作者談一談。

艾薩克森精闢描述馬斯克的成功與風暴,也探討了一個問題:驅動馬斯克的惡魔,是否也是創新和進步的推手?

馬斯克的成功無法複製,沒人能像他那樣。但他在成長、創新、創業歷程中的有效方法,值得你一讀。

投影片

https://gamma.app/docs/-4rx3tbi4xovhgkk

image-20240813185124640

心得:

當初看這本書,原本就是一個很欣賞 Musk 在許多層面的成就。但是對他的過往與相關成就又沒有那麼的熟悉,於是買了這本書來看。本來想說這一本書可能會看很久(因為真的很厚一本,就算用電子書來看,也是覺得看了很久)。但是其實整本書及說明了許多階段的馬斯克的過往,讓人很容易沈浸其中。

我覺得他的個性跟他得成長環境有相當大的關係,當然也跟他天生下來個性也有關。

image-20240815213408533

雖然大家都說馬斯克是暴君,是一個喜怒無常的人。(類似的形容詞好像也有出現在 Jobs 身上)但是比起 Jobs 是一個超級的產品經理加上銷售人員。 Musk 就像是超級工程師加上極度會節省成本的老闆。

image-20240815213314272

當然講到作為一個老闆,大家都對於馬斯克頗受爭議的一些作為跟思維有關,以下也整理一些。

image-20240815213525179

這本當然有提到 Tesla, SpaceX 甚至到了近期的 Twitter 購併跟 Neuralink 。這邊稍微提一下 Neuralink 的目標。

image-20240816125104596

為什麼馬斯克那麼的獨特? 而且為什麼他願意做這樣的事情,我們不知道,但是能夠像他這樣每次都把自己手上所有身家都壓下去,並且全心下去做的企業家,至今真的很少。 在 TED 的主持人就有問他這樣的問題,為什麼你願意把自己身家都放在一個全新的領域。是否有一些比較好的訣竅?

image-20240816124926360

馬斯克則拿出他的思考邏輯,試著去思考基礎的真理。不要去想著人家告訴你們怎麼做,或是原有的規範與流程。透過相關的思考,可以將許多重大事情的成本加以大幅度地降低,或是將許多困難的事情重新的去思考與測試。

image-20240816125452931

這件事情相當的重要,我想也是這本書籍一個很推薦大家去了解的點。

許多事情的作法上,永遠存在兩種以上的方向。一個是最輕鬆的,另外一個需要不斷地思考與測試才能看到的正確道路。
當你選擇最輕鬆的那一條路,往往那是得不到成功(或許是拒絕或是放棄)。
試著再思考一次,從物理邏輯上去重新思考。

真的很推薦大家去看這本書。

相關資料:

[好書分享] 異類矽谷-老派矽谷工程師不正經的深度田野踏查

異類矽谷
老派矽谷工程師不正經的深度田野踏查
作者: 鱸魚  出版社:時報出版 

買書推薦網址:

前言:

這是 2024 年第 8 本讀完的書。還記得當初畢業的第一份工作,找了一個美商公司去上班。(老闆其實是台灣人)然後上班第一個月也很幸運(?)就被派去矽谷出差一個多月(我記得是 50 多天),那一段時間的工作體驗也相當的特別。後來有其他機會去矽谷參加研討會,也有機會看到不同得面貌。這一本書就讓我蠻有感觸的。

內容摘要:

矽谷不是地名,是文化。
 
在白人只占三成而且其中很多都不是美國人、半數工程師是印度人的矽谷,沒人在乎口音也不講究排場,全公司上下包括CEO都穿牛仔褲,「正式」不過是把T恤換成襯衫。
 
矽谷人從不羨慕別人開什麼車,畢竟沒人會羨慕別人穿什麼襪子,講究的人根本不買車,沒車最酷最環保。新一代工程師甚至沒人抽菸,因為那太落伍。
 
◎最精準的矽谷直送
 
矽谷不喜歡也不浪費時間在繁文縟節,開會只想聽真問題並找到解決方案。在這裡,有司機並不比當Uber司機光榮。若要求矽谷CEO為了尊榮感放棄隱私,那將是種羞辱。
 
來自全世界的矽漂族共同打造了矽谷,這裡追求的不是明天會更好,而是明天「一定要」更好,以最高效率打造個人和企業價值,卻也大方犒賞、無情淘汰,既勢利又誠實。

####

投影片

image-20240802144706975

https://gamma.app/docs/jqvjlzehglge9p0?following_id=jehro1dlnujeazj&follow_on_start=true

心得:

這本書相當有趣的敘述了矽谷生活的許多大小事情,裡面提到的關於印度人的讓我印象很深刻。

「矽谷早已不在乎口音
上面舉的這些字是我工作上每天都會面對的。折磨了二十多年,每次都從困惑到試圖解碼,最後不了了之,因為對話早已結束,也造就了我學會深度敷衍的技巧。這是在矽谷工作必須承受的另類職業傷害,保險絕不給付。
然而,矽谷在乎的是說話的內容,不是口音。當很多華人工程師的英文寫作還在「沒有錯」的邊緣掙扎,印度人的英文寫作早已超越了美國人,用字與表達無不精準有力。
矽谷在乎的是內容,這也是為什麼印度人能夠蜂擁進入高階主管群,華人在這方面連車尾燈都看不到。」

還有最近一次去就是 2019 年去參加 Google I/O ,那一次去尋找飯店的時候就聽到同行的友人有人在看的飯店,評論竟然是停車場容易有毒品交易,這也是讓我相當的驚訝。

這本詳細敘述了在矽谷的工程師,其實不一定是人人欽羨的工作。高待遇帶來的高度壓力,並且住宿品質也沒有其他區域好。卻要付出更多的住宿費用與交通時間。這些問題雖然在疫情之後應該有了極大的改善,但是聽說又帶來新的一波遊民問題。因為過多的外來勞工與遠端工作的人,許多原本在矽谷定居的人失去了工作機會。

近期的矽谷除了遊民問題外,還有 2020 開始的野火問題。也讓矽谷的人經常處於不好的空氣環境。

image-20240801230243234

在舊金山灣區的北灣,有著大家最熟悉的景色。 XP 的桌布畫面。

[好書分享] 歷史,就是戰

歷史,就是戰
黑貓老師帶你趣解人性、權謀與局勢
作者: 黑貓老師  
插畫: 魔魔嘎嘎  
出版社:圓神出版 
出版日期: 2018/01/01

買書推薦網址:

前言:

這是 2024 年第 7 本讀完的書。這一系列的歷史小品書,都是我拿來當作休閒用的閱讀書籍。加上看起來有不少有趣的插畫跟不錯的小故事。就買了下來。

內容摘要:

狂人的心機謀略X戰場上的超展開 
妙讀歷史,秒懂國際間的爾虞我詐
有這麼多人想要征服世界,但是從來沒成功過!
看看我們的世界,到底是怎麼被這些人搞成這樣的!ヽ(`Д´)ノ

第一本用鄉民語言專業撰寫,讀歷史不再頭昏腦脹,而是笑得精神抖擻!讓人不禁吶喊,當年我的歷史老師這麼教就好了!
★(O_ O)打破本國和世界史的界線,跳脫的縱線學習,結合地理概念,縱貫交叉,帶出新史觀
★(゚∀。)用看故事的方式趣讀歷史,從熱戰到冷戰,全盤了解影響世界局勢的10大重要戰爭
★( ´ω`? )旁徵博引各種有趣的豆知識,讓你的歷史戰鬥力大爆發,程度再升級
★(゚Д゚)搞懂鬥氣鬥智、縱橫沙場、老謀深算的那些大人物到底在打什麼謀略的算盤

心得:

這一本書敘述了近一兩百年最重要的一些戰役,透過生動有趣的口吻,讓大家知道其實許多的戰爭由來,並且如何分析相關的因果關係。比如說第一次世界大戰,就是野心勃勃的德國,遇上相關爭議所引發的。但是第一次世界大戰的賠償卻也是引發第二次世界大戰的導火線。 相關的戰略要素跟幾個重大的戰役,也都用很幽默的口吻跟有趣的史實來分享。

後續的侵華戰爭,加上國共內戰也是敘述得很精彩。真的讓人可以看得出來人類的歷史真的就是一個戰。但是身為讀者的我們,要了解戰爭不是只是表面上的相關意象,更不是幾個人的意氣之爭。往往在許多國家的利益糾葛,與許多的歷史因素交織而成。這一本書真的可以讓人在輕鬆的心情下來吸收相關的知識。

[好書分享] 弘兼憲史上班族基本數字力

image-20240730214104863

弘兼憲史上班族基本數字力

買書推薦網址:

  • Readmoo: 下架了

前言:

這是 2024 年第 6 本讀完的書。 當初看到作者就買了,本來想說可以補充相關知識的。

內容摘要:

你知道薪資明細表裡的機關嗎?

  「成本」究竟是什麼?

  貨物賣得多,錢就賺得多嗎?

  上班族不可缺乏的基本數字力,數字力強,工作才能做得好。

◆只要數字概念強,你就能成為工作能力佳的上班族!

  不論職場菜鳥或老鳥,不管是什麼樣的工作,多少都會接觸到和數字相關的業務內容。舉凡產品成本估算、定價;個人薪資所得;產業景氣循環;企業經營分析、償債能力等,都是身為優秀上班族,不可不知的超基本常識。

  像是新聞報導常見的「景氣動向指標」,它是根據對景氣的變動敏感的幾項指標組合而成,其中指標可分為「領先指標」、「同步指標」、「落後指標」三種。由於組合了多項指標,可對景氣的狀況做出綜合性的判斷與預測,得知目前景氣好或壞,決定公司因應的各項策略。

  另外,經營分析經常用在調查企業的往來對象上,但除此之外也有其他用途。例如,要投資股票時,必須先得知投資標的那家公司的狀況。因此,經營分析相當有用。如果先學會經營分析,也會變成能夠更深入理解新聞媒體報導關於企業的事。

  諸如此類,上班族必備的基本數字力,包含面對個人、產品、市場、企業、商業等各領域的業務。本書提出各類數字的計算由來,運用的方法,讓你輕鬆掌握關鍵數字,解決問題無往不利。

心得:

弘兼憲史一直是我很喜歡的漫畫家,他最有名的就是「課長-島耕作 」。裡面除了有日本上班族的心路歷程外,最重要的就是針對日本企業各種文化的考究與整理。 這一本也是,整理了很多相關的基本知識。 但是隨著有在投資股票,許多的基本相關財務報表的基本概念也就出現了。 因為有一些財報的分析,能夠了解裡面的基本原因,經常聽著財經號角跟股癌也讓我基本知識有一些些的進步。(當然賠錢賠得多,學得最多)。

不過這一本比較基本,如果有基本企業概論或是經濟學概念的人,或許就不需要閱讀了。