news 2026/4/16 19:25:48

【大模型】-LangChain多模态输入和自定义输出

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【大模型】-LangChain多模态输入和自定义输出

文章目录

        • 11.1 xml输出
        • 11.2 json输出
        • 11.3 支持图片输入
        • 11.4 配合工具输出
11.1 xml输出
fromlangchain_core.output_parsersimportJsonOutputParser,XMLOutputParserfromlangchain_core.promptsimportChatPromptTemplate,HumanMessagePromptTemplate,MessagesPlaceholder,PromptTemplatefromlangchain_community.chat_modelsimportChatTongyifromdotenvimportload_dotenvfrompydanticimportBaseModel,Field load_dotenv()llm=ChatTongyi(model="qwen-plus")joke_query="生成周杰伦的歌曲,按照年份升序排列"parser=XMLOutputParser()prompt=PromptTemplate(template="回答用户的查询。\n{format_instructions}\n{query}\n",input_variables=["query"],partial_variables={"format_instructions":parser.get_format_instructions()},)chain=prompt|llm response=chain.invoke({"query":joke_query})print(response.content)#输出结果<songs><song><title>可爱女人</title><year>2000</year><album>Jay</album></song><song><title>星晴</title><year>2000</year><album>Jay</album></song><song><title>龙卷风</title><year>2000</year><album>Jay</album></song><song><title>简单爱</title><year>2001</year><album>Fantasy</album></song><song><title>开不了口</title><year>2001</year><album>Fantasy</album></song><song><title>双截棍</title><year>2001</year><album>Fantasy</album></song><song><title>爱在西元前</title><year>2001</year><album>Fantasy</album></song><song><title>娘子</title><year>2000</year><album>Jay</album></song><song><title>安静</title><year>2000</year><album>Jay</album></song><song><title>半岛铁盒</title><year>2002</year><album>The Eight Dimensions</album></song><song><title>东风破</title><year>2003</year><album>Yeh Hui-Mei</album></song><song><title>晴天</title><year>2003</year><album>Yeh Hui-Mei</album></song><song><title>七里香</title><year>2004</year><album>Common Jasmine Orange</album></song><song><title>发如雪</title><year>2005</year><album>November's Chopin</album></song><song><title>千里之外</title><year>2006</year><album>Still Fantasy</album></song><song><title>青花瓷</title><year>2007</year><album>On the Run!</album></song><song><title>稻香</title><year>2008</year><album>Capricorn</album></song><song><title>说好不哭</title><year>2019</year><album>未发行专辑</album></song><song><title>Mojito</title><year>2020</year><album>Mojito</album></song><song><title>最伟大的作品</title><year>2022</year><album>最伟大的作品</album></song></songs>
11.2 json输出
fromlangchain_core.output_parsersimportJsonOutputParserfromlangchain_core.promptsimportChatPromptTemplate,HumanMessagePromptTemplate,MessagesPlaceholder,PromptTemplatefromlangchain_community.chat_modelsimportChatTongyifromdotenvimportload_dotenvfrompydanticimportBaseModel,Field load_dotenv()llm=ChatTongyi(model="qwen-plus")classJoke(BaseModel):setup:str=Field(description="设置笑话的问题")punchline:str=Field(description="解决笑话的答案")joke_query="告诉我一个笑话"parser=JsonOutputParser(pydantic_object=Joke)prompt=PromptTemplate(template="回答用户的查询。\n{format_instructions}\n{query}\n",input_variables=["query"],partial_variables={"format_instructions":parser.get_format_instructions()},)chain=prompt|llm|parser##print(chain.invoke({"query": joke_query}))forchunkinchain.stream({"query":joke_query}):print(chunk)#输出{}{'setup':''}{'setup':'为什么'}{'setup':'为什么程序员总是喜欢用黑暗'}{'setup':'为什么程序员总是喜欢用黑暗模式?'}{'setup':'为什么程序员总是喜欢用黑暗模式?','punchline':'因为他们'}{'setup':'为什么程序员总是喜欢用黑暗模式?','punchline':'因为他们不喜欢光明。'}
11.3 支持图片输入
importbase64importhttpxfromlangchain_core.messagesimportHumanMessagefromlangchain_community.chat_modelsimportChatTongyifromdotenvimportload_dotenv load_dotenv()image_url="https://img1.baidu.com/it/u=352739982,3234821554&fm=253&app=138&f=JPEG?w=500&h=857"image_data=base64.b64encode(httpx.get(image_url).content).decode("utf-8")llm=ChatTongyi(model="qwen-plus")# 使用支持图像识别的模型message=HumanMessage(content=[{"type":"text","text":"用中文描述这张图片的内容"},{"type":"image_url","image_url":{"url":{"url":f"data:image/jpeg;base64,{image_data}"}}}])response=llm.invoke([message])print(response.content)#输出这张图片展示了一个现代风格的客厅,整体色调以白色和浅木色为主,营造出明亮、宽敞的空间感。以下是图片中各个元素的详细描述:1.**地板**: 地板采用浅色木地板,表面光滑且有自然的木纹纹理,增加了空间的温馨感。2.**沙发**: 客厅中央摆放着一组灰色布艺沙发,包括一个三人座沙发和两个单人座沙发。沙发的设计简洁,线条流畅,坐垫柔软,给人一种舒适的感觉。沙发上没有多余的装饰,保持了极简主义的风格。3.**茶几**: 沙发前有一张圆形玻璃茶几,透明的桌面让空间显得更加通透。茶几上放置了一本打开的书和一个小型植物盆栽,增添了一丝生活气息。...............
11.4 配合工具输出
importbase64importhttpxfromlangchain_core.messagesimportHumanMessage,ToolMessagefromlangchain_community.chat_modelsimportChatTongyifromlangchain_core.toolsimporttool# 补充导入tool装饰器fromtypingimportLiteral# 添加此行以解决 Literal 未定义问题fromdotenvimportload_dotenv load_dotenv()image_url="https://copyright.bdstatic.com/vcg/creative/cae2f3d12fc98f2eb94d625dad4f42a3.jpg@wm_1,k_cGljX2JqaHdhdGVyLmpwZw=="image_data=base64.b64encode(httpx.get(image_url).content).decode("utf-8")llm=ChatTongyi(model="qwen-plus")# 使用支持图像识别的模型@tooldefweather_tool(weather:Literal["晴朗的","多云的","多雨的","下雪的"])->str:"""根据天气类型返回描述"""weather_descriptions={"晴朗的":"今天阳光明媚,是个好天气。","多云的":"今天多云,可能会有些阴沉。","多雨的":"今天有雨,记得带伞。","下雪的":"今天下雪,注意保暖和防滑。"}returnweather_descriptions.get(weather,"无法识别的天气类型。")model_with_tools=llm.bind_tools(tools=[weather_tool])message=HumanMessage(content=[{"type":"text","text":"用中文描述这张图片的天气"},{"type":"image_url","image_url":f"data:image/jpeg;base64,{image_data}"# 直接使用字符串}])response=model_with_tools.invoke([message])print(response.content)# 创建包含工具调用的完整链路# 修改工具调用处理部分# 修改工具调用处理部分,确保消息格式正确# def call_model_with_tools(messages):# response = model_with_tools.invoke(messages)## # 检查是否有工具调用# if hasattr(response, 'tool_calls') and response.tool_calls:# tool_results = []# for tool_call in response.tool_calls:# # 访问字典中的参数(如果tool_call是字典)# if isinstance(tool_call, dict):# tool_name = tool_call.get('name')# tool_args = tool_call.get('args')# tool_call_id = tool_call.get('id')# else:# # 如果tool_call是对象# tool_name = getattr(tool_call, 'name', None)# tool_args = getattr(tool_call, 'args', {})# tool_call_id = getattr(tool_call, 'id', None)## # 根据工具名称执行相应工具# if tool_name == 'weather_tool':# try:# result = weather_tool.invoke(tool_args)# tool_results.append(# ToolMessage(# content=str(result),# tool_call_id=tool_call_id# )# )# except Exception as e:# tool_results.append(# ToolMessage(# content=f"工具执行错误: {str(e)}",# tool_call_id=tool_call_id# )# )## # 将工具结果添加到消息历史中,并重新调用模型# new_messages = messages + [response] + tool_results# return call_model_with_tools(new_messages)## return response## # 使用完整工具调用链路# final_response = call_model_with_tools([message])# print(final_response.content)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:59:01

