langchain初步认识

张开发
2026/4/9 16:29:29 15 分钟阅读

分享文章

langchain初步认识
​LangChain提供了一系列方便的工具、组件和接口大大降低了 AI 应用开发的门槛也极大简化了大模型应用程序的开发过程。为什么需要 LangchainLangChain 尝试解决的问题​prompt的结构如何标准化如果我想中途随时切换大模型怎样简单方便地操作LLM的输出是非结构化的它如何与结构化的程序接口相互交互预训练模型的知识落后如何让它知道最新的信息如何让这颗大脑拥有记忆如何给这颗“聪明脑”装上“五官”让它能够感知环境输入怎样给这颗“聪明脑”装上“手”和“脚”让它帮我执行具体的任务LangChain框架背后的核心思想是将自然语言处理序列分解为各个部分允许开发人员根据自己的需求高效地定制工作流程。​Langchain的核心模块Langchain有6大核心模块Models模型是各种类型的模型和模型集成。Prompts提示包括提示管理、提示优化和提示序列化。Memory记忆用来保存和模型交互时的上下文状态。Indexes索引用来结构化文档以便和模型交互。包括文档加载程序、向量存储器、文本分割器和检索器等。Agents代理决定模型采取哪些行动执行并且观察流程直到完成为止。Chains链一系列对各种组件的调用。以下是我的学习记录1.invoke() 这个接口response llm.invoke(你好) # ≈ response llm(你好)逻辑上就是”传入输入拿到输出”。但实际开发中必须显式调用.invoke()原因我踩过坑才知道有次我想切换到异步模式结果发现自家写的纯函数没法直接换得全部重写。 LangChain 生态内万物皆 Runnable调用必 invoke这样后续切都无缝。.ainvoke().stream()注框架的规范一开始看着绕后期都是护城河。2.Chain 的管道符 |顺序不能调换chain prompt | llm | parser这个顺序我一开始没在意调换过报错了。为什么不能换LCEL 是图执行模式左边输出作为右边输入。prompt 输出的是 PromptValuellm 吃这个llm 输出的是 AIMessageparser 吃这个。换了就格式不匹配。我当时的理解方式chain prompt | llm | parser ≈ result parser(llm(prompt(input)))这样想就清爽了。但写代码时必须保留管道符它是 LangChain 的标准协议。3.Memory 这个坑需要注意基础篇的 Chain 是线性的prompt 写问题 → llm 回答 → parser 确定格式。但 Memory 不一样它是独立的状态要持续记录上下文。我一开始想把 Memory 也塞进 Chain 里用管道符连起来。结果发现不行Memory 得用单独包裹。RunnableWithMessageHistory核心代码就这几行prompt ChatPromptTemplate.from_messages([ (system, 你非常可爱说话末尾会带个喵), MessagesPlaceholder(variable_namehistory), # 这行是关键 (human, {input}) ]) runnable_with_memory RunnableWithMessageHistory( runnablechain, get_session_historyget_session_history, input_messages_keyinput, history_messages_keyhistory )注占位符名字要统一最好复制粘贴别手敲。6.缓存这个功能开发时必开生产必关调试 Agent 的时候每次 invoke 都在烧钱。效果相同输入命中缓存不花钱几乎不耗时。但注意生产环境必须关掉。缓存只是结果复用没有任何智能放线上就是埋雷。7.流式输出配置就两行llm ChatOpenAI( modeldeepseek-chat, streamingTrue, # 允许流式 callbacks[StreamingStdOutCallbackHandler()] # 回调处理器 )但有个坑开启流式后print(response)会重复输出。因为 callbacks 已经自动打印每个 token 了再 print 就是双份。我当时的解决方式print(AI: , end, flushTrue) # 只打印这个前缀 response agent_with_memory.invoke(...) # callbacks 会自动打印内容 print() # 换行flushTrue 保证”AI:“立即输出不等着缓存区满。总结后续继续分享学习中踩坑分享自己学习记录

更多文章