AI 超级智能体项目 - 第三期:基础内容 笔记 (使用GEMINI)

  1. Prompt engineer 分兩種
    • 1.1 系統預設提示詞
    • 1.2 用戶提示詞
  2. token成本估算表格 給老闆看
    • 精簡提示詞內容
    • 定期清理對話上下文,或是以總結代替過於冗長的上下文
    • 使用向量檢索代替直接輸入 不要將整個文檔作為Prompt 而是使用向量資歷褲或是RAG獲取相關段落
    • 結構化代替自然語言:條列式點
  3. 提示詞資源
    • 官方提供文檔,不同模型有不同

4.基礎提示技巧

  • 4.1 明確指定任務和角色
  • 4.2 提供足夠上下文前提和期望的輸出格式範例
  • 4.3 使用結構化格式引導思維:列表、表格
  • 4.4 明確輸出長度、格式、風格
  1. 進階提示詞技巧
  • 5.1 chain of thought 引導'推理'步驟
  • 5.2 給指導範例 few shot learning
  • 5.3 分步驟理解 step by step
  • 5.4 要求模型自我評估和修正
  • 5.5 知識檢索和引用 要求模型給研究來源
  • 5.6 多視角分析 要求模型從不同角度、不同思路去分析
  • 5.7 給模型多模態參考資料
  1. 提示詞微調和優化 (重要!) 開發中會需要去調整提示詞提高AI的準確度,以下會有三個方法
  • 6.1 迭代式:透過逐步修改和完善提示詞
  • 6.2 邊界測試:透過測試極端case2得到模型的能力邊界,得到找出優化空間
  • 6.3 提示詞模板化:透過固定模板加上插入參數的方式得到固定的回答效率
  • 6.4 明確指出錯誤並要求AI修正:在使用AI幫助開發時非常有用

總結:任務越複雜,給的補充資料要越多! 經典:提問的智慧 https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md

  1. AI需求應用分析
    • 調研、細化、找到核心需求、開發完成核心功能去測熱度:工程師應該去訓練自己找出問題的思維
    • 很多新手小白都是想說要一次做完很多功能才能上線,其實這樣不對
    • 而是將核新功能能做好後就必須先上線,去測試市場的接收度,避免浪費開發資源和時間(PM很懂)
  2. AI應用方案設計
    • 8.1主題? 需求?
    • 8.2 分析出核心需求
    • 8.3 為完成核心需求選取技術:是否需要多輪對話、要設計怎樣的系統提示詞
    • 8.4 SpringAI: Chat Client API

AI調用

  1. Client API 官方文檔 https://docs.spring.io/spring-ai/reference/api/chatclient.html
  2. Advisors API https://docs.spring.io/spring-ai/reference/api/advisors.html
    • 調用AI的過程中做攔截器(middleware) 例如對話記憶、RAG 跟spring servlet MVC攔截器類似
    • Before Advising、After Advising
    • 攔截器advisor的執行順序是由getOrder決定的 不是代碼的出現順序
    • Class 右鍵 Diagram 可以查看 Class繼承關係圖
    • 可以把多個ChatAroundAdvisor組裝成CallAroundAdvisorChain 有順序的鏈條
    • callAround stringAround 同步 異步區別 2.1幾個比較重要的Advisor
      • MessageChatMemoryAdvisor
      • PromptChatMemoryAdvisor
      • VectorStoreChatMemoryAdvisor 2.2 chatmemory
      • 負責管理歷史對話的CRUD
      • InMemory
      • Neo4j
      • Cassandra
      • Jdbc
      • 自己實現:放在哪裡都可以 就實現chatmemory裡面的CRUD方法即可以

代碼實現

  1. 初始化ChatClient配置
