跟着datawhale学langchain系列笔记:(1)LangChain与LangGraph框架认知

0 阅读3分钟

datawhale 资料链接:第一章 LangChain与LangGraph框架认知 | Easy-langent

安装UV

  • Linux: curl -LsSf astral.sh/uv/install.… | sh

    • 错误,不能访问Github因为不能科学上网
  • windows: powershell -ExecutionPolicy ByPass -c "irm astral.sh/uv/install.… | iex"

  • pip 安装(推荐:国内安装): pip install uv

  • 验证:uv --version

环境搭建

  • WSL2 + VScode

    • 大部分的AI都更适合Linux环境,WSL是window上的linux环境
    • 相对于linux,window更熟悉,代码调试更方便
    • VScode支持几乎所有流行的编程语言
  • 大模型

    • 本地部署ollama:

      • 优点:免费随便用
      • 缺点:对于上下文比较长的应用很费劲,另外受到硬件限制不能部署太大的模型
    • 云端免费

      • 魔塔社区:部分模型免费,有固定的免费token。不多对于学习来说也够了

langchain

只能定义顺序链: prompt --> 大模型 --> result。换句话说,只能顺序依次处理不能有分支

langgraph

处理的流程可以有分支,也就是说同一个节点可以连接多个节点

  • 工作流程:

    • 定义State(状态):WorkflowState类定义的结构,相当于工作流的“共享数据容器”,用于传递和存储中间结果(比如第一步的原始建议、第二步的精简建议);

      class workflow_state(TypedDict, total=False):
          user_role: str  # 存储用户角色  --> not in result
          system_prompt: str  # 存储系统提示 -->not in result
          user_question: str  # 存储用户问题  --> not in result
          llm_answer: str  # 存储大模型回答
          simplified_answer: str  # 存储精简后的回答
          translated_answer: str  # 存储翻译后的回答
      
    • 定义Node(节点):每个节点对应一个函数,负责完成一个具体任务(生成建议、精简建议),函数接收状态作为输入,处理后返回更新后的状态;

      def initial_user_input(state: workflow_state):
          prompt = f"xxx"
          result = llm.invoke(prompt)
          return {"llm_answer": result.content}
      
    • 定义Edge(边)构建工作流:定义节点的执行顺序(START→generate→simplify→END),相当于工作流的“流程规划图”

      workflow = StateGraph(workflow_state)
      workflow.add_node("initial_user_input", initial_user_input)
      workflow.add_node("simplify_answer", simplify_answer)   
      workflow.add_node("translate_answer", translate_answer)
      workflow.add_edge(START, "initial_user_input")
      workflow.add_edge("initial_user_input", "simplify_answer")
      workflow.add_edge("simplify_answer", "translate_answer")
      workflow.add_edge("translate_answer", END)
      
    • 编译compile(编译):把状态图、节点、边的定义,转换成可执行的工作流实例

      app = workflow.compile()
      
    • invoke(执行):传入初始状态,工作流会按定义的顺序执行节点,最终返回完整的状态(包含所有中间结果和最终结果)。

      result = app.invoke({})
      

练习

  • ch_01_0l.py: 第一个例子Langchain
  • ch_01_02.py: 第二个例子Langgraph

发现的问题

  • 上面练习代码在python文件中运行正常可以在ipynb中无法运行(已解决)

    • 开始没有安装ipkernel。等安装之后直接运行不行,然后把cell删除重新添加之后运行正常
  • Langgraph的例子用本地模型,一直挂死!不知道怎么回事

    • 问题已解决,定义的环境变量不匹配LOCAL_OPENAI_API_BASE写成了LOCAL_OPENAI_API_BASE_URL,而.env中只有LOCAL_OPENAI_API_BASE。所以连不上大模型
  • langgraph在workflow_state好像只记录大模型的输出,也就是链路的数据 其他定义的字典没用

  • 教材在github上国内访问相当不稳定,建议在gitee上建一个映像