### [AI / ML領域相關學習筆記入口頁面](https://hackmd.io/@YungHuiHsu/BySsb5dfp) ### [Deeplearning.ai GenAI/LLM系列課程筆記](https://learn.deeplearning.ai/) #### [Large Language Models with Semantic Search。大型語言模型與語義搜索 ](https://hackmd.io/@YungHuiHsu/rku-vjhZT) #### [Finetuning Large Language Models。微調大型語言模型](https://hackmd.io/@YungHuiHsu/HJ6AT8XG6) #### [LangChain for LLM Application Development](https://hackmd.io/1r4pzdfFRwOIRrhtF9iFKQ) --- [LangChain for LLM Application Development](https://www.youtube.com/watch?v=jFo_gDOOusk) 系列課程筆記 - [Models, Prompts and Output Parsers](https://hackmd.io/1r4pzdfFRwOIRrhtF9iFKQ) - [Memory](https://hackmd.io/@YungHuiHsu/Hy120mR23) - [Chains](https://hackmd.io/@YungHuiHsu/SJJvZ-ya2) - [Question-and-Answer](https://hackmd.io/@YungHuiHsu/BJ10qunzp) - [Evaluation](https://hackmd.io/@YungHuiHsu/Hkg0SgazT) - [Agents](https://hackmd.io/@YungHuiHsu/rkBMDgRM6) ![](https://hackmd.io/_uploads/r1WTGXRhn.png =400x) source : [LangChain.dart](https://pub.dev/packages/langchain) --- # [LangChain -Evaluation](https://learn.deeplearning.ai/langchain/lesson/6/evaluation) ## 課程概要 ### LLM應用程序評估策略 1. **問答對創建與評估**: - 手動檢視文檔,創建問答對 - 利用LLM自動生成問答對,提高效率 2. **實例運行與輸出分析**: - 輸入問題,分析系統回答,評估準確性 - 啟用LangChain的debug模式(`langchain.debug = True`),深入了解系統運作 3. **語言模型評分**: - 使用LLM評分回答的正確性 ### 更換LLM或調整系統參數後的評估 1. **重新評估**: - 更換LLM或調整參數後,重複評估流程 - 比較變更前後的性能差異 2. **輸入輸出分析**: - 使用LangChain評估平台或其他工具分析每步輸入輸出 - 關注語言模型的輸入提示和檢索文檔 3. **性能指標追蹤**: - 追蹤token使用量、響應時間等指標 - 比較這些指標在變更前後的差異,評估影響 ## 前言 如何評估使用大型語言模型(LLM)構建的複雜應用程序的效能。主要觀點包括: 1. **評估應用程序效能的重要性**:強調了在使用LLM構建應用程序時,評估其效能和準確性的重要性 2. **應對實施變更的評估**:討論了在更換LLM、調整使用向量數據庫的策略,或更改其他系統參數時,如何評估這些變更對應用程序效能的影響 3. **評估工具和方法**:提到了一些工具和方法,如視覺化工具和調試器,以及直觀檢視(by eye)和使用LLM自身來評估其他LLM、鏈和應用程序的方法 4. **整體評估過程的重要性**:強調了獲取應用程序各個步驟的全面圖景的重要性,以及在開發過程中重新思考評估工作流的趨勢 > a lot of development shifting towards **prompting-based development**, developing applications using LLMs, this whole workflow evaluation process is being rethought ## Lab - 本節程式碼流程圖 ```mermaid graph TD subgraph Preparation Phase A[Import Modules] --> B[Load Dataset<br>`CSVLoader`] end subgraph Application Building Phase C[Create Index<br>`VectorstoreIndexCreator`] --> D[Set Up Language Model<br>`ChatOpenAI`] --> E[Create Retrieval QA Application<br>`RetrievalQA`] end subgraph Execution and Evaluation Phase F[Generate Q&A Pairs<br>`QAGenerateChain`] --> G[Run Application \nand Generate Predictions] --> H[LLM Assisted Evaluation<br>`QAEvalChain`] --> I[Output \nResults and Grades] end A --> C C --> F ``` ### Create our QandA application 利用語言模型和文件資料索引功能,從指定的資料集中找到並回答相關問題 - 導入所需模塊 ```python from langchain.chains import RetrievalQA from langchain.chat_models import ChatOpenAI from langchain.document_loaders import CSVLoader from langchain.indexes import VectorstoreIndexCreator from langchain.vectorstores import DocArrayInMemorySearch ``` - 加載數據 ```python file = 'OutdoorClothingCatalog_1000.csv' loader = CSVLoader(file_path=file) data = loader.load() ``` 這裡從名為`OutdoorClothingCatalog_1000.csv`的文件中加載數據。 - **創建索引**: ```python index = VectorstoreIndexCreator( vectorstore_cls=DocArrayInMemorySearch ).from_loaders([loader]) ``` 使用`VectorstoreIndexCreator`來創建一個向量存儲索引,這將允許快速檢索與問題相關的文檔。 - **設置語言模型**: ```python llm = ChatOpenAI(temperature = 0.0, model=llm_model) ``` 創建一個`ChatOpenAI`實例,設置溫度為0(生成更確定性的回答),並指定使用的模型。 5. **創建問答系統**: ```python qa = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=index.vectorstore.as_retriever(), verbose=True, chain_type_kwargs = { "document_separator": "<<<<>>>>>" }) ``` 這裡創建了一個`RetrievalQA`實例,指定了使用的語言模型、檢索器(由索引提供)、以及其他配置。 - `chain_type="stuff"`指定了問答鏈的類型 - `document_separator`用於在文檔間添加分隔符號 ### 手動評估示範 Manual Evaluation 使用LangChain中的QAGenerateChain來自動從一組文檔中生成問答對,可以快速創建大量用於評估語言模型的數據 - Hard-coded examples - 先手動創見一個範例QA資料集 ```PYTHON= examples = [ { "query": "Do the Cozy Comfort Pullover Set\ have side pockets?", "answer": "Yes" }, { "query": "What collection is the Ultra-Lofty \ 850 Stretch Down Hooded Jacket from?", "answer": "The DownTek collection" }] ``` - **使用LLM自動生成問答對**: - 利用LangChain中的QA生成鏈,自動從文檔中生成問答對。這個過程使用了Chat OpenAI語言模型,並通過apply和parse方法生成包含問題和答案的字典。 ```python= from langchain.evaluation.qa import QAGenerateChain example_gen_chain = QAGenerateChain.from_llm( ChatOpenAI(model=llm_model)) new_examples = example_gen_chain.apply_and_parse( [{"doc": t} for t in data[:5]]) # 擴增資料集 examples += new_examples ``` - `QAGenerateChain`是一個專門用於生成問答對的工具,它利用語言模型從給定的文檔中自動創建問題和對應的答案 - 使用`apply_and_parse()`方法來生成問答對 - **運行實例並檢視輸出**: - 將問題輸入到鏈中,檢視生成的答案。這有助於初步評估應用程序的效能。 - 傳遞給語言模型的提示包括系統訊息和描述。它指示模型使用上下文來回答用戶的問題,並在不知道答案時承認 - **使用LangChain的調試功能**: - 通過設置`langchain.debug = True`,可以查看更多關於鏈內部運作的信息,如語言模型的實際提示、檢索到的文檔、中間結果等,這有助於深入了解和調試(debug)應用程序 ```py= import langchain langchain.debug = True ``` - 追蹤Token使用情況: - 輸出包括詳細信息,如"token_usage"、"prompt_tokens"、"completion_tokens"、"total_tokens" 和 "model_name"。這對於隨時間追蹤Token消耗非常有用,這與總成本密切相關 - **手動評估生成的問答對**:對於創建的所有問答對,可以手動運行鏈並評估輸出的正確性、部分正確性或錯誤性,但過程相當繁瑣,因此需要使用語言模型進行自動化 ### 利用LLM進行自動化評估(LLM assisted evaluation) 通過比較系統的預測答案與實際答案,並生成評分來評估其準確性。這種方法可以大大提高評估過程的效率和客觀性 1. **生成預測**: ```python predictions = qa.apply(examples) predictions[0] # {'query': 'Do the Cozy Comfort Pullover Set have side pockets?', # 'answer': 'Yes', # 'result': 'The Cozy Comfort Pullover Set, Stripe has side pockets on the pull-on pants.'} ``` 這行程式碼使用問答系統(`qa`)對一組範例(`examples`)進行評估,生成預測答案。`examples`包含了問題和對應的正確答案。 2. **導入QAEvalChain**: ```python from langchain.evaluation.qa import QAEvalChain ``` - `QAEvalChain`是用於評估問答系統輸出的工具 3. **創建評估鏈**: ```python llm = ChatOpenAI(temperature=0, model=llm_model) eval_chain = QAEvalChain.from_llm(llm) ``` 這裡首先創建了一個`ChatOpenAI`的實例,設定溫度為0(意味著生成的答案將更加確定性和一致性),並使用指定的模型`llm_model`。然後,使用這個語言模型實例來創建一個`QAEvalChain`評估鏈。 4. **評估輸出**: ```python graded_outputs = eval_chain.evaluate(examples, predictions) graded_outputs # [{'text': 'CORRECT'}, # {'text': 'CORRECT'}, # {'text': 'CORRECT'}, # {'text': 'CORRECT'}, # {'text': 'CORRECT'}, # {'text': 'CORRECT'}, # {'text': 'CORRECT'}] ``` 使用`evaluate`方法對原始範例和問答系統生成的預測進行評估。這將比較每個問題的預測答案與實際答案,並生成評分 ```python= for i, eg in enumerate(examples): print(f"Example {i}:") print("Question: " + predictions[i]['query']) print("Real Answer: " + predictions[i]['answer']) print("Predicted Answer: " + predictions[i]['result']) print("Predicted Grade: " + graded_outputs[i]['text']) print() ``` - 檢視結果 ```text= Example 0: Question: Do the Cozy Comfort Pullover Set have side pockets? Real Answer: Yes Predicted Answer: The Cozy Comfort Pullover Set, Stripe has side pockets on the pull-on pants. Predicted Grade: CORRECT ``` ### LangChain evaluation platform LangChain Plus, can be accessed here https://www.langchain.plus/. Use the invite code lang_learners_2023 ![](https://hackmd.io/_uploads/SJGcHe0f6.png =600x) > ![](https://hackmd.io/_uploads/H1rQ8lRzp.png =600x) - 平台功能 * 用戶介面(UI)展示:持續追蹤並展示筆記本中的操作 * 輸入和輸出追蹤:查看每個鏈條的輸入和輸出 * 深入分析:深入了解每個步驟的詳細信息 * 聊天模型詳情:查看傳遞給聊天模型的系統訊息、用戶問題、模型回應和輸出元數據 * 數據集功能:通過點擊按鈕將範例添加到數據集 * 數據集建立與擴充:方便地創建和擴充用於評估的範例集 * 評估過程促進:逐步建立範例集,促進評估過程的持續進行