码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 18. LangChain输出解析器实战:从大模型输出到结构化数据的转化


    合集 - AI应用开发实战(32)
    1.1. AI应用实战开发04-292.2.【保姆级入门】什么是 AI?人工智能到底能干嘛?看完秒懂!04-293.3. AI大模型架构图和盈利模式04-304.4. Token(词元),5分钟彻底搞懂04-305.5. AI大模型的不足和解决方案04-306.6. LangChain,解决AI大模型的不足05-017.7. 搞懂LangChain开发库,还有dotenv实战05-028.8.【保姆级】从零学会LangChain调用大模型!统一接口+代码实战05-039.9. LangChain 6大核心参数详解 + 代码实战,看完就能直接用05-0410.10. LangChain开发核心技巧,动态切换AI大模型参数05-0511.11. LangChain实用技巧,轻松切换AI大模型05-0612.12. LangChain 6大核心调用方法:invoke/stream/batch同步异步全解析,新手也能轻松学会05-0713.13. 学会提示词,从此 AI 听你指挥05-0814.14. 别再硬写提示词了!LangChain PromptTemplate从入门到实战05-1215.15. 别再硬写提示词了!LangChain ChatPromptTemplate核心实战05-1516.16. LangChain ChatPromptTemplate多模态应用实战05-1617.17. LangChain FewShotPromptTemplate少样本应用实战05-17
    18.18. LangChain输出解析器实战:从大模型输出到结构化数据的转化05-18
    19.19. 大模型输出乱成渣?3个解析器轻松转成标准列表!05-1920.20. AI大模型输出转JSON,原来这么简单!05-2021.21. “|”不只是按位或,90%的人不知道05-2122.22. LangChain LCEL,用 | 串联AI的魔法语言05-2423.23. AI 智能体真的很难吗?5分钟一次性讲明白06-0124.24. LangChain内置工具,开发效率提升10倍!06-0325.25. AI 总是 “失忆“?3 行代码让它记住你!06-0626.26. Agent 记不住业务数据?用 Store 给它加个“笔记本“!06-1327.27. Agent 需要拦截模型调用?用 Middleware 给它加个“拦截器“!06-1428.28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!06-1829.29. MCP协议,让大模型自己调用工具06-2230.30. AI Skills技能系统,让 Agent 自动变强06-2431.31. RAG 检索增强生成,让大模型拥有外部知识07-0632.32. 从 LangChain 到实战落地:一条清晰的智能体技术进阶路径(完结篇)07-07
    收起

    在实际开发AI应用时,我们常会遇到一个很实际的问题:大模型的输出大多是自然语言文本,但我们搭建的应用程序,往往只能处理字符串、JSON、列表这类结构化数据。两者格式不匹配,就会导致大模型的输出无法直接被应用调用,而LangChain内置的输出解析器,正是为了解决这个痛点而生的。视频看这里《18. 动画讲解 LangChain 解析器!一看就懂》。

    image

     最基础也最常用的,就是StrOutputParser。它的作用很简单,就是把大模型的输出,直接转换成纯文本字符串——看起来简单,但却是很多AI应用的基础操作,毕竟很多场景下,我们只需要干净的文本输出,无需多余格式。

    我们用一个简单的案例来演示,比如让大模型扮演“笑话大王”,输出一个笑话,再用StrOutputParser解析结果。具体代码如下,每一步都标注了核心作用,大家可以直接复制实操:

    复制代码
    from langchain_core.prompts import ChatPromptTemplate
    from langchain_core.output_parsers import StrOutputParser
    
    # 定义提示词模板,指定大模型的角色和用户输入
    prompt = ChatPromptTemplate.from_messages(
        [
            {"role": "system", "content": "你是一个笑话大王"},
            {"role": "user", "content": "{new_input}"}
        ]
    )
    # 传入用户输入,生成完整的提示词
    prompt_value = prompt.invoke(
        {
            "new_input": "讲一个笑话"
        }
    )
    # 调用大模型,获取原始输出
    res = llm.invoke(prompt_value, config=config)
    # 初始化解析器,解析大模型输出为纯文本
    parser = StrOutputParser()
    result = parser.invoke(res)
    # 打印解析后的结果
    print(result)
    复制代码

    运行这段代码后,大家会发现,大模型的输出会被解析成一段干净的纯文本,没有任何多余的格式,刚好能满足应用程序对字符串输入的需求。

    除了常规的一次性输出,实际开发中我们还常会用到流式输出——比如让大模型的回复像聊天一样逐字显示,提升用户体验。这种情况下,StrOutputParser同样适用,只需要稍微调整代码,就能实现流式解析。

    流式输出的处理代码如下,重点在于用stream方法调用大模型,再用解析器的transform方法逐块解析流式数据:

    复制代码
    from langchain_core.prompts import ChatPromptTemplate
    from langchain_core.output_parsers import StrOutputParser
    
    # 提示词模板和之前一致,指定大模型角色
    prompt = ChatPromptTemplate.from_messages(
        [
            {"role": "system", "content": "你是一个笑话大王"},
            {"role": "user", "content": "{input}"}
        ]
    )
    # 传入用户输入,生成提示词
    prompt_value = prompt.invoke(
        {
            "new_input": "讲一个笑话"
        }
    )
    # 用stream方法调用大模型,获取流式输出
    res = llm.stream(prompt_value, config=config)
    # 初始化解析器,逐块解析流式数据并打印
    parser = StrOutputParser()
    for chunk in parser.transform(res):
        print(chunk, end="", flush=True)
    复制代码

    这里有个小细节需要注意:print语句里的end=""和flush=True,是为了让解析后的内容逐字连续显示,不会出现换行或卡顿的情况,完美还原流式输出的效果。

    其实StrOutputParser的核心价值,就是“做减法”——去掉大模型输出中多余的格式冗余,只保留纯文本内容,让大模型的输出能直接适配应用程序的需求。对于刚接触LangChain的开发者来说,先掌握这个最简单的解析器,再逐步学习更复杂的JSON解析器、列表解析器,就能轻松解决大模型输出与应用程序格式不匹配的问题。

  • 相关阅读:
    java web 前置知识——Servlet(一)
    docker 安装jenkins
    FPGA——用VGA时序显示图像(3)(代码)
    PHP & MySQL图解学习指南:开启Web开发新篇章
    STM32 外部中断
    科目一常考知识点速记技巧汇总(2022全新版)
    Java内部类(成员内部类、静态内部类、局部内部类、局部内部类)
    鲁棒性与稳定性区别
    怎么把mp4转换成amv格式?如何下载amv格式视频?
    【STM32】:GPIO工作原理
  • 原文地址:https://www.cnblogs.com/halfcode/p/20074434
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号