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上建一个映像