衡水穩(wěn)定的網(wǎng)絡(luò)建站icp備案號是什么意思
鶴壁市浩天電氣有限公司
2026/01/24 06:43:42
衡水穩(wěn)定的網(wǎng)絡(luò)建站,icp備案號是什么意思,龍巖網(wǎng)頁制作公司,節(jié)省空間的裝修設(shè)計Langchain 淺出 原本的計劃是發(fā)一篇《langchain深入淺出》#xff0c;但是太長了就切割成了兩部份#xff0c;先發(fā)了這篇淺出 中間還經(jīng)歷了大版本的更新╮(╯▽╰)╭但是有驚無險還是寫完了。 作者#xff1a;吳佳浩
最后更新#xff1a;2025-11-27
適用版本#xff1a;…Langchain 淺出原本的計劃是發(fā)一篇《langchain深入淺出》但是太長了就切割成了兩部份先發(fā)了這篇淺出中間還經(jīng)歷了大版本的更新╮(╯▽╰)╭但是有驚無險還是寫完了。作者吳佳浩最后更新2025-11-27適用版本LangChain v1.0目錄什么是 LangChain環(huán)境準備核心概念實戰(zhàn)案例什么是Langchain這里我就不多話太多時間和大家扯淡了 一句話概括什么是langchainLangChain 是把“模型、提示、工具、記憶”等模塊按統(tǒng)一 Runnable 接口串成 pipeline讓開發(fā)者像搭積木一樣快速搭建 LLM 應(yīng)用的生產(chǎn)級框架。核心優(yōu)勢模塊化設(shè)計易于組合和擴展支持多種 LLM 提供商OpenAI、Anthropic、ollama本地模型等豐富的預(yù)構(gòu)建組件核心概念深度解析1. LangChain 的工作原理用戶輸入ChatPromptTemplateRunnableWithMessageHistoryChat ModelOutput Parser結(jié)果關(guān)鍵流程LangChain v1輸入處理用戶輸入 →ChatPromptTemplate.invoke()→ 生成消息列表。歷史注入可選RunnableWithMessageHistory自動把之前對話拼進消息再傳給模型。模型調(diào)用ChatModel.invoke(messages)→ 返回AIMessage。輸出解析OutputParser.invoke(ai_message)→ 結(jié)構(gòu)化數(shù)據(jù) / 字符串。結(jié)果返回解析后的內(nèi)容即為最終答案同時歷史被持久化供下輪使用。記憶管理對話歷史存儲在 Memory 中供后續(xù)使用環(huán)境準備步驟 1安裝 PythonmacOS# 檢查是否已安裝 Python推薦 3.8python3 --version# 如果未安裝使用 Homebrew 安裝/bin/bash -c$(curl-fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)brewinstallpython3.12.11Windows# 下載 Python 安裝包# 訪問https://www.python.org/downloads/# 下載 Python 3.12.11 安裝包# 安裝時勾選 Add Python to PATH# 驗證安裝python--version步驟 2創(chuàng)建項目目錄macOS# 創(chuàng)建項目文件夾mkdirlangchain-democdlangchain-demo# 創(chuàng)建虛擬環(huán)境python3 -m venv venv# 激活虛擬環(huán)境sourcevenv/bin/activateWindows# 創(chuàng)建項目文件夾mkdir langchain-demo cd langchain-demo# 創(chuàng)建虛擬環(huán)境python-m venv venv# 激活虛擬環(huán)境.venvScriptsactivate步驟 3安裝 LangChain# 1. 核心骨架必裝pipinstall-Ulangchain1.0.0 langchain-core# 2. 模型/嵌入支持按需選pipinstalllangchain-openai# OpenAI / Azurepipinstalllangchain-ollama# Ollama 本地模型pipinstalllangchain-huggingface# HuggingFace 模型/嵌入# 3. 向量庫RAG 必裝其一pipinstallchromadb# 本地文件型# pip install faiss-cpu # 另一輕量選擇# 4. 輔助工具pipinstallpython-dotenv# 讀 .envpipinstalltiktoken# OpenAI token 計數(shù) 我主要是用本地的ollama暫時不用 有需要的酌情安裝pipinstallpydantic# 結(jié)構(gòu)化輸出/數(shù)據(jù)驗證pipinstalllanggraph# 需要復(fù)雜 Agent 流程時再裝步驟 4配置 API 密鑰創(chuàng)建.env文件來存儲 API 密鑰# 創(chuàng)建 .env 文件touch.env# macOS# 或typenul.env# Windows在.env文件中添加OPENAI_API_KEY你的_OpenAI_API_密鑰 # 或使用其他 LLM 提供商 # ANTHROPIC_API_KEY你的_Anthropic_API_密鑰注意這里你如果使用的是本地的ollama 那么則無需配置秘鑰人狠話不多叫聲浩哥**上呆么demo**完整項目結(jié)構(gòu)因為我這里有兩套環(huán)境 Mac 7b Windows就用30b所以會出現(xiàn)上下的demo 使用的模型出現(xiàn)些許的出入這點在這里也做一個說明防止看著些的朋友出現(xiàn)一些困惑。還有別問我venv哪里來的 如果這你都不會那么建議你去看我的Python入門指南系列l(wèi)angchain-demo/ ├── venv/# 虛擬環(huán)境├── .env# 環(huán)境變量配置├── requirements.txt# 依賴包列表├── demo1_basic.py# 案例1基礎(chǔ)調(diào)用├── demo2_prompt_template.py# 案例2提示詞模板├── demo3_chains.py# 案例3鏈式調(diào)用├── demo4_memory.py# 案例4對話記憶├── demo5_document_qa.py# 案例5文檔問答├── demo6_agent.py# 案例6Agent代理└── run_all_demos.py# 運行所有示例創(chuàng)建requirements.txt文件# LangChain v1 最小可用組合 langchain1.0.0 # 主包正式版 langchain-core1.0.0 # 核心協(xié)議可省略主包會拉最新 langchain-openai1.0.0 # OpenAI 系列 langchain-ollama1.0.0 # 本地 Ollama tiktoken0.7.0 # OpenAI token 計數(shù) python-dotenv1.0.0 # 環(huán)境變量 chromadb0.5.0 # 向量數(shù)據(jù)庫安裝所有依賴pipinstall-r requirements.txt實戰(zhàn)案例案例 1基礎(chǔ) LLM 調(diào)用創(chuàng)建文件demo1_basic.py 案例 1基礎(chǔ)的 LLM 調(diào)用 展示如何使用 LangChain 調(diào)用語言模型 # 如果使用的OpenApideng相關(guān)的內(nèi)容則使用以下的插件# from langchain_openai import ChatOllama# 如果使用的是ollama的話那么直接使用本插件fromlangchain_ollamaimportChatOllama# 新fromdotenvimportload_dotenv# 加載環(huán)境變量 如果使用的本地的ollama 這里可以直接省略load_dotenv()defbasic_llm_call():最簡單的 LLM 調(diào)用示例# 初始化模型# temperature: 控制輸出的隨機性0-10 表示確定性輸出llmChatOllama(modelQwen2.5:7b,temperature0.7)# 直接調(diào)用模型responsellm.invoke(請用一句話介紹什么是人工智能)print(*50)print(基礎(chǔ) LLM 調(diào)用結(jié)果)print(response.content)print(*50)if__name____main__:basic_llm_call()運行方式python demo1_basic.py輸出結(jié)果:Langchain深入淺出 % python demo_basic.py本地 Ollama(Qwen2.5:7b)調(diào)用結(jié)果 人工智能是指由機器或軟件所表現(xiàn)出的智能行為。案例 2使用提示詞模板創(chuàng)建文件demo2_prompt_template.pyfromlangchain_core.promptsimportPromptTemplate,ChatPromptTemplate# 導(dǎo)入提示詞模板類fromlangchain_ollamaimportChatOllama# 導(dǎo)入Ollama聊天模型類# 1.simple prompt template example# 簡單的提示詞模版示例# 功能展示如何使用提示詞模板生成營銷文案# 流程# 1. 創(chuàng)建提示詞模板# 2. 初始化語言模型# 3. 填充模板參數(shù)# 4. 調(diào)用模型生成響應(yīng)defsimple_prompt_template():
簡單的提示詞模版示例
功能展示如何使用提示詞模板生成營銷文案
流程
1. 創(chuàng)建提示詞模板
2. 初始化語言模型
3. 填充模板參數(shù)
4. 調(diào)用模型生成響應(yīng)
簡單的提示詞模版示例# 創(chuàng)建提示詞模版# {product}是占位符可以動態(tài)替換myTemplate 你是一名產(chǎn)品營銷文案專家請幫我為以下產(chǎn)品撰寫一段吸引人的營銷文案 產(chǎn)品名稱{product} 產(chǎn)品描述{description} 產(chǎn)品特點{features} 請用輕松活潑的語氣字數(shù)控制在 100 字以內(nèi)。 # 創(chuàng)建提示詞模版對象promptPromptTemplate(input_variables[product,description,features],# 定義模板中可替換的變量templatemyTemplate# 使用上面定義的模板字符串)# 初始化模型llmChatOllama(modelqwen2.5:7b,# 指定使用的模型名稱temperature0.7,# 設(shè)置溫度參數(shù)控制輸出的隨機性)# 填充提示詞模版formatted_promptprompt.format(product智能手環(huán),# 替換模板中的product變量description年輕的運動愛好者,# 替換模板中的description變量features心率監(jiān)測、睡眠追蹤、防水設(shè)計# 替換模板中的features變量)print(*50)# 打印分隔線print(生成的提示詞)# 打印提示信息print(formatted_prompt)# 打印格式化后的提示詞print(*50)# 調(diào)用模型使用模型處理格式化后的提示詞responellm.invoke(formatted_prompt)print(
模型響應(yīng):)# 打印提示信息print(respone.content)# 打印模型的響應(yīng)內(nèi)容print(*50)# 打印分隔線# 2.對話式提示詞模版# 對話式提示詞模版示例# 功能展示如何使用提示詞模板進行對話式交互# 流程# 1. 創(chuàng)建提示詞模板# 2. 初始化語言模型# 3. 填充模板參數(shù)格式化# 4. 調(diào)用模型生成響應(yīng)defchat_prompt_template():#創(chuàng)建對話模版#可以指定系統(tǒng)消息、人類消息等不同的角色chat_templateChatPromptTemplate.from_messages([(system,你是一名資深的{role}擁有10年以上的從業(yè)經(jīng)驗),(human,請幫我分析:{question})])# 初始化模型llmChatOllama(modelqwen2.5:7b,# 指定使用的模型名稱temperature0.7,# 設(shè)置溫度參數(shù)控制輸出的隨機性)# 填充提示詞模版messageschat_template.format_messages(rolePython工程師,# 替換模板中的role變量question如何優(yōu)化Python代碼的性能# 替換模板中的topic變量)# 調(diào)用模型使用模型處理格式化后的提示詞responsellm.invoke(messages)print(
對話模板響應(yīng))print(response.content)print(*50)# 判斷是否為主程序運行如果是則調(diào)用simple_prompt_template函數(shù)否則不執(zhí)行if__name____main__:simple_prompt_template()chat_prompt_template()輸出結(jié)果:生成的提示詞 你是一名產(chǎn)品營銷文案專家請幫我為以下產(chǎn)品撰寫一段吸引人的營銷文案 產(chǎn)品名稱智能手環(huán) 產(chǎn)品描述年輕的運動愛好者 產(chǎn)品特點心率監(jiān)測、睡眠追蹤、防水設(shè)計 請用輕松活潑的語氣字數(shù)控制在100字以內(nèi)。模型響應(yīng): 想成為朋友圈里的運動小明星嗎來試試我們的智能手環(huán)吧它專為年輕的運動愛好者打造不僅有時尚外觀還有心率監(jiān)測和睡眠追蹤功能哦。防水設(shè)計讓你無憂運動記錄每一次揮汗如雨的時刻。戴上它開啟你的活力人生對話模板響應(yīng) 優(yōu)化Python代碼的性能是一個多方面的工作通常需要考慮算法復(fù)雜度、數(shù)據(jù)結(jié)構(gòu)選擇以及特定庫和工具的應(yīng)用。下面是一些常見的優(yōu)化策略### 1. 分析瓶頸- **使用cProfile或line_profiler**首先定位程序中的熱點即執(zhí)行時間最長的部分。這有助于確定優(yōu)化的重點。 - **了解Python的性能特性**例如避免不必要的對象創(chuàng)建、減少函數(shù)調(diào)用次數(shù)等。### 2. 選擇合適的數(shù)據(jù)結(jié)構(gòu)和算法- 根據(jù)問題的具體情況選擇最適合的數(shù)據(jù)結(jié)構(gòu)。比如使用collections.deque代替列表進行頻繁的添加和刪除操作或使用heapq來實現(xiàn)優(yōu)先隊列。 - 仔細考慮是否真的需要使用字典或集合有時候列表可能足夠且更快。### 3. 使用內(nèi)置函數(shù)- Python庫中的很多函數(shù)都是用C語言編寫的執(zhí)行速度遠快于Python代碼。例如使用map()、filter()等高階函數(shù)代替循環(huán)。 - 利用itertools模塊提供的高效迭代器工具如chain(),accumulate()等。### 4. 避免全局變量- 全局變量在每次調(diào)用時都需要查找這會降低程序的執(zhí)行速度。盡量減少對全局變量的依賴。### 5. 使用多線程或異步編程- 如果你的任務(wù)是I/O密集型如網(wǎng)絡(luò)請求、文件讀寫等可以考慮使用asyncio實現(xiàn)異步IO操作來提高效率。 - 對于CPU密集型的任務(wù)可以利用multiprocessing模塊創(chuàng)建進程來并行執(zhí)行。### 6. 編譯Python代碼- 使用PyPy解釋器可能會帶來顯著的速度提升。雖然標準的CPython通常已足夠快但在某些情況下使用PyPy可以實現(xiàn)更快的運行時。 - 利用Numba這樣的工具將部分或全部Python函數(shù)編譯成機器碼。### 7. 減少內(nèi)存消耗- 使用numpy、pandas等庫處理大規(guī)模數(shù)據(jù)集往往比純Python實現(xiàn)更高效因為它們底層使用了C語言編寫并且進行了優(yōu)化。### 8. 內(nèi)存管理與垃圾回收- 確保正確地使用資源和管理對象生命周期。避免不必要的內(nèi)存泄漏。 通過上述方法的綜合應(yīng)用通??梢燥@著提高Python代碼的執(zhí)行速度和效率。不過需要注意的是性能優(yōu)化應(yīng)當在確保程序功能的前提下進行并且要衡量所付出的努力是否值得得到的性能提升。小結(jié)維度PromptTemplateChatPromptTemplate結(jié)構(gòu)單一段落字符串無角色帶角色的消息列表系統(tǒng) / 人類 / AI交互方式傳遞純文本傳遞消息列表適用場景單輪任務(wù)、簡單指令多輪對話、需要角色設(shè)定的任務(wù)模型理解方式作為整體指令處理按角色優(yōu)先級和上下文處理簡單來說PromptTemplate是 “給模型一段話”ChatPromptTemplate是 “給模型一段帶角色的對話歷史”后者更適合模擬真實交互場景。案例 3鏈式調(diào)用Chain創(chuàng)建文件demo3_chains.py 案例 3鏈式調(diào)用LangChain v1版本 新寫法 展示如何用 RunnableSequence 替代 LLMChain / SequentialChain #本地使用ollama 這里暫時注釋#from dotenv import load_dotenv#load_dotenv()fromlangchain_ollamaimportChatOllamafromlangchain_core.promptsimportPromptTemplate# from langchain.chains import LLMChain, SequentialChain #被版本刪除使用下面的替代fromlangchain_core.runnablesimportRunnableSequence,RunnablePassthrough# 新引入的類用于替代 LLMChain / SequentialChain實現(xiàn)鏈式調(diào)用defsimple_chain():簡單鏈式調(diào)用示例# 初始化模型llmChatOllama(modelqwen2.5:7b,temperature0.7,)# 創(chuàng)建提示詞模板promptPromptTemplate(input_variables[topic],template請為以下主題寫一個標題{topic})# 突出語法變化用最精簡的邏輯輸入→格式化→生成展示新版 API 的核心語法減少其他干擾。# 創(chuàng)建鏈式調(diào)用chainprompt|llm# 運行鏈式調(diào)用resultchain.invoke({topic:人工智能})print(*50)print(鏈式調(diào)用結(jié)果)# content探索未來人工智能的技術(shù)進步與應(yīng)用前景 additional_kwargs{} response_metadata{model: qwen2.5:7b, created_at: 2025-11-20T08:12:53.783476Z, done: True, done_reason: stop, total_duration: 5279829084, load_duration: 836230125, prompt_eval_count: 37, prompt_eval_duration: 4001584375, eval_count: 12, eval_duration: 439842917, logprobs: None, model_name: qwen2.5:7b, model_provider: ollama} idlc_run--3fa4a36d-9887-4a5d-af20-1daa48daf5ff-0 usage_metadata{input_tokens: 37, output_tokens: 12, total_tokens: 49}print(result.content)print(*50)defsequential_chain():順序鏈示例新版 Runnable API實現(xiàn)與 SequentialChain 等價# 初始化模型llmChatOllama(modelqwen2.5:7b,temperature0.7,)# Step 1: 生成標題title_promptPromptTemplate(input_variables[topic],template請為以下主題寫一個標題{topic})title_chaintitle_prompt|llm# Step 2: 生成大綱outline_promptPromptTemplate(input_variables[title],template請根據(jù)以下標題寫一段簡介{title})outline_chainoutline_prompt|llm# Step 3: 生成開頭intro_promptPromptTemplate(input_variables[title,outline],template 文章標題{title} 文章大綱{outline} 請根據(jù)以上信息寫一段引人入勝的開頭100字左右 )intro_chainintro_prompt|llm# 創(chuàng)建順序鏈式調(diào)用# 創(chuàng)建順序鏈式調(diào)用# 注意RunnableSequence 不接受 steps 參數(shù)應(yīng)使用 | 運算符連接# RunnablePassthrough 無修改透傳輸入 輸出 輸入數(shù)據(jù)完全不變# RunnablePassthrough.assign() 透傳輸入 新增 / 更新字段 輸出 原有輸入 新字段增量擴展overall_chain(RunnablePassthrough()#這一步純多余就是單純的用一下 當做了解吧 Ai是永遠猜不透人類的腦回路的 只有人類才能寫出這樣的代碼既沒用也無害哈哈哈哈|RunnablePassthrough.assign(titletitle_chain)|RunnablePassthrough.assign(outline(lambdax:{title:x[title].content})|outline_chain)# 透傳輸入 新增 / 更新字段,|RunnablePassthrough.assign(introduction(lambdax:{title:x[title].content,outline:x[outline].content})|intro_chain)# 透傳輸入 新增 / 更新字段)# 運行順序鏈式調(diào)用resultoverall_chain.invoke({topic:量子計算的實際用例})print(
*50)print(順序鏈執(zhí)行結(jié)果)print(
標題
,result[title].content)print(
大綱
,result[outline].content)print(
開頭段落
,result[introduction].content)print(*50)if__name____main__:simple_chain()sequential_chain()補充LangChain 中構(gòu)建順序鏈主要有三種方式核心邏輯等價但寫法不同|運算符最簡潔直接串聯(lián)組件如r1 | r2 | r3LangChain 推薦用法RunnableSequence(組件1, 組件2)顯式通過位置參數(shù)構(gòu)建與|運算符功能一致RunnableSequence.from_list([組件])通過列表定義步驟適合步驟較多時集中管理。三者本質(zhì)都是實現(xiàn)組件的順序執(zhí)行僅語法形式不同可根據(jù)代碼可讀性和場景需求選擇。版本 2直接傳入位置參數(shù)fromlangchain_core.runnablesimportRunnableSequence,RunnablePassthrough# 定義各步驟組件step1RunnablePassthrough.assign(titletitle_chain)# 新增title字段step2RunnablePassthrough.assign(outline(lambdax:{title:x[title].content})|outline_chain)# 新增outline字段step3RunnablePassthrough.assign(introduction(lambdax:{title:x[title].content,outline:x[outline].content})|intro_chain)# 新增introduction字段# 用RunnableSequence串聯(lián)步驟直接傳位置參數(shù)overall_chainRunnableSequence(step1,step2,step3)版本 3用from_list()方法更直觀fromlangchain_core.runnablesimportRunnableSequence,RunnablePassthrough# 定義步驟列表steps[RunnablePassthrough.assign(titletitle_chain),RunnablePassthrough.assign(outline(lambdax:{title:x[title].content})|outline_chain),RunnablePassthrough.assign(introduction(lambdax:{title:x[title].content,outline:x[outline].content})|intro_chain)]# 用from_list()創(chuàng)建RunnableSequenceoverall_chainRunnableSequence.from_list(steps)輸出結(jié)果鏈式調(diào)用結(jié)果探索未來人工智能的技術(shù)進步與應(yīng)用前景順序鏈執(zhí)行結(jié)果 標題 量子計算的現(xiàn)實應(yīng)用案例探究 大綱 量子計算作為一種前沿技術(shù)利用量子力學(xué)原理進行信息處理和計算具有超越傳統(tǒng)計算機的強大潛力。本研究旨在探討量子計算在現(xiàn)實世界中的具體應(yīng)用案例分析其如何解決實際問題并帶來創(chuàng)新解決方案。 通過深入剖析不同行業(yè)領(lǐng)域的應(yīng)用場景如藥物發(fā)現(xiàn)、金融建模、優(yōu)化算法等我們可以更清晰地看到量子計算技術(shù)的潛力和挑戰(zhàn)。例如在醫(yī)藥研發(fā)中利用量子計算機模擬分子結(jié)構(gòu)和反應(yīng)過程可以加速新藥開發(fā)流程在金融服務(wù)領(lǐng)域量子計算能夠處理復(fù)雜的風(fēng)險分析與投資組合優(yōu)化問題。 此外本研究還將介紹當前實現(xiàn)這些應(yīng)用的技術(shù)進展、面臨的障礙及未來發(fā)展方向。通過對案例的詳細解析不僅有助于深化對量子計算技術(shù)的理解也為相關(guān)領(lǐng)域的研究人員和從業(yè)者提供有價值的參考信息。 開頭段落 在當今科技日新月異的時代量子計算作為一種顛覆性的前沿技術(shù)正逐漸揭開其神秘面紗。不同于傳統(tǒng)計算機基于二進制原理的工作方式量子計算機利用量子力學(xué)中的疊加態(tài)和糾纏態(tài)特性實現(xiàn)了前所未有的信息處理速度與能力。從加速藥物研發(fā)到優(yōu)化金融投資組合量子計算正在為解決復(fù)雜現(xiàn)實問題提供創(chuàng)新解決方案。本文將深入探討這些應(yīng)用案例揭示其背后的技術(shù)奧秘與挑戰(zhàn)引領(lǐng)我們進入一個充滿無限可能的新時代。流程理解 剛開始看稍微稍微有點抽象 不過理一就清晰多了輸入{topic: 量子計算的實際用例}RunnablePassthrough.assign(titletitle_chain)title_chain執(zhí)行title_prompt llm輸出title結(jié)果帶.content屬性上下文更新{topic: ..., title: 結(jié)果對象}RunnablePassthrough.assign(outlinelambdaoutline_chain)lambda提取{title: x[title].content}outline_chain執(zhí)行outline_prompt llm輸出outline結(jié)果帶.content屬性上下文更新{topic: ..., title: ..., outline: 結(jié)果對象}RunnablePassthrough.assign(introductionlambdaintro_chain)lambda提取{title: x[title].content, outline: x[outline].content}intro_chain執(zhí)行intro_prompt llm輸出introduction結(jié)果帶.content屬性最終上下文{topic: ..., title: ..., outline: ..., introduction: ...}打印結(jié)果title.content / outline.content / introduction.content案例 4對話記憶Memory在寫這個demo的時候版本更新了langchain 正式的邁入了1.x的時代隨之后來的變化也是巨大的就好像我們下面的這個示例舊版 Agent 依賴固定的硬編碼循環(huán)AgentExecutor難以處理復(fù)雜的分支和多步任務(wù)。LangChain v1 的目標是構(gòu)建生產(chǎn)級、可定制的自主智能體這要求流程具備狀態(tài)管理和非線性決策能力。因此LangGraph 作為底層的狀態(tài)機運行時取代了舊的執(zhí)行器賦予 Agent 流程自定義的柔性。偽代碼公式v 1 _ A g e n t ≡ G r a p h ( State → Tool Output Node Logic Next Step ) v1_Agent ≡ 圖 ( 當前狀態(tài) → 工具輸出 決策函數(shù) 下一節(jié)點 ) v1\_Agent equiv Graph( ext{State} xrightarrow[ ext{Tool Output}]{ ext{Node Logic}} ext{Next Step}) ext{v1\_Agent} equiv ext{圖}( ext{當前狀態(tài)} xrightarrow[ ext{工具輸出}]{ ext{決策函數(shù)}} ext{下一節(jié)點})v1_Agent≡Graph(StateNode LogicTool Output?Next Step)v1_Agent≡圖(當前狀態(tài)決策函數(shù)工具輸出?下一節(jié)點)v1_Agent ≡ 圖 ( 當前狀態(tài) → 工具輸出 決策函數(shù) 下一節(jié)點 ) ext{v1\_Agent} equiv ext{圖}( ext{當前狀態(tài)} xrightarrow[ ext{工具輸出}]{ ext{決策函數(shù)}} ext{下一節(jié)點})v1_Agent≡圖(當前狀態(tài)決策函數(shù)工具輸出?下一節(jié)點)創(chuàng)建文件demo4_memory.py下面的demo將會分為兩個函數(shù)一個是以前的方法旨在用來比較以前和現(xiàn)在的區(qū)別。 案例 4對話記憶 展示如何讓 AI 記住之前的對話內(nèi)容 這里不再說明為何沒有引入 openai 庫請參考 README.md 中的說明 以及dotenv 文件配置說明 fromlangchain_ollamaimportChatOllamafromlangchain_classic.chainsimportConversationChainfromlangchain_classic.memoryimportConversationBufferMemory# 對話記憶fromlangchain_core.messagesimportHumanMessagefromlanggraph.checkpoint.memoryimportMemorySaverfromlangchain.agentsimportcreate_agent# from dotenv import load_dotenv# load_dotenv()defconversation_with_memory():帶有對話記憶的聊天示例# 初始化模型llmChatOllama(modelqwen3-coder:30b,temperature0.7,)# 創(chuàng)建記憶組件# CoversationBufferMemory 會保存對話的歷史記錄并在每次調(diào)用模型時將其作為上下文傳遞memoryConversationBufferMemory()# 創(chuàng)建對話鏈conversationConversationChain(llmllm,memorymemory,verboseTrue# 是否打印詳細日志)print(*50)print(開始多輪對話帶記憶)print(*50)# 第一次對話response1conversation.invoke(input你好我是Alben是一名資深程序員)print(f
用戶你好我是Alben是一名資深程序員)print(fAI{response1}
)# 第二次對話response2conversation.invoke(input我最近在研究AI想了解一下AI的發(fā)展趨勢)print(f
用戶我最近在研究AI想了解一下AI的發(fā)展趨勢)print(fAI{response2}
)#第三次對話檢查記憶是否生效response3conversation.invoke(input你還記得我的名字嗎我最近在研究什么)print(f用戶你還記得我的名字嗎我最近在研究什么)print(fAI{response3}
)print(*50)print(memory.buffer)# 打印對話歷史print(*50)# 寫法太舊了 不能用了defconversation_with_summary_memory():使用摘要記憶的對話# 初始化模型llmChatOllama(modelqwen3-coder:30b,temperature0.7,)#自動總結(jié)對話歷史ConversationSummaryMemory# memory.buffer 可以獲取對話歷史但會自動進行總結(jié)#適合長對話可以節(jié)省tokenmemoryConversationSummaryMemory()# 創(chuàng)建對話鏈conversationConversationChain(llmllm,verboseTrue# 是否打印詳細日志)print(*50)print(開始多輪對話不帶記憶)print(*50)# 模擬多輪對話conversation.predict(input我今天去了公園看到了很多花。)conversation.predict(input公園里還有一個湖湖面上有很多鴨子。)conversation.predict(input我在公園待了兩個小時感覺很放松。)# 查看摘要print(
對話摘要)print(memory.buffer)print(*50)defconversation_v1_modern():LangChain v1 標準寫法 (使用 LangGraph)# 1. 初始化模型llmChatOllama(modelqwen3-coder:30b,temperature0.7)# 2. 初始化記憶保存器 (Checkpointer)# v1 不再區(qū)分 Buffer 還是 Summary它直接把狀態(tài)存到這里memoryMemorySaver()# 3. 創(chuàng)建 Agent (或者簡單的圖)# create_agent 自帶了消息管理循環(huán)agentcreate_agent(modelllm,tools[],checkpointermemory)# 4. 設(shè)定線程 ID (類似于用戶 ID用于區(qū)分不同對話的記憶)config{configurable:{thread_id:user_001}}print(*50)print(開始 LangGraph 對話 (自動持久化))print(*50)# 5. 第一輪input_msg我今天去了公園看到了很多花。print(fUser:{input_msg})# invoke 會自動讀取 thread_id 對應(yīng)的歷史拼接到 prompt 中foreventinagent.stream({messages:[HumanMessage(contentinput_msg)]},configconfig):ifagentinevent:print(fAI:{event[agent][messages][-1].content})# 6. 第二輪 (它會自動記得上一輪)input_msg我剛才說我在哪里print(f
User:{input_msg})foreventinagent.stream({messages:[HumanMessage(contentinput_msg)]},configconfig):ifagentinevent:print(fAI:{event[agent][messages][-1].content})# 7. 查看當前保存的狀態(tài) (相當于舊版的 memory.buffer)snapshotagent.get_state(config)print(
[當前記憶狀態(tài)])# 這里保存了完整的對話歷史列表print(len(snapshot.values[messages]),條消息記錄)if__name____main__:conversation_with_memory()# conversation_with_summary_memory()conversation_v1_modern()輸出結(jié)果開始多輪對話帶記憶Entering new ConversationChain chain... Prompt after formatting: The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know. Current conversation: Human: 你好我是Alben是一名資深程序員 AI:Finished chain. 用戶你好我是Alben是一名資深程序員 AI{input:你好我是Alben是一名資深程序員,history:,response:你好Alben很高興認識你這位資深程序員作為一名資深程序員你一定有很多豐富的編程經(jīng) 驗和技巧吧。我很好奇你主要專注于哪些編程語言和技術(shù)領(lǐng)域呢是偏向后端開發(fā)、前端開發(fā)還是其他特定的技術(shù)方向我作為AI助手雖然在很多編程相關(guān)的話題上都有所了解但 很期待聽聽你作為資深程序員的實際經(jīng)驗和見解。}Entering new ConversationChain chain... Prompt after formatting: The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know. Current conversation: Human: 你好我是Alben是一名資深程序員 AI: 你好Alben很高興認識你這位資深程序員作為一名資深程序員你一定有很多豐富的編程經(jīng)驗和技巧吧。我很好奇你主要專注于哪些編程語言和技術(shù)領(lǐng)域呢是偏向后端開發(fā)、前 端開發(fā)還是其他特定的技術(shù)方向我作為AI助手雖然在很多編程相關(guān)的話題上都有所了解但很期待聽聽你作為資深程序員的實際經(jīng)驗和見解。 Human: 我最近在研究AI想了解一下AI的發(fā)展趨勢 AI:Finished chain. 用戶我最近在研究AI想了解一下AI的發(fā)展趨勢 AI{input:我最近在研究AI想了解一下AI的發(fā)展趨勢,history:Human: 你好我是Alben是一名資深程序員
AI: 你好Alben很高興認識你這位資深程序員作為一名資 深程序員你一定有很多豐富的編程經(jīng)驗和技巧吧。我很好奇你主要專注于哪些編程語言和技術(shù)領(lǐng)域呢是偏向后端開發(fā)、前端開發(fā)還是其他特定的技術(shù)方向我作為AI助手雖然在 很多編程相關(guān)的話題上都有所了解但很期待聽聽你作為資深程序員的實際經(jīng)驗和見解。,response:很高興你對AI發(fā)展趨勢感興趣Alben作為資深程序員你對AI的關(guān)注非常及 時因為AI正在深刻改變整個編程和開發(fā)領(lǐng)域。
從我了解到的信息來看AI發(fā)展趨勢主要集中在幾個方面
**技術(shù)層面**
- 大語言模型持續(xù)進化推理能力和多模態(tài)處理能 力不斷提升
- AutoML和AIGCAI生成內(nèi)容技術(shù)快速發(fā)展
- 邊緣AI計算和模型壓縮技術(shù)日趨成熟
**應(yīng)用層面**
- AI在代碼生成、自動化測試、智能調(diào)試等方面應(yīng)用越來越廣 泛
- 企業(yè)級AI應(yīng)用從試點走向規(guī)模化部署
- AI與各行業(yè)深度融合比如醫(yī)療、金融、制造等
**對開發(fā)者的影響**
- 編程工具和IDE正在集成更多AI輔助功能
- 低代碼/無代 碼平臺借助AI技術(shù)快速普及
- 開發(fā)者需要掌握AI相關(guān)的技能如模型微調(diào)、Prompt工程等
作為程序員你認為AI技術(shù)的哪個方面最值得重點關(guān)注或者你已經(jīng)在哪些具體場景中嘗 試過AI應(yīng)用了}Entering new ConversationChain chain... Prompt after formatting: The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know. Current conversation: Human: 你好我是Alben是一名資深程序員 AI: 你好Alben很高興認識你這位資深程序員作為一名資深程序員你一定有很多豐富的編程經(jīng)驗和技巧吧。我很好奇你主要專注于哪些編程語言和技術(shù)領(lǐng)域呢是偏向后端開發(fā)、前 端開發(fā)還是其他特定的技術(shù)方向我作為AI助手雖然在很多編程相關(guān)的話題上都有所了解但很期待聽聽你作為資深程序員的實際經(jīng)驗和見解。 Human: 我最近在研究AI想了解一下AI的發(fā)展趨勢 AI: 很高興你對AI發(fā)展趨勢感興趣Alben作為資深程序員你對AI的關(guān)注非常及時因為AI正在深刻改變整個編程和開發(fā)領(lǐng)域。 從我了解到的信息來看AI發(fā)展趨勢主要集中在幾個方面 **技術(shù)層面** - 大語言模型持續(xù)進化推理能力和多模態(tài)處理能力不斷提升 - AutoML和AIGCAI生成內(nèi)容技術(shù)快速發(fā)展 - 邊緣AI計算和模型壓縮技術(shù)日趨成熟 **應(yīng)用層面** - AI在代碼生成、自動化測試、智能調(diào)試等方面應(yīng)用越來越廣泛 - 企業(yè)級AI應(yīng)用從試點走向規(guī)模化部署 - AI與各行業(yè)深度融合比如醫(yī)療、金融、制造等 **對開發(fā)者的影響** - 編程工具和IDE正在集成更多AI輔助功能 - 低代碼/無代碼平臺借助AI技術(shù)快速普及 - 開發(fā)者需要掌握AI相關(guān)的技能如模型微調(diào)、Prompt工程等 作為程序員你認為AI技術(shù)的哪個方面最值得重點關(guān)注或者你已經(jīng)在哪些具體場景中嘗試過AI應(yīng)用了 Human: 你還記得我的名字嗎我最近在研究什么 AI:Finished chain. 用戶你還記得我的名字嗎我最近在研究什么 AI{input:你還記得我的名字嗎我最近在研究什么,history:Human: 你好我是Alben是一名資深程序員
AI: 你好Alben很高興認識你這位資深程序員作為一名資深 程序員你一定有很多豐富的編程經(jīng)驗和技巧吧。我很好奇你主要專注于哪些編程語言和技術(shù)領(lǐng)域呢是偏向后端開發(fā)、前端開發(fā)還是其他特定的技術(shù)方向我作為AI助手雖然在很 多編程相關(guān)的話題上都有所了解但很期待聽聽你作為資深程序員的實際經(jīng)驗和見解。
Human: 我最近在研究AI想了解一下AI的發(fā)展趨勢
AI: 很高興你對AI發(fā)展趨勢感興趣Alben 作為資深程序員你對AI的關(guān)注非常及時因為AI正在深刻改變整個編程和開發(fā)領(lǐng)域。
從我了解到的信息來看AI發(fā)展趨勢主要集中在幾個方面
**技術(shù)層面**
- 大語言 模型持續(xù)進化推理能力和多模態(tài)處理能力不斷提升
- AutoML和AIGCAI生成內(nèi)容技術(shù)快速發(fā)展
- 邊緣AI計算和模型壓縮技術(shù)日趨成熟
**應(yīng)用層面**
- AI在代碼生成、自 動化測試、智能調(diào)試等方面應(yīng)用越來越廣泛
- 企業(yè)級AI應(yīng)用從試點走向規(guī)模化部署
- AI與各行業(yè)深度融合比如醫(yī)療、金融、制造等
**對開發(fā)者的影響**
- 編程工具和IDE正 在集成更多AI輔助功能
- 低代碼/無代碼平臺借助AI技術(shù)快速普及
- 開發(fā)者需要掌握AI相關(guān)的技能如模型微調(diào)、Prompt工程等
作為程序員你認為AI技術(shù)的哪個方面最值得重點 關(guān)注或者你已經(jīng)在哪些具體場景中嘗試過AI應(yīng)用了,response:是的我當然記得你的名字你叫Alben而且我清楚地記得你最近在研究AI。你剛才還跟我分享了你對AI發(fā)展趨 勢的興趣還提到作為資深程序員你對AI技術(shù)的各個層面都很關(guān)注包括大語言模型、AutoML、AIGC、邊緣AI計算等技術(shù)發(fā)展以及AI在代碼生成、自動化測試、智能調(diào)試等方面的應(yīng) 用。
你之前還提到你對AI對開發(fā)者影響的方面特別感興趣比如編程工具集成AI輔助功能、低代碼/無代碼平臺的發(fā)展以及開發(fā)者需要掌握的AI相關(guān)技能等。
你當時還問我 作為程序員你覺得AI技術(shù)的哪個方面最值得重點關(guān)注我印象很深呢}Human: 你好我是Alben是一名資深程序員 AI: 你好Alben很高興認識你這位資深程序員作為一名資深程序員你一定有很多豐富的編程經(jīng)驗和技巧吧。我很好奇你主要專注于哪些編程語言和技術(shù)領(lǐng)域呢是偏向后端開發(fā)、前 端開發(fā)還是其他特定的技術(shù)方向我作為AI助手雖然在很多編程相關(guān)的話題上都有所了解但很期待聽聽你作為資深程序員的實際經(jīng)驗和見解。 Human: 我最近在研究AI想了解一下AI的發(fā)展趨勢 AI: 很高興你對AI發(fā)展趨勢感興趣Alben作為資深程序員你對AI的關(guān)注非常及時因為AI正在深刻改變整個編程和開發(fā)領(lǐng)域。 從我了解到的信息來看AI發(fā)展趨勢主要集中在幾個方面 **技術(shù)層面** - 大語言模型持續(xù)進化推理能力和多模態(tài)處理能力不斷提升 - AutoML和AIGCAI生成內(nèi)容技術(shù)快速發(fā)展 - 邊緣AI計算和模型壓縮技術(shù)日趨成熟 **應(yīng)用層面** - AI在代碼生成、自動化測試、智能調(diào)試等方面應(yīng)用越來越廣泛 - 企業(yè)級AI應(yīng)用從試點走向規(guī)?;渴?- AI與各行業(yè)深度融合比如醫(yī)療、金融、制造等 **對開發(fā)者的影響** - 編程工具和IDE正在集成更多AI輔助功能 - 低代碼/無代碼平臺借助AI技術(shù)快速普及 - 開發(fā)者需要掌握AI相關(guān)的技能如模型微調(diào)、Prompt工程等 作為程序員你認為AI技術(shù)的哪個方面最值得重點關(guān)注或者你已經(jīng)在哪些具體場景中嘗試過AI應(yīng)用了 Human: 你還記得我的名字嗎我最近在研究什么 AI: 是的我當然記得你的名字你叫Alben而且我清楚地記得你最近在研究AI。你剛才還跟我分享了你對AI發(fā)展趨勢的興趣還提到作為資深程序員你對AI技術(shù)的各個層面都很關(guān)注 包括大語言模型、AutoML、AIGC、邊緣AI計算等技術(shù)發(fā)展以及AI在代碼生成、自動化測試、智能調(diào)試等方面的應(yīng)用。 你之前還提到你對AI對開發(fā)者影響的方面特別感興趣比如編程工具集成AI輔助功能、低代碼/無代碼平臺的發(fā)展以及開發(fā)者需要掌握的AI相關(guān)技能等。 你當時還問我作為程序員你覺得AI技術(shù)的哪個方面最值得重點關(guān)注我印象很深呢開始 LangGraph 對話(自動持久化)User: 我今天去了公園看到了很多花。 User: 我剛才說我在哪里[當前記憶狀態(tài)]4條消息記錄進階示例案例 5文檔問答系統(tǒng)該 Demo 是一個LangChain v1 LCEL的標準 RAG 實現(xiàn)使用Ollama進行本地部署。有些小前提必要的安裝包為了運行這個本地 RAG 系統(tǒng)您需要安裝以下 Python 包并確保本地 Ollama 服務(wù)已啟動且模型已拉取# 核心 LCEL 依賴通常隨其他包安裝但我們明確列出所需功能包pipinstall-U langchain-ollama langchain-community langchain-text-splitters pipinstall-U chroma-dbOllama 模型準備 (命令行操作)確保您的 Ollama 服務(wù)正在運行并拉取了以下模型嵌入模型 (Embedding Model):用于向量化文檔。Bashollama pull nomic-embed-text聊天模型 (Chat Model):用于問答生成。Bashollama pull qwen2.5:7b 有條件的 ollma pull qwen3-coder:30b因為我這里有兩套環(huán)境 Mac 7b Windows就用30b所以會出現(xiàn)上下的demo 使用的模型出現(xiàn)些許的出入這點在這里也做一個說明防止看著些的朋友出現(xiàn)一些困惑。創(chuàng)建文件demo5_document_qa.py 案例 5文檔問答系統(tǒng) (Ollama 純本地 RAG 版本) Embedding 和 Chat 模型均使用 Ollama。 請確保已在 Ollama 中拉取了嵌入模型 (如 nomic-embed-text)。 運行命令示例ollama pull nomic-embed-text importos# from dotenv import load_dotenv # ? 不再需要因為沒有外部 API Key# import os # 保留用于文件操作# V1 核心組件導(dǎo)入 (來自 langchain_core)fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.runnablesimportRunnablePassthroughfromlangchain_core.output_parsersimportStrOutputParser# V1 專用包導(dǎo)入 (修正了 text_splitter 的路徑)fromlangchain_text_splittersimportRecursiveCharacterTextSplitter# V1 社區(qū)/技術(shù)組件導(dǎo)入fromlangchain_ollamaimportChatOllama,OllamaEmbeddings# ? 新增 OllamaEmbeddings# from langchain_openai import OpenAIEmbeddings # ? 不再需要fromlangchain_community.vectorstoresimportChromafromlangchain_community.document_loadersimportTextLoader# load_dotenv() # ? 不再需要加載 .env 文件# --- 輔助函數(shù)格式化文檔 (取代 chain_typestuff) ---defformat_docs(docs):將檢索到的文檔列表格式化為一個單獨的字符串用于注入 Prompt。return
.join(doc.page_contentfordocindocs)# --- 輔助函數(shù)創(chuàng)建示例文檔 ---defcreate_sample_document():# ... (函數(shù)體與內(nèi)容保持不變)content Python 是一種高級編程語言由 Guido van Rossum 于 1991 年首次發(fā)布。 Python 的設(shè)計哲學(xué)強調(diào)代碼的可讀性和簡潔的語法使用縮進來表示代碼塊。 Python 具有以下特點 1. 簡單易學(xué)Python 的語法簡潔明了適合初學(xué)者。 2. 功能強大擁有豐富的標準庫和第三方庫。 3. 跨平臺可以在 Windows、macOS、Linux 等操作系統(tǒng)上運行。 4. 解釋型語言無需編譯可以直接運行。 5. 面向?qū)ο笾С置嫦驅(qū)ο缶幊谭妒健?Python 的應(yīng)用領(lǐng)域非常廣泛 - Web 開發(fā)使用 Django、Flask 等框架 - 數(shù)據(jù)科學(xué)使用 NumPy、Pandas、Matplotlib 等庫 - 人工智能使用 TensorFlow、PyTorch 等框架 - 自動化運維使用 Ansible、Fabric 等工具 - 爬蟲開發(fā)使用 Scrapy、BeautifulSoup 等庫 Python 的版本歷史 - Python 2.x2000 年發(fā)布2020 年停止維護 - Python 3.x2008 年發(fā)布是當前主流版本 doc_pathpython_intro.txtwithopen(doc_path,w,encodingutf-8)asf:f.write(content)returndoc_path# --- 核心 RAG 邏輯函數(shù) (v1 LCEL) ---defdocument_qa_system_v1():print(*50)print(創(chuàng)建文檔問答系統(tǒng) (Ollama 純本地版)...)print(*50)# 步驟 1-2創(chuàng)建、加載、分割文檔doc_pathcreate_sample_document()loaderTextLoader(doc_path,encodingutf-8)documentsloader.load()text_splitterRecursiveCharacterTextSplitter(chunk_size200,chunk_overlap50)textstext_splitter.split_documents(documents)print(f? 已分割文檔共{len(texts)}個片段)# 步驟 3創(chuàng)建向量存儲和檢索器# 關(guān)鍵修改使用 OllamaEmbeddings# 請確保 nomic-embed-text (或你選擇的任何 Ollama 嵌入模型) 已拉取embeddingsOllamaEmbeddings(modelnomic-embed-text)vectorstoreChroma.from_documents(documentstexts,embeddingembeddings)retrievervectorstore.as_retriever(search_kwargs{k:3})print(? 已創(chuàng)建向量存儲和檢索器 (使用 Ollama Embedding))# 步驟 4定義 LLM 和 PromptllmChatOllama(modelqwen3-coder:30b,temperature0)# Ollama Chat Model 保持不變promptChatPromptTemplate.from_template( 你是一個專業(yè)的問答助手請基于提供的上下文 (Context) 來回答問題 (Question)。 如果上下文中沒有足夠的信息請說明你無法找到相關(guān)信息。 --- Context: {context} --- Question: {question} )# 步驟 5-7構(gòu)建 LCEL Chain 和執(zhí)行邏輯 (保持不變)rag_chain_core(RunnablePassthrough.assign(contextlambdax:x[context])|prompt|llm|StrOutputParser())defget_source_and_answer(query:str):source_documentsretriever.invoke(query)chain_input{question:query,context:format_docs(source_documents)}resultrag_chain_core.invoke(chain_input)return{query:query,result:result,source_documents:source_documents,}print(? 已創(chuàng)建 LCEL RAG 包裝函數(shù))# 進行問答print(
*50)print(開始問答)print(*50)questions[Python 是誰發(fā)明的,Python 有哪些特點,Python 可以用于哪些領(lǐng)域,Python 2 什么時候停止維護的]forquestioninquestions:print(f
問題{question})resultget_source_and_answer(question)print(f答案{result[result]})print(
引用的文檔片段)fori,docinenumerate(result[source_documents],1):print(f 片段{i}{doc.page_content[:100]}...)print(-*50)# 清理臨時文件os.remove(doc_path)print(
? 已清理臨時文件)if__name____main__:document_qa_system_v1()輸出結(jié)果創(chuàng)建文檔問答系統(tǒng)(Ollama 純本地版)...? 已分割文檔共4個片段 ? 已創(chuàng)建向量存儲和檢索器(使用 Ollama Embedding)? 已創(chuàng)建 LCEL RAG 包裝函數(shù)開始問答問題Python 是誰發(fā)明的 答案根據(jù)提供的上下文信息Python 是由 Guido van Rossum 發(fā)明的。他在1991年首次發(fā)布了這門編程語言。 引用的文檔片段 片段1Python 是一種高級編程語言由 Guido van Rossum 于1991年首次發(fā)布。 Python 的設(shè)計哲學(xué)強調(diào)代碼的可讀性和簡潔的語法使用縮進來表示代碼塊。... 片段2- 爬蟲開發(fā)使用 Scrapy、BeautifulSoup 等庫 Python 的版本歷史 - Python2.x2000 年發(fā)布2020 年停止維護 -... 片段32. 功能強大擁有豐富的標準庫和第三方庫。3. 跨平臺可以在 Windows、macOS、Linux 等操作系統(tǒng)上運行。4. 解釋型語言無需編譯可以直接運行。5....-------------------------------------------------- 問題Python 有哪些特點 答案根據(jù)提供的上下文Python 具有以下特點1. **簡單易學(xué)**Python 的語法簡潔明了適合初學(xué)者。2. **功能強大**擁有豐富的標準庫和第三方庫。3. **跨平臺**可以在 Windows、macOS、Linux 等操作系統(tǒng)上運行。4. **解釋型語言**無需編譯可以直接運行。5. **面向?qū)ο?*支持面向?qū)ο缶幊谭妒健?. **代碼可讀性強**強調(diào)代碼的可讀性和簡潔的語法使用縮進來表示代碼塊。 這些特點使得 Python 成為一門既易于學(xué)習(xí)又功能強大的編程語言。 引用的文檔片段 片段1Python 是一種高級編程語言由 Guido van Rossum 于1991年首次發(fā)布。 Python 的設(shè)計哲學(xué)強調(diào)代碼的可讀性和簡潔的語法使用縮進來表示代碼塊。... 片段2- 爬蟲開發(fā)使用 Scrapy、BeautifulSoup 等庫 Python 的版本歷史 - Python2.x2000 年發(fā)布2020 年停止維護 -... 片段32. 功能強大擁有豐富的標準庫和第三方庫。3. 跨平臺可以在 Windows、macOS、Linux 等操作系統(tǒng)上運行。4. 解釋型語言無需編譯可以直接運行。5....-------------------------------------------------- 問題Python 可以用于哪些領(lǐng)域 答案根據(jù)提供的上下文信息Python 可以用于以下領(lǐng)域1. **Web 開發(fā)**使用 Django、Flask 等框架2. **爬蟲開發(fā)**使用 Scrapy、BeautifulSoup 等庫 此外雖然上下文中沒有明確提到但根據(jù) Python 的特點如功能強大、跨平臺、解釋型語言、面向?qū)ο蟮人€可以應(yīng)用于 - 數(shù)據(jù)分析和科學(xué)計算 - 人工智能和機器學(xué)習(xí) - 自動化腳本 - 軟件開發(fā) - 網(wǎng)絡(luò)編程等 不過基于上下文直接提供的信息主要提到了 Web 開發(fā)和爬蟲開發(fā)這兩個領(lǐng)域。 引用的文檔片段 片段1Python 是一種高級編程語言由 Guido van Rossum 于1991年首次發(fā)布。 Python 的設(shè)計哲學(xué)強調(diào)代碼的可讀性和簡潔的語法使用縮進來表示代碼塊。... 片段2- 爬蟲開發(fā)使用 Scrapy、BeautifulSoup 等庫 Python 的版本歷史 - Python2.x2000 年發(fā)布2020 年停止維護 -... 片段32. 功能強大擁有豐富的標準庫和第三方庫。3. 跨平臺可以在 Windows、macOS、Linux 等操作系統(tǒng)上運行。4. 解釋型語言無需編譯可以直接運行。5....-------------------------------------------------- 問題Python2什么時候停止維護的 答案根據(jù)提供的上下文Python2.x 版本于 **2020 年停止維護**。 引用的文檔片段 片段1Python 是一種高級編程語言由 Guido van Rossum 于1991年首次發(fā)布。 Python 的設(shè)計哲學(xué)強調(diào)代碼的可讀性和簡潔的語法使用縮進來表示代碼塊。... 片段2- 爬蟲開發(fā)使用 Scrapy、BeautifulSoup 等庫 Python 的版本歷史 - Python2.x2000 年發(fā)布2020 年停止維護 -... 片段32. 功能強大擁有豐富的標準庫和第三方庫。3. 跨平臺可以在 Windows、macOS、Linux 等操作系統(tǒng)上運行。4. 解釋型語言無需編譯可以直接運行。5....-------------------------------------------------- ? 已清理臨時文件 代碼結(jié)構(gòu)和流程說明數(shù)據(jù)準備 (Data Preparation):使用TextLoader加載本地文件。使用RecursiveCharacterTextSplitter將大文檔分割成小片段 (texts)確保上下文不會丟失。使用OllamaEmbeddings將這些片段轉(zhuǎn)換為向量并存儲到Chroma數(shù)據(jù)庫。RAG 鏈定義 (LCEL Chain Definition):rag_chain_core定義了問答的邏輯流先接收輸入- 結(jié)合 Prompt -調(diào)用 LLM - 解析輸出。get_source_and_answer是一個包裝函數(shù)負責(zé)執(zhí)行檢索(retriever.invoke(query))然后將檢索結(jié)果context和原始問題一起傳入核心 LCEL Chain 中生成答案。運行階段 (每輪問答)準備階段 (僅運行一次)1. 轉(zhuǎn)換為向量Retriever 檢索器用戶問題 Query獲取 K 個最相關(guān)的文檔片段原始問題格式化函數(shù) format_docsContext 上下文ChatPromptTemplateChatOllama LLMStrOutputParser最終答案 Answer文本分割器文檔內(nèi)容OllamaEmbeddingsChroma 向量數(shù)據(jù)庫總結(jié):通過以上的實踐你就已經(jīng)完成了一個最基礎(chǔ)的的本地RAG了。如果你也在學(xué)習(xí)那么是不是也會覺得有點意思。案例 6使用 Agent代理首先了解一下工作的流程:否是用戶提問create_agent 入口ReAct Prompt 工具描述LLM 生成 Thought Action工具調(diào)用Observation足夠信息?LLM 生成 Final Answer結(jié)果輸出創(chuàng)建文件demo6_agent.py 案例 6Agent代理展示如何讓 AI 自主使用工具完成任務(wù) (LangChain v1 最終版) 特點 1. 純本地 Agent使用 Ollama qwen3-coder:30b 模型。 2. 采用簡潔的 LangChain v1 LCEL 風(fēng)格create_agent 后直接 invoke()無需 AgentExecutor。 # ----------------------------------------------------# 導(dǎo)入修正與核心組件# ----------------------------------------------------fromlangchain_ollamaimportChatOllama# 從 Ollama 包中導(dǎo)入聊天模型fromlangchain.agentsimportcreate_agent# V1 Agent 核心工廠函數(shù)用于創(chuàng)建 Agent Runnablefromlangchain_core.toolsimporttool# 用于裝飾 Python 函數(shù)將其注冊為 LLM 可用的工具fromlangchain_core.messagesimportHumanMessage# 用于格式化用戶輸入符合 V1 Agent 的標準輸入格式importmath# 供計算器工具使用的標準數(shù)學(xué)庫# ----------------------------------------------------# 非 Ollama 環(huán)境相關(guān)內(nèi)容 (已注釋)# from dotenv import load_dotenv# load_dotenv() # 如果使用 OpenAI 等需要 API Key 的服務(wù)此處用于加載環(huán)境變量# ----------------------------------------------------# --- 1. 工具定義使用 tool 裝飾器實現(xiàn)自定義工具 ---# 實現(xiàn)工具的意義在于讓 LLM 可以調(diào)用這些函數(shù)完成特定的任務(wù)補齊 LLM 的能力短板。tooldefcalculator(expression:str)-str:用于執(zhí)行數(shù)學(xué)計算。輸入應(yīng)該是一個數(shù)學(xué)表達式例如2 2 或 math.sqrt(16)# 這個 Docstring 會被 Agent 讀取作為工具的使用說明try:# eval的作用是執(zhí)行字符串形式的表達式并返回結(jié)果# expression是傳入的字符串形式的變量# 限制命名空間{__builtins__: None} 禁用所有內(nèi)置函數(shù)# 僅允許訪問 math 庫以提高 eval 的安全性雖然仍需謹慎resulteval(expression,{__builtins__:None,math:math})returnf計算結(jié)果{result}exceptExceptionase:returnf計算錯誤{str(e)}tooldefget_weather(city:str)-str:用于查詢城市的天氣情況。輸入應(yīng)該是一個城市名稱例如北京# 這是一個模擬工具。在實際應(yīng)用中此函數(shù)體應(yīng)該包含對外部天氣 API 的調(diào)用邏輯。weather_data{北京:晴天氣溫 20°C,上海:多云氣溫 25°C,深圳:雨天氣溫 28°C}returnweather_data.get(city,f抱歉沒有{city}的天氣數(shù)據(jù))# --- 2. Agent 邏輯 ---defagent_example_v1():Agent 示例 (LangChain v1 最小可運行版本)print(*50)print(創(chuàng)建 AgentLangChain v1 LCEL 最小版...)print(*50)# 初始化 LLM 模型# 確保 Ollama 服務(wù)正在運行并且 qwen3-coder:30b 模型已通過 ollama pull 拉取llmChatOllama(modelqwen3-coder:30b,temperature0)# 定義工具列表將所有用 tool 裝飾的函數(shù)收集起來tools[calculator,get_weather]# ③ V1 核心創(chuàng)建 Agent Runnable# create_agent 內(nèi)部會生成一個 ReAct 模式的 Prompt并將 tools 注冊給 LLM。# 它返回一個 Runnable 對象可直接調(diào)用。agentcreate_agent(llm,tools)print(? Agent Runnable 已創(chuàng)建
)# 測試用例test_cases[幫我計算 15 的平方根是多少,北京今天天氣怎么樣,上海的天氣如何溫度適合外出嗎,請計算 (25 75) * 2 的結(jié)果]fori,queryinenumerate(test_cases,1):print(*50)print(f測試{i}{query})print(*50)try:# V1 調(diào)用直接 invoke Runnable# 輸入格式{messages: [HumanMessage(contentquery)]}# Agent 會根據(jù)這個輸入開始它的 ReAct 循環(huán)思考-調(diào)用工具-觀察-再次思考resultagent.invoke({messages:[HumanMessage(contentquery)]})# 最終答案Agent 的輸出是一個包含多輪思考和消息的字典。# 最終的答案用戶的回復(fù)位于 messages 列表的最后一條消息中。answerresult[messages][-1].contentprint(f
最終答案{answer}
)exceptExceptionase:# 捕獲執(zhí)行過程中的錯誤例如 Ollama 服務(wù)中斷或 LLM 解析失敗print(f
執(zhí)行出錯{str(e)}
)if__name____main__:agent_example_v1()輸出結(jié)果創(chuàng)建 AgentLangChain v1 LCEL 最小版...? Agent Runnable 已創(chuàng)建測試1幫我計算15的平方根是多少最終答案15 的平方根約等于3.873。測試2北京今天天氣怎么樣最終答案北京今天天氣晴朗氣溫為20°C。測試3上海的天氣如何溫度適合外出嗎最終答案上海目前天氣多云氣溫為25°C。這樣的溫度比較舒適適合外出活動。不過建議攜帶一件薄外套以防天氣變化或早晚溫差較大。測試4請計算(2575)*2的結(jié)果最終答案計算結(jié)果為200。源碼速覽tool把普通函數(shù)變成 LLM 可調(diào)用的Actioncreate_agent封裝 ReAct Prompt返回Runnableinvoke({messages: [...]})v1 標準輸入最后一條消息即最終答案小結(jié)demo6用最少的代碼展示了 LangChain v1 的 ReAct Agent 全貌本地模型、自定義工具、即創(chuàng)即跑復(fù)制即可體驗“讓 AI 自己動腦子”。運行所有示例創(chuàng)建文件run_all_demos.py 運行所有示例 importsubprocessimportsysdefrun_demo(demo_name):運行單個示例print(
*70)print(f運行{demo_name})print(*70
)try:subprocess.run([sys.executable,demo_name],checkTrue)exceptsubprocess.CalledProcessErrorase:print(f運行{demo_name}時出錯{e})exceptFileNotFoundError:print(f找不到文件{demo_name})defmain():demos[demo1_basic.py,demo2_prompt_template.py,demo3_chains.py,demo4_memory.py,demo5_document_qa.py,demo6_agent.py]print(開始運行所有 LangChain 示例...)fordemoindemos:run_demo(demo)print(
*70)print(所有示例運行完成)print(*70)if__name____main__:main()總結(jié)通過上面的的六個demo 相信你對langchin已經(jīng)有了一個基本的認識了為了節(jié)約很多同學(xué)的學(xué)習(xí)成本。如果你的本地只有一臺Mac 建議你使用ollama qwen2.5:7b 基本輕松無法壓力。那么如果你的預(yù)算比較充足或者你的本地的配置比較高可以嘗試和我使用同樣的本地模型qwen3-coder:30b。之前在其他平臺寫的地址也是我的6 個 demo 覆蓋核心調(diào)用 → 鏈 → 記憶 → RAG → Agent下一篇我們講《langchin深入》