基于Python+Django的学生成绩管理系统(源码+lw+部署文档+讲解等)

课题介绍本课题聚焦校园教学管理中成绩统计繁琐、数据查询不便的痛点&#xff0c;设计并开发基于PythonDjango的学生成绩管理系统。系统以Python作为核心开发语言&#xff0c;依托Django框架搭建高效稳定的后端服务架构&#xff0c;负责处理用户权限管控、成绩录入、数据统计、…

作者头像 李华
网站建设 2026/4/16 11:05:40

机器学习25:了解领域自适应(Domain Adaptation)

摘要本周课程介绍了领域自适应&#xff08;Domain Adaptation&#xff09;的基本概念与必要性。当训练数据与测试数据分布不一致时&#xff0c;模型性能会显著下降&#xff0c;领域自适应旨在解决此问题。课程重点讲解了领域对抗训练方法&#xff0c;通过特征提取器与领域分类器…

作者头像 李华
网站建设 2026/4/16 14:03:09

*边值分析**:聚焦输入域边界,选取边界值及其邻近值

测试用例示例如三角形判定通过输入三边 a、b、c 判断三角形类型&#xff0c;其设计逻辑体现了对正常与异常场景的全面覆盖。正常情况包括等边&#xff08;abc&#xff09;、等腰&#xff08;ab≠c 等&#xff09;、不等边&#xff08;a≠b≠c&#xff09;三角形&#xff1b;而异…

作者头像 李华
网站建设 2026/4/15 15:01:03

JVM 学习小记(边学边充实)

&#x1f431;‍&#x1f453; 一、JVM 1.1 JVM基本定义 定义&#xff1a;Java Virtual Machine-Java 程序的运行环境&#xff08;Java二进制字节码的运行环境&#xff09; 好处&#xff1a; 一次编写后&#xff0c;任意环境都可运行 自动内存管理、垃圾回收功能 数组下标…

作者头像 李华