ChatModel 与 Prompt 模型是对接口,Prompt 是入口。两者配合好,LLM 输出质量提升 50%。
ChatModel 统一接口 LangChain 提供统一的 ChatModel 接口,一次代码切换任意模型:
1 2 3 4 5 6 7 8 from langchain_openai import ChatOpenAIfrom langchain_anthropic import ChatAnthropicfrom langchain_ollama import ChatOllamallm = ChatOpenAI(model="gpt-4o" )
核心方法 1 2 3 4 5 response = llm.invoke("你好" ) response = await llm.ainvoke("你好" ) for chunk in llm.stream("写一首诗" ): print (chunk) results = llm.batch(["你好" , "再见" ])
返回格式 1 2 3 4 5 6 7 from langchain_core.messages import AIMessage, HumanMessage, SystemMessageresponse = llm.invoke("用 Python 写一个快排" ) print (type (response)) print (response.content) print (response.response_metadata)
Prompt 模板化 ChatPromptTemplate 1 2 3 4 5 6 7 8 9 10 11 12 from langchain_core.prompts import ChatPromptTemplateprompt = ChatPromptTemplate.from_messages([ ("system" , "你是一个{role}助手,擅长{skill}" ), ("human" , "{question}" ) ]) prompt = ChatPromptTemplate.from_template( "用{language}实现{功能},代码要简洁" )
渲染后的消息格式 1 2 3 4 5 6 7 8 9 10 messages = prompt.format_messages( role="编程" , skill="算法" , language="Python" , 功能="排序" ) print (messages)
Few-shot Prompt 提供示例让模型学习输出格式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 from langchain_core.prompts import FewShotChatMessagePromptTemplateexamples = [ {"input" : "苹果是什么" , "output" : "水果" }, {"input" : "胡萝卜是什么" , "output" : "蔬菜" }, {"input" : "牛肉是什么" , "output" : "肉类" }, ] example_prompt = ChatPromptTemplate.from_messages([ ("human" , "{input}" ), ("ai" , "{output}" ) ]) few_shot_prompt = FewShotChatMessagePromptTemplate( examples=examples, example_prompt=example_prompt ) final_prompt = ChatPromptTemplate.from_messages([ ("system" , "你是一个分类助手" ), few_shot_prompt, ("human" , "{input}" ) ])
部分填充模板 1 2 3 4 5 6 7 8 9 10 11 from langchain_core.prompts import ChatPromptTemplateprompt = ChatPromptTemplate.from_messages([ ("system" , "你是一个{agent_role}助手" ), ("human" , "{user_question}" ) ]) system_prompt_filled = prompt.partial(agent_role="代码审查" )
Output Parser(输出解析) 将 LLM 的自由文本输出转换为结构化数据:
1. CommaSeparatedListOutputParser 1 2 3 4 5 6 7 8 9 10 from langchain_core.output_parsers import CommaSeparatedListOutputParserparser = CommaSeparatedListOutputParser() prompt = prompt.partial( format_instructions=parser.get_format_instructions() ) chain = prompt | llm | parser result = chain.invoke({"query" : "列出3种编程语言" }) print (result)
2. JsonOutputParser 1 2 3 4 5 6 7 8 9 10 11 12 13 from langchain_core.output_parsers import JsonOutputParserfrom pydantic import BaseModelclass Person (BaseModel ): name: str age: int city: str parser = JsonOutputParser(pydantic_object=Person) chain = prompt | llm | parser result = chain.invoke({"query" : "张三,25岁,居住在北京" }) print (result)
3. StrOutputParser(最常用) 1 2 3 4 from langchain_core.output_parsers import StrOutputParserchain = prompt | llm | StrOutputParser()
消息角色说明 角色 说明 SystemMessage系统指令(全局行为定义) HumanMessage用户输入(也称 User) AIMessageAI 输出(包含 content + metadata) ToolMessage工具调用结果(用于 Function Calling)
1 2 3 4 5 6 7 from langchain_core.messages import SystemMessage, HumanMessagemessages = [ SystemMessage(content="你是一个严谨的技术助手" ), HumanMessage(content="解释一下什么是 RAG" ), ] response = llm.invoke(messages)
完整示例:结构化输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 from langchain_openai import ChatOpenAIfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import JsonOutputParserfrom pydantic import BaseModelclass MovieReview (BaseModel ): title: str rating: float summary: str genre: list [str ] parser = JsonOutputParser(pydantic_object=MovieReview) prompt = ChatPromptTemplate.from_messages([ ("system" , "你是一个影评人,基于用户输入输出JSON" ), ("human" , "帮我分析电影:{movie}" ) ]).partial( format_instructions=parser.get_format_instructions() ) llm = ChatOpenAI(model="gpt-4o" , temperature=0.3 ) chain = prompt | llm | parser result = chain.invoke({"movie" : "流浪地球" })