LangChain、LangGraph入门
本文主要是基于学习的datawhale关于langchain、langgraoh课程记录的学习过程与个人看法。安装依赖安装langchain、langgraph、openai依赖及用于管理环境变量(python-dotenv)的辅助依赖pip install langchain langgraph openai langchain_openai python-dotenv验证依赖版本方式一代码验证importlangchainimportlanggraphimportopenai#验证langchain、langraph和openai的版本可以通过以下命令print(LangChain版本,langchain.__version__)print(LangGraph版本,importlib.metadata.version(langgraph))print(OpenAI版本,openai.__version__)方式二如果使用的是pycharm也可以在界面查看Pycharm-File-Settings-Project-Python Innterpreter查看依赖的版本号HelloWorld入门LangChain入门示例importosfromlangchain_openaiimportChatOpenAIfromdotenvimportload_dotenv# 加载.env环境变量load_dotenv()# 获取环境变量中的apikey url和模型名称API_KEYos.getenv(API_KEY)BASE_URLos.getenv(BASE_URL)MODEL_NAMEos.getenv(MODEL_NAME)print(API_KEY ,API_KEY)print(BASE_URL ,BASE_URL)print(MODEL_NAME ,MODEL_NAME)ifnotAPI_KEY:raiseValueError(未检测到API_KEY,请检查.env文件是否配置正确)# 初始化大模型llmChatOpenAI(api_keyAPI_KEY,base_urlBASE_URL,modelMODEL_NAME,temperature0.3)# 构造提示词prompt请写一段50字左右的LangChain学习建议语言简洁、实用适合初学者# 调用模型responsellm.invoke(prompt)# 生成结果print(生成的学习建议,response.content)容易出错的点存放环境变量的.env文件中环境变量名称与代码中获取环境变量的名称不一致比如.env文件如下图所示而代码中写的是importos API_KEYos.getenv(OPEN_API_KEY)BASE_URLos.getenv(OPEN_BASE_URL)文件中没有定义名称为OPEN_API_KEY与OPEN_BASE_URL的环境变量获取时肯定会报错。LangGraph入门示例# 1. 导入需要的模块importosfromlangchain_openaiimportChatOpenAIfromlanggraph.graphimportStateGraph,START,ENDfromtypingimportTypedDictfromdotenvimportload_dotenv# 2. 加载API密钥load_dotenv()# 3. 配置 API KeyAPI_KEYos.getenv(API_KEY)BASE_URLos.getenv(BASE_URL)MODEL_NAMEos.getenv(MODEL_NAME)print(API_KEY,API_KEY,\n,BASE_URL,BASE_URL,\n,MODEL_NAME,MODEL_NAME)ifnotAPI_KEY:raiseValueError(未检测到 API_KEY请检查 .env 文件是否配置正确)# 4. 初始化大模型和LangChain案例一样llmChatOpenAI(api_keyAPI_KEY,base_urlBASE_URL,modelMODEL_NAME,# 注意根据你使用的模型修改名称 后面章节不再继续说明temperature0.3)# 5. 定义 StateclassWorkflowState(TypedDict,totalFalse):user_role:str#存储用户角色original_advice:str#存储原始学习建议simplified_advice:str#存储精简后的建议translate_advice:str#存储翻译后的建议# 6. 定义节点 入参state 是一个符合 WorkflowState 结构的字典包含工作流当前累积的所有数据。 逻辑调用大模型llm.invoke完成一个具体任务。 返回值不是整个新状态而是一个字典片段。LangGraph 会自动将这个返回值合并更新到总状态中。 defgenerate_advice(state:WorkflowState):promptf给{state[user_role]}写一段50字左右的 AI 学习建议。resultllm.invoke(prompt)return{original_advice:result.content}defsimplify_advice(state:WorkflowState):promptf把下面的学习建议精简到30字以内{state[original_advice]}resultllm.invoke(prompt)return{simplified_advice:result.content}deftranslate_advice(state:WorkflowState):promptf把精简后的建议{state[simplified_advice]}翻译成英文resultllm.invoke(prompt)return{translate_advice:result.content}# 7. 构建工作流 StateGraph 是 LangGraph 的核心类。 传入 WorkflowState 的作用是告诉图我们传递的数据结构长什么样包含 user_role、original_advice、simplified_advice、translate_advice。 workflowStateGraph(WorkflowState) 添加节点和连线 节点Node给刚才定义的函数起个名字挂载到图上。 边Edge定义执行顺序。 START → generate程序一开始就执行 generate_advice。 generate → simplifygenerate 完成后自动执行 simplify。 simplify → translatesimplify 完成后自动执行 translate。 translate → END最后结束。 workflow.add_node(generate,generate_advice)workflow.add_node(simplify,simplify_advice)workflow.add_node(translate,translate_advice)workflow.add_edge(START,generate)workflow.add_edge(generate,simplify)workflow.add_edge(simplify,translate)workflow.add_edge(translate,END) 编译与执行 compile()把图“冻结”成一个可执行的程序对象。 invoke()传入初始状态只有角色没有建议内容启动工作流。 appworkflow.compile()# 8. 执行resultapp.invoke({user_role:高校学生})# 9. 输出print(原始学习建议)print(result[original_advice])print(\n精简后学习建议)print(result[simplified_advice])print(\n翻译后的学习建议)print(result[translate_advice])代码解释什么是TypeDictclassWorkflowState(TypedDict,totalFalse):user_role:str#存储用户角色original_advice:str#存储原始学习建议simplified_advice:str#存储精简后的建议TypedDict告诉 Python WorkflowState这个类是一个有固定键名、固定值类型的字典。totalFalse表示字典中的所有键都是可选的即可以不传某个字段也不会报类型错误。字段定义仅是类型注解运行时没有任何强制校验或默认值生成。怎么使用TypedDict 不是一个需要实例化的类它只是一个类型蓝图。依然使用花括号 {} 来创建字典定义了 TypedDict 后它的使用方式和普通 Python 字典完全一样。区别仅在于 IDE 会给你提示静态检查工具会帮你纠错。fromtypingimportTypedDictclassWorkflowState(TypedDict,totalFalse):user_role:stroriginal_advice:strsimplified_advice:str使用方式state:WorkflowState{}# 声明变量类型为 WorkflowStatestate[user_role]studentstate[original_advice]Practice Python daily.print(state[user_role])# 输出: student作为函数参数的类型声明与使用defprocess_advice(data:WorkflowState)-str:# 因为定义了类型IDE 知道 data.get 应该填什么键originaldata.get(original_advice,)roledata.get(user_role,guest)returnf为{role}生成:{original}input_data{user_role:teacher,original_advice:Focus on pedagogy}resultprocess_advice(input_data)节点函数定义对LangChain和LangGraph的认识从名称看来LangChain是链式的类似于线性结构处理的是类似于流水线式的简单任务而LangGraph是图也就是有节点和边的图从示例代码中也可以看到LangGraph对于图的定义是开发者可以根据业务逻辑自由定义的灵活性更高。示例代码给人的直观感受是langchain不适合复杂流程就当前这个案例而言可能很多人会有疑问langchain和大家日常所使用的deepseek、豆包等工具实现的功能是一样的吗langchain只是需要有代码基础的人实现批量任务的吗接下来我们从后续课程中继续寻找答案langraph给人的直观感受是自定义性强可以自己去设计工作流状态、节点以及节点的连接方式比较适合复杂任务。本文代码部分来源datawhale easy-langent项目
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2519016.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!