llm.with_structured_output结构化输出为None

llm.with_structured_output结构化输出为None

问题描述:

按课程代码结构化llm输出结果为None

相关代码:

from typing import Literal

import dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()


class RouteQuery(BaseModel):
    """将用户查询映射到对应的数据源上"""
    datasource: Literal["python_docs", "js_docs", "golang_docs"] = Field(
        description="根据用户的问题,选择哪个数据源最相关以回答用户的问题"
    )


#

def choose_route(result: RouteQuery) -> str:
    print('----:', result)
    """根据不同的传递结果选择不同的检索器"""
    if "python_docs" in result.datasource:
        return 'chain in python_docs'
    elif "js_docs" in result.datasource:
        return 'chain in js_docs'
    else:
        return 'chain in golang_docs'


llm = ChatOpenAI(model="gpt-3.5-turbo-16k", temperature=5)
structured_llm = llm.with_structured_output(RouteQuery)

prompt = ChatPromptTemplate.from_messages([
    ('system', '你是一个擅长将用户问题路由到适应数据源的专家。\n请根据问题涉及的编程语言,将其路由到相关数据源'),
    ('human', '{question}')
])
router = {'question': RunnablePassthrough()} | prompt

question = """下面的代码为什么不工作了,请帮我检查下:

from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages(['human','speak in {language}'])

prompt.invoke('中文')
"""
res = router.invoke(question)
print(res)
res_s = structured_llm.invoke(res)
print(res_s)

输出如下:对应最后两行print

相关截图:

https://img1.sycdn.imooc.com/climg/66b34d3809ecd11819830429.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
泽辉呀 2024-08-09 08:48:28

看了下代码里的模型的temperature设置成了5,这个数值超过了openai的-1~1的范围,温度/数值越高,生成的内容越随机,所以导致大语言模型并没有调用函数,而是很热情洋溢地写了一大堆内容回答你,并没有调用函数,生成函数的调用参数,所以解析器就没法解析出对应的参数啦~


解决策略:将temperature设置为0即可,一般来说如果要使用函数回调,都会把temperature设置的值比较低,这样大语言模型相对来说会按照特定的规则进行输出。


  • 提问者 慕无忌9177945 #1

    temperature改为0后,转出内容变少,但结构化后输出依然是None,请老师再帮我看下,谢谢

    https://img1.sycdn.imooc.com/climg/66b5e06909b44a5814451155.jpg

    2024-08-09 17:25:26
  • 泽辉呀 回复 提问者 慕无忌9177945 #2

    这个应该就是大模型的随机性导致的了,可以切换成4的模型试下还会不会有这个问题

    2024-08-12 21:39:53
泽辉呀 2024-08-08 11:44:45

有将记录信息上传到LangSmith么?看下是不是大语言模型输出了错误的内容,导致结构化输出解析器解析不到内容返回了None导致的,如果有上传到LangSmith,可以把对应的日志链接分享出来,我帮您看下~

  • 提问者 慕无忌9177945 #1

    看日志是正常输入,输出为null

    https://img1.sycdn.imooc.com/climg/66b451a0095218fb13921073.jpg

    2024-08-08 13:03:39
  • 提问者 慕无忌9177945 #2

    请老师帮我看下,感谢

    2024-08-08 13:04:35
  • 泽辉呀 回复 提问者 慕无忌9177945 #3

    看了下代码里的模型的temperature设置成了5,这个数值超过了openai的-1~1的范围,温度/数值越高,生成的内容越随机,所以导致大语言模型并没有调用函数,而是很热情洋溢地写了一大堆内容回答你,并没有调用函数,生成函数的调用参数,所以解析器就没法解析出对应的参数啦~


    解决策略:将temperature设置为0即可,一般来说如果要使用函数回调,都会把temperature设置的值比较低,这样大语言模型相对来说会按照特定的规则进行输出。

    2024-08-09 08:48:14
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
LLM应用开发平台特训营
  • 参与学习       184    人
  • 解答问题       134    个

全栈+全流程打造价值极高+可商用大模型应用开发LLMOps平台 迅速具备低成本、高效率构建生成式 AI 原生应用的稀缺能力 教/学/练/测/评教学+大厂内推机会,培养具备AI架构和研发能力的尖端人

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师