You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在LangChain中向LLM动态传递grammar参数?

动态为HuggingFaceEndpoint传递grammar参数

我目前可以在HuggingFaceEndpoint构造函数中传入grammar参数,代码示例如下:

class QuestionValidator(BaseModel):
    label: str


llm_base = HuggingFaceEndpoint(
    endpoint_url=ENDPOINT_URL,
    max_new_tokens=1024,
    seed=60,
    model_kwargs={"grammar": {"type": "json", "value": QuestionValidator.schema()}}
)

llm_with_grammar = prompt | llm_base | JsonOutputParser()
res = llm_with_grammar.invoke(
    {"question": "tell me a joke?", "table_schemas": schema_info}
)
print(res)

但我希望能动态传递grammar参数,不在HuggingFaceEndpoint构造函数中固定配置,而是通过invoke方法或类似方式传入特定grammar。我了解到LangChain的with_config方法可实现类似需求,但不清楚具体用法,期望实现的效果如下:

llm_base = HuggingFaceEndpoint(
    endpoint_url=ENDPOINT_URL,
    max_new_tokens=1024,
    seed=60,
)

grammar1 = {"grammar": {"type": "json", "value": QuestionValidator.schema()}}
grammar2 = {"grammar": {"type": "json", "value": AnswerValidator.schema()}}

llm_with_grammar1 = prompt_tmplate_1 | llm_base.with_config(grammar1) | StrOutputParser()
llm_with_grammar2 = prompt_tmplate_2 | llm_base.with_config(grammar2) | StrOutputParser()

实现方案

方法1:用with_config预配置带不同grammar的链

LangChain的with_config方法可给链中组件设置运行时配置,对于HuggingFaceEndpoint,需要将grammar参数嵌套在model_kwargs中传入with_config的config参数。

修正后的代码示例:

from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import JsonOutputParser
from langchain_huggingface import HuggingFaceEndpoint
from pydantic import BaseModel

# 定义不同的Pydantic验证器
class QuestionValidator(BaseModel):
    label: str

class AnswerValidator(BaseModel):
    content: str
    score: int

# 初始化基础LLM实例(无固定grammar)
llm_base = HuggingFaceEndpoint(
    endpoint_url=ENDPOINT_URL,
    max_new_tokens=1024,
    seed=60,
)

# 定义不同的grammar配置(需嵌套在model_kwargs下)
grammar_config1 = {"model_kwargs": {"grammar": {"type": "json", "value": QuestionValidator.schema()}}}
grammar_config2 = {"model_kwargs": {"grammar": {"type": "json", "value": AnswerValidator.schema()}}}

# 创建带不同grammar的独立链
prompt1 = PromptTemplate.from_template("为问题生成分类标签:{question}")
chain_with_grammar1 = prompt1 | llm_base.with_config(config=grammar_config1) | JsonOutputParser()

prompt2 = PromptTemplate.from_template("回答问题并给出满意度评分(0-10):{question}")
chain_with_grammar2 = prompt2 | llm_base.with_config(config=grammar_config2) | JsonOutputParser()

# 调用不同链
res1 = chain_with_grammar1.invoke({"question": "这是一个编程相关问题吗?"})
res2 = chain_with_grammar2.invoke({"question": "解释什么是机器学习?"})

print(res1)
print(res2)

方法2:在invoke调用时临时传入grammar

如果不需要提前创建多个链,可在单次调用invoke时,通过config参数直接传入grammar:

# 创建基础通用链
base_prompt = PromptTemplate.from_template("{prompt_content}")
base_chain = base_prompt | llm_base | JsonOutputParser()

# 第一次调用传入grammar1
res1 = base_chain.invoke(
    {"prompt_content": "为问题生成分类标签:这是一个技术问题吗?"},
    config={"model_kwargs": {"grammar": {"type": "json", "value": QuestionValidator.schema()}}}
)

# 第二次调用传入grammar2
res2 = base_chain.invoke(
    {"prompt_content": "回答问题并给出评分:什么是Python?"},
    config={"model_kwargs": {"grammar": {"type": "json", "value": AnswerValidator.schema()}}}
)

关键说明

  • with_config的config参数必须和构造函数参数结构一致,grammar需放在model_kwargs字典内。
  • 两种方法各有适用场景:方法1适合需要重复使用固定grammar链的场景,方法2适合单次调用临时切换参数的场景。

内容的提问来源于stack exchange,提问作者Amir H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 13:26:11