LangChain 入门到进阶:基于 OpenAI Compatible API 的实践指南 LangChain 入门到进阶基于 OpenAI Compatible API 的实践指南前言本文通过一系列由浅入深的练习帮助大家快速掌握 LangChain 的核心用法。所有示例均基于 OpenAI Compatible API通义千问等请根据实际情况替换模型配置。环境准备首先安装依赖pipinstalllangchain langchain-core python-dotenv pydantic配置.env文件DASHSCOPE_API_KEYyour_api_key_here DASHSCOPE_BASE_URLyour_base_url第一阶段基础对话1.1 模型初始化与批量调用test001.pyfromlangchain.chat_modelsimportinit_chat_modelfromdotenvimportload_dotenvimportos load_dotenv()modelinit_chat_model(modelqwen35-35b-a3b-fp8,model_provideropenai,api_keyos.getenv(DASHSCOPE_API_KEY),base_urlos.getenv(DASHSCOPE_BASE_URL),temperature0.7,)# 批量调用responsesmodel.batch([你好简单介绍下自己。,用一句话介绍 LangChain。,什么是 OpenAI-compatible,])forresponseinresponses:print(response.content)知识点init_chat_model()统一初始化聊天模型model.batch()批量处理多个请求1.2 带历史的消息对话test005.pyfromlangchain.chat_modelsimportinit_chat_modelfromlangchain_core.messagesimportSystemMessage,HumanMessage,AIMessagefromdotenvimportload_dotenvimportos load_dotenv()modelinit_chat_model(modelqwen35-35b-a3b-fp8,model_provideropenai,api_keyos.getenv(DASHSCOPE_API_KEY),base_urlos.getenv(DASHSCOPE_BASE_URL),temperature0.7,)messages[SystemMessage(content你是一个乐于助人的 AI 助手。),HumanMessage(content你好我是Yuan老师。),AIMessage(content你好很高兴认识你。),HumanMessage(content我刚才说我是谁),]responsemodel.invoke(messages)print(response.content)知识点SystemMessage系统消息设定 AI 角色HumanMessage用户消息AIMessageAI 回复消息完整的消息历史让模型能理解上下文第二阶段提示词模板2.1 ChatPromptTemplate 格式化test006.pyfromlangchain_core.promptsimportChatPromptTemplatefromlangchain.chat_modelsimportinit_chat_modelfromdotenvimportload_dotenvimportos load_dotenv()modelinit_chat_model(modelqwen35-35b-a3b-fp8,model_provideropenai,api_keyos.getenv(DASHSCOPE_API_KEY),base_urlos.getenv(DASHSCOPE_BASE_URL),temperature0.7,)promptChatPromptTemplate.from_messages([(system,你是{device_type}设备的客服助手回答要简洁、准确。),(human,用户问题{question}),])messagesprompt.format_messages(device_type智能音箱,question你好我想知道怎么和智能音箱交互。,)responsemodel.invoke(messages)print(response.content)2.2 LCEL 管道符组合test007.pyfromlangchain_core.promptsimportChatPromptTemplatefromlangchain.chat_modelsimportinit_chat_modelfromdotenvimportload_dotenvimportos load_dotenv()modelinit_chat_model(modelqwen35-35b-a3b-fp8,model_provideropenai,api_keyos.getenv(DASHSCOPE_API_KEY),base_urlos.getenv(DASHSCOPE_BASE_URL),temperature0.7,)promptChatPromptTemplate.from_messages([(system,你是{device_type}设备的客服助手回答要简洁、准确。),(human,用户问题{question}),])# 使用 LCEL 管道符chainprompt|model responsechain.invoke({device_type:智能音箱,question:你好我想知道手机怎么智能音箱连接,})print(response.content)知识点ChatPromptTemplate.from_messages()构建提示词模板|管道符LangChain Expression Language (LCEL)将 prompt 和 model 连接成链这种方式更灵活便于复用和调试第三阶段流式输出3.1 基本流式调用test001.py中的流式示例streammodel.stream(python和js的区别)forchunkinstream:print(chunk.content,end,flushTrue)3.2 Agent 流式输出处理test002.pyfromlangchain.agentsimportcreate_agentfromlangchain.chat_modelsimportinit_chat_modelfromlangchain_core.messagesimportSystemMessage,HumanMessage,AIMessagefromdotenvimportload_dotenvimportos load_dotenv()modelinit_chat_model(modelqwen35-35b-a3b-fp8,model_provideropenai,api_keyos.getenv(DASHSCOPE_API_KEY),base_urlos.getenv(DASHSCOPE_BASE_URL),temperature0.7,)agentcreate_agent(modelmodel)messages[SystemMessage(content你是一个乐于助人的 AI 助手。),HumanMessage(content你好我是教 AI 的 Yuan 老师。),AIMessage(content你好Yuan 老师很高兴认识你。),HumanMessage(content请查询 SpaceX 最近 7 天的最新消息。),]resagent.stream({messages:messages})# 收集所有 chunkfull_responseNoneforchunkinres:iffull_responseisNone:full_responsechunkelse:full_response{**full_response,**chunk}formessageinfull_response[messages]:message.pretty_print()知识点model.stream()流式输出字词逐个返回agent.stream()Agent 流式响应返回消息列表流式输出提升用户体验尤其适合长文本生成第四阶段多模态 - 图片处理4.1 本地图片处理test003.pyimportbase64importmimetypesfrompathlibimportPathfromlangchain.chat_modelsimportinit_chat_modelfromlangchain_core.messagesimportHumanMessagefromdotenvimportload_dotenvimportos load_dotenv()modelinit_chat_model(modelqwen35-35b-a3b-fp8,model_provideropenai,api_keyos.getenv(DASHSCOPE_API_KEY),base_urlos.getenv(DASHSCOPE_BASE_URL),temperature0.7,)deflocal_image_to_data_url(image_path:str)-str:pathPath(image_path).resolve()ifnotpath.exists():path(Path(__file__).parent/image_path).resolve()mime_type,_mimetypes.guess_type(path.suffix)ifnotmime_type:mime_typeimage/pngdatapath.read_bytes()b64base64.b64encode(data).decode()returnfdata:{mime_type};base64,{b64}image_urllocal_image_to_data_url(./avatar2.png)essageHumanMessage(content[{type:text,text:请描述这张图片。},{type:image_url,image_url:{url:image_url}},])resmodel.stream([message])forrinres:print(r.content,end,flushTrue)4.2 网络图片处理test004.pyfromlangchain.chat_modelsimportinit_chat_modelfromlangchain_core.messagesimportHumanMessagefromdotenvimportload_dotenvimportos load_dotenv()modelinit_chat_model(modelqwen35-35b-a3b-fp8,model_provideropenai,api_keyos.getenv(DASHSCOPE_API_KEY),base_urlos.getenv(DASHSCOPE_BASE_URL),temperature0.7,)messageHumanMessage(content[{type:text,text:请描述这张图片。},{type:image_url,image_url:{url:https://example.com/image.png},},])forchunkinmodel.stream([message]):print(chunk.content)知识点图片需转为 Base64 Data URL 格式支持本地路径和网络 URL多模态模型可理解图像内容并回答相关问题第五阶段结构化输出test008.pyfromlangchain.chat_modelsimportinit_chat_modelfrompydanticimportBaseModel,Fieldfromdotenvimportload_dotenvimportos load_dotenv()modelinit_chat_model(modelqwen35-35b-a3b-fp8,model_provideropenai,api_keyos.getenv(DASHSCOPE_API_KEY),base_urlos.getenv(DASHSCOPE_BASE_URL),temperature0.7,)classMovie(BaseModel):title:strField(...,description电影名称)year:intField(...,description上映年份)director:strField(...,description导演)rating:floatField(...,description评分满分 10 分)model_with_structuremodel.with_structured_output(Movie,include_rawTrue)responsemodel_with_structure.invoke(你好我想知道电影如果爱的详细信息。)print(response)知识点with_structured_output()让模型输出符合 Pydantic 模型定义的结构化数据include_rawTrue同时返回原始响应和解析后的结构化对象适用于需要提取特定字段的场景总结阶段核心内容适用场景基础init_chat_model、invoke、batch简单对话、批量处理模板ChatPromptTemplate、LCEL|提示词复用、链式调用流式stream长文本生成、实时交互多模态图片 Base64/URL图文理解、视觉问答结构化with_structured_output数据提取、API 响应注意事项敏感信息生产环境中请勿将 API Key 硬编码建议使用环境变量或密钥管理服务编码处理Windows 环境下可能需要配置 UTF-8 编码importsysimportio sys.stdoutio.TextIOWrapper(sys.stdout.buffer,encodingutf-8)sys.stderrio.TextIOWrapper(sys.stderr.buffer,encodingutf-8)模型选择不同模型对多模态、结构化输出的支持程度不同请参考模型文档