本地GPU部署Mixtral模型调用工具时遇400错误求助
本地Mixtral模型结合LangChain实现结构化输出报错400的解决方法
问题场景
本地GPU部署Mixtral模型后,使用LangChain的ChatOpenAI类对接OpenAI兼容接口,通过create_structured_output_runnable生成结构化测试用例时,触发openai.BadRequestError(错误码400),提示Extra inputs are not permitted,报错指向请求体中的function_call和functions字段不被允许。
报错原因
create_structured_output_runnable基于OpenAI的**函数调用(Function Calling)**机制实现,但你使用的mistral-7b-instruct-v02原生不支持OpenAI格式的函数调用参数。本地部署的API服务(如vLLM、text-generation-inference)会拒绝这些额外的函数相关字段,导致400错误。
解决方案
方案1:改用输出解析器替代函数调用机制
绕开OpenAI的函数调用逻辑,直接通过提示词引导模型输出指定格式内容,再用LangChain的PydanticOutputParser解析结果,这是适配本地非函数调用模型的最优方案。
修改后的代码:
from langchain_openai import ChatOpenAI import httpx from langchain.output_parsers import PydanticOutputParser from langchain_core.prompts import PromptTemplate from langchain_core.pydantic_v1 import BaseModel, Field from typing import List http_client = httpx.Client(verify=False) llm = ChatOpenAI( base_url="<URL RUNNING MIXTRAL MODEL>", http_client=http_client, api_key="API KEY", model="mistral-7b-instruct-v02", ) class Test(BaseModel): """测试用例结构定义""" Input: List[List] = Field(description="测试用例的输入数据集合") Output: List[List] = Field(description="测试用例对应的预期输出集合") # 初始化Pydantic格式解析器 parser = PydanticOutputParser(pydantic_object=Test) # 构建包含格式约束的提示词 test_gen_prompt = PromptTemplate( template="""请为以下代码生成单元测试用例: {code} 请严格按照以下JSON格式输出结果: {format_instructions}""", input_variables=["code"], partial_variables={"format_instructions": parser.get_format_instructions()} ) # 构建执行链:提示词 → LLM → 格式解析 tester_agent = test_gen_prompt | llm | parser # 执行调用 sample_code = """<SAMPLE JAVA Code Base>""" result = tester_agent.invoke({"code": sample_code}) print(result.Input) print(result.Output)
方案2:适配支持函数调用的部署或模型
如果需要工具调用能力(如多Agent协作场景),可选择以下方式:
- 部署时开启函数调用支持:用vLLM部署时添加
--enable-function-calling启动参数;用text-generation-inference时配置对应工具调用参数。 - 使用支持工具调用的Mixtral变体:选择Mistral官方发布的工具调用微调模型,或社区适配的版本。
- 用LangChain的
HuggingFacePipeline对接模型,结合tool_calling组件实现自定义适配。
验证说明
方案1的代码通过提示词明确约束输出格式,无需依赖模型的函数调用能力,适配绝大多数本地部署的开源LLM(包括Mixtral)。执行后会直接返回Test类实例,可直接访问Input和Output字段。
内容的提问来源于stack exchange,提问作者Anshuman Kumar
相关产品推荐
相关产品推荐

