前言
學習大模型Agent相關知識,使用llama_index實現python版的Agent demo,根據AI解題場景知識密集型任務特點,需要實現一個偏RAG的Agent WorkFlow,輔助AI解題。
使用Java結合Langchain4j支持的RAG流程一些優化點以及自定義圖結構的workflow,創建Agentic RAG,實現AI解題demo,并測試解題效果。
Agent概述
Agent智能體(Agent)是指在特定環境中能夠自主感知、決策和行動的計算機系統或軟件實體。Agent智能體通常具備以下幾個關鍵特性:
- 自主性(Autonomy):Agent智能體能夠獨立運行,不需要持續的人工干預。它們可以根據自身的感知和內部狀態做出決策。
- 感知能力(Perception):Agent智能體能夠感知其環境,通過傳感器或數據輸入獲取外部信息。這些信息可以是物理環境中的數據,也可以是其他系統或Agent智能體提供的信息。
- 決策能力(Decision-Making):Agent智能體能夠基于感知到的信息和內部狀態進行分析和決策。決策過程可能涉及規則、邏輯推理、機器學習算法等。
- 行動能力(Action):Agent智能體能夠執行特定的動作或任務,以實現其目標。這些動作可以是物理操作(如機器人移動)或虛擬操作(如發送數據、修改文件等)。
- 目標導向(Goal-Oriented):Agent智能體通常被設計為實現特定的目標或任務。它們會根據目標調整其行為,以最大化目標的實現。
- 交互能力(Interactivity):許多Agent智能體能夠與其他Agent智能體或人類用戶進行交互。這種交互可以是協作性的,也可以是競爭性的。
開源的一些Agent框架
主要是python生態使用的,可以參考思想。
推薦收藏!九大最熱門的開源大模型 Agent 框架來了_agent框架-CSDN博客
AI解題11-RAG流程優化以及Agent學習
agent demo
RAG相關優化思路
RAG流程的一些優化思路
- Query理解(Query NLU):使用LLM作為基礎引擎來重寫用戶Query以提高檢索質量,涉及Query意圖識別、消歧、分解、抽象等
- Query路由(Query Routing):查詢路由是LLM支持的決策步驟,根據給定的用戶查詢下一步該做什么
- 索引(Indexing):是當前RAG中比較核心的模塊,包括文檔解析(5種工具)、文檔切塊(5類)、嵌入模型(6類)、索引類型(3類)等內容
- Query檢索(Query Retrieval):重點關注除典型RAG的向量檢索之外的圖譜與關系數據庫檢索(NL2SQL)
- 重排(Rerank):來自不同檢索策略的結果往往需要重排對齊,包括重排器類型(5種),自訓練領域重排器等
- 生成(Generation):實際企業落地會遇到生成重復、幻覺、通順、美化、溯源等問題,涉及到RLHF、偏好打分器、溯源SFT、Self-RAG等等
- 評估與框架:RAG需要有全鏈路的評價體系,作為RAG企業上線與迭代的依據
一個基于RAG的Agentic RAG智能體最終目的是讓大模型回答內容是完全以及事實文檔的,不要根據幻覺輸出內容。
向Lv2-智能體提出一個問題。
while (Lv2-智能體無法根據其記憶回答問題) {Lv2-智能體提出一個新的子問題待解答。Lv2-智能體向Lv1-RAG提問這個子問題。將Lv1-RAG的回應添加到Lv2-智能體的記憶中。
}
Lv2-智能體提供原始問題的最終答案
langchain4j-agent-demo
langchain4j提供多種優化策略優化RAG流程,對于Java中構建一個Agent,需要使用langchain4j實現RAG流程以及系列優化(如借助Function Call等實現問題重寫、文檔打分、幻覺檢查、答案評分等),然后重寫一套流程圖工作流,支持定義行為節點、條件邊、流轉條件,節點輸出狀態等。
參考:https://github.com/bsorrentino/langgraph4j
為了兼容在jdk21,支持copy了所有類,代碼地址:https://git.xkw.cn/mp-alpha/qai/-/tree/feat-agent
構建Graph
public CompiledGraph<NodeData> buildGraph() throws Exception {var workflow = new StateGraph<>(NodeData::new);// Define the nodesworkflow.addNode("web_search", node_async(this::webSearch)); // web searchworkflow.addNode("retrieve", node_async(this::retrieve)); // retrieveworkflow.addNode("grade_documents", node_async(this::retrievalGrader)); // grade documentsworkflow.addNode("generate", node_async(this::generate)); // generateworkflow.addNode("transform_query", node_async(this::transformQuery)); // transform_query// Build graph// 入口節點workflow.setConditionalEntryPoint(edge_async(this::routeQuestion),Map.of("web_search", "web_search","retrieve", "retrieve"));workflow.addEdge("web_search", "generate");workflow.addEdge("retrieve", "grade_documents");// 條件邊workflow.addConditionalEdges("grade_documents",edge_async(this::decideToGenerate),Map.of("transform_query", "transform_query","web_search", "web_search","generate", "generate"));workflow.addEdge("transform_query", "retrieve");// 條件邊workflow.addConditionalEdges("generate",edge_async(this::gradeHallucination),Map.of("not supported", "generate","useful", END,"not useful", END,"not support ready web search", "web_search"));return workflow.compile();}
本質還是盡可能防止大模型幻覺輸出,借助一些工具讓大模型自行決策,希望大模型的輸出都是來自于文檔事實。
- 試題重寫,生成相似試題,增強RAG召回內容。
- 文檔相關性評分:對RAG的文檔進行相關性打分。
- 支持接入web search:增強文檔召回。
- 幻覺檢查:檢查生成的答案是否是有召回的文檔上下文為依據的。
- 答案評分:評估答案是否正確解答了試題。
入口會先進行retrieve、web_search路由
- 優先進行retrieve流程,接著一系列文檔相關性評分、問題/試題重寫、評估是否答案幻寫、評估答案得分(是否基于文檔事實)、答案生成等。如果retrieve最終結果為not sure開啟web_search流程。
- web_search流程:文檔search、文檔相關性評分、問題/試題重寫、答案生成。
拓展一些圖狀態節點元數據,實現循環次數限制,防止進入死循環
- 總的圖狀態轉移的最大次數設置為xx,得不到結果,就返回答案未知。
- 設置maxTransformQueryCount,控制transform_query 和 grade_documents 圖節點轉移的最大次數為x,判定檢索到文檔沒有幫助,就不再轉換查詢,終止狀態循環,生成結果。
- 設置maxHallucinationGraderCount,grade_hallucation 和 generate 圖節點轉移最大次數為x,判定生成的答案不是基于文檔、事實,就不再重復生成,終止循環狀態,進行 grade_answer。
- 設置maxWebSearchCount,grade_hallucation 和 web search 圖節點轉移最大次數為x,判斷RAG之后答案仍不以文檔為依據進行web search,然后在評分,加上異常捕獲和控制最大次數;
另外需要對transform_query做一些處理,因為是解答試題場景,需要保存最初的試題,最后生成答案是基于最初的試題,中間轉換生成的試題,只起到 增強RAG召回以及輔助解題上下文的作用。
解題測試
AI解題12-解題場景智能體Agentic RAG預研demo
100道高中英語單選,模型使用base4o,RAG參數設置召回數量為5,召回最小閾值為20.0
- 使用Agent大概能解答對94;
- 直接使用RAG解答的話大概能解答對90;
使用該Agent之后,token消耗會增多,解題時間也會變長。
綜合測試結果分析,可以考慮使用在那些直接RAG解答錯誤的試題,可以使用此Agent重新生成答案,一定幾率會生成正確答案。
llama-index-agent-lats-demo
Language Agent Tree Search - LlamaIndex
使用python實現的llamaindex-lats-agent-demo,java版的應該還沒框架直接支持。
目前的提示詞場景ToT
原理類似上面,有狀態節點,拆分子任務,號稱是ToT的加強版,具有反思、外部反饋
改善推理和決策,反向傳播等
demo見文檔:https://mxkw.yuque.com/dsd6et/qbm/fqoi5viogs1g0rd8#BI6Rn