如何调整LangChain结构化聊天代理(对接SQL数据库)的输出格式
解决LangChain结构化聊天代理格式输出问题的方法
1. 优化Prompt的格式约束
直接在系统提示词中加入强约束格式说明,避免模糊描述,示例如下:
你必须严格遵循以下固定格式输出,任何情况都不能偏离:
Question: [用户的原始问题] Thought: [你的思考逻辑,明确下一步操作理由] Action: [调用的工具名称,例如sql_db_query] Action Input: [工具的输入参数,例如完整SQL语句] Observation: [工具返回的真实查询数据] Thought: [基于观察结果的后续判断,确定是否继续查询或直接输出答案] Final Answer: [给用户的最终回答内容]
同时在提示词末尾补充:若未遵守格式,将无法完成任务,必须重新输出。
2. 绑定结构化输出解析器
使用LangChain的StructuredOutputParser强制模型输出符合结构的内容,代码示例:
from langchain.output_parsers import StructuredOutputParser, ResponseSchema # 定义输出结构规则 response_schemas = [ ResponseSchema(name="Question", description="用户原始问题"), ResponseSchema(name="Thought", description="思考过程"), ResponseSchema(name="Action", description="调用的工具名称"), ResponseSchema(name="Action Input", description="工具输入参数"), ResponseSchema(name="Observation", description="工具返回的真实数据"), ResponseSchema(name="Final Answer", description="最终答案") ] output_parser = StructuredOutputParser.from_response_schemas(response_schemas) format_instructions = output_parser.get_format_instructions() # 将格式指令整合进系统提示词 system_prompt = f""" 你是SQL数据库查询助手,必须严格按照以下格式输出: {format_instructions} """
将该解析器绑定到代理的Prompt中,确保模型输出被强制校验并解析为指定结构。
3. 恢复默认停止序列
不要将stop_sequence设为False,改用StructuredChatAgent的默认停止序列,确保代理在生成到Observation环节时停止,等待工具返回真实数据后继续执行:
from langchain.agents import StructuredChatAgent agent = StructuredChatAgent.from_llm_and_tools( llm=llm, tools=tools, stop=StructuredChatAgent.default_stop, # 恢复默认停止序列 verbose=True )
4. 调整模型输出长度限制
若出现内容截断,增大OpenAI模型的max_tokens参数,同时降低随机性提升格式遵守度:
from langchain.chat_models import ChatOpenAI llm = ChatOpenAI( model_name="gpt-3.5-turbo", max_tokens=1500, # 提升token上限容纳完整格式内容 temperature=0 # 降低随机性,强化格式执行 )
5. 使用SQLDatabaseToolKit默认代理模板
直接使用工具包自带的适配代理模板,避免自定义Prompt的格式冲突:
from langchain.agents import AgentExecutor from langchain.sql_database import SQLDatabase from langchain.agents.agent_toolkits import SQLDatabaseToolkit db = SQLDatabase.from_uri("你的数据库URI") toolkit = SQLDatabaseToolkit(db=db, llm=llm) agent_executor = AgentExecutor.from_agent_and_tools( agent=toolkit.create_agent(), tools=toolkit.get_tools(), verbose=True, handle_parsing_errors=True # 开启解析错误自动重试 )
该默认代理已内置格式约束,能更好配合SQL工具输出规范格式。
内容的提问来源于stack exchange,提问作者gibri
相关产品推荐
相关产品推荐