text
复制代码
public SqlAssistantApp(GoogleGenAiChatModel googleGenAiChatModel) { //chatModel: 要放哪個模型就放哪個模型的Class 可以先打ChatModel ctrl點進去看繼承關係 就知道目前引入那些依賴的大模型可以用了 ChatMemoryRepository chatMemoryRepository = new InMemoryChatMemoryRepository(); //chatMemoryRepository: chatMemory的儲存位置 這裡使用InMemory ChatMemory chatMemory = MessageWindowChatMemory.builder() chatMemory: 設定對話上下文記憶功能,這邊指定儲存到剛剛設定的chatMemoryRepository .chatMemoryRepository(chatMemoryRepository) .maxMessages(10) .build(); chatClient = ChatClient.builder(googleGenAiChatModel) // chatClient: 與大模型通訊的設定,包含系統提示詞、Advisor注入剛剛的chatMemory記憶設定 .defaultSystem(SYSTEM_PROMPT) .defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build()) .build(); }
  1. 實現多輪對話方法
text
复制代码
public String doChat(String message, String conversationId) { //message: 使用者提示詞、conversationId: 用於區隔不同對話 ChatResponse chatResponse = chatClient.prompt() .user(message) .advisors(advisor -> advisor.param(ChatMemory.CONVERSATION_ID, conversationId)) .call() .chatResponse(); //這邊回應可以使用.content()獲取簡單對話,也可以使用.chatResponse得到更多資訊metadata String content = chatResponse.getResult().getOutput().getText(); log.info("content: {}", content); return content; }
  1. 單元測試看看對話記憶功能 Class名稱->右鍵Go to -> Test -> Create new Test

上述重點

要搞懂以下名詞: 多看幾次官方文檔,善用ctrl+F去找關鍵字 https://docs.spring.io/spring-ai/reference/api/chatclient.html#_returning_a_chatresponse

  • chatModel: 你要使用哪個大模型
  • chatMemory: 設定對話上下文記憶功能,通常會注入chatMemoryRepository才知道記憶要儲存到哪裡
  • chatMemoryRepository: chatMemory的儲存位置
  • chatClient: chatClient: 與大模型通訊的設定,包含系統提示詞、Advisor注入剛剛的chatMemory記憶設定
  • 大模型回應 : .call() -> .content or .chatResponse有更多細節資料
  • 重點就是可能需要一直在intellij中,去看ctrl加左鍵源代碼,才能找到官方文檔中沒有說到的細節。
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
kiyo
作者分享
AI 超级智能体项目- 第二期:GEMINI AI 大模型接入 笔记
3
看完用戶中心15,大致上搞懂資料關係 ✔️ UserMapper 繼承 BaseMapper<User> ✔️ UserService 繼承 IService<User> ✔️ UserServiceImpl 繼承 ServiceImpl<UserMapper, User> 並實作 UserService ┌─────────────────────────────┐ │ BaseMapper<T> │ ← MyBatis-Plus 內建 └─────────────▲──────────────┘ │ ┌─────────┴─────────┐ │ UserMapper │ ← 你自己定義 └───────────────────┘ ┌─────────────────────────────┐ │ IService<T> │ ← MyBatis-Plus 內建 └─────────────▲──────────────┘ │ ┌─────────┴─────────┐ │ UserService │ ← 你自己定義介面 └───────────────────┘ ▲ │ implements │ ┌──────────────────────────────────────────┐ │ ServiceImpl<UserMapper, User> │ ← MyBatis-Plus 內建 │ (內含 baseMapper、CRUD 實作) │ └───────────────────▲──────────────────────┘ │ extends │ ┌───────────────┴────────────────┐ │ UserServiceImpl │ ← 你自己的實作 └────────────────────────────────┘
2
251009 學習了用戶中心9-13視頻 原本學的是.net core 目前還在理解一些java的用法 1. Dependency Injection 對應 In .net core, UserService : IUserService is corresponds to Spring’s @Service(Interface) + @Resource.(Injection class) 2. Mybatis plus 有點像是generic repository 只要extends BaseMapper就能生成基本的CRUD (在.net core都要自己寫) 每日一句: I feel invincible!
1
25.10.9 - 背了Java八股基礎,以及做出自己的學習筆記 明天:上班繼續背八股、下班學習用戶中心
2
下载 APP