如何在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
相关产品推荐
相关产品推荐

