AI能输出结构化数据
让模型按照 Pydantic 模型输出结构化数据,解决自由文本难以程序化处理的问题
例:从简历文本中提取结构化信息
structured_output_demo.py
import os
from typing import List, Optional
from pydantic import BaseModel, Field
from langchain_openai import ChatOpenAI
# 用Pydantic定义简历的数据模型
class Resume(BaseModel):
name: str = Field(description="姓名")
phone: Optional[str] = Field(default=None, description="电话")
email: Optional[str] = Field(default=None, description="邮箱")
skills: List[str] = Field(default_factory=list, description="技能")
# 初始化模型
model = ChatOpenAI(
model="qwen3.5-plus",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0.1 # 输出会更稳定、更偏向确定性回答
)
# 绑定结构化输出
structured_model = model.with_structured_output(Resume, include_raw=True) # include_raw=True:同时返回解析后的对象和原始输出
# 系统提示词
system_prompt = "你是一个简历提取助手,请从简历文本中提取信息,并以JSON格式返回。使用以下英文键名:name(姓名)、phone(电话)、email(邮箱)、skills(技能列表)。"
# 简历测试数据
resume_text = """
姓名:Steven Wong
电话:17640118430
邮箱:844541199@qq.com
技能:精通Java、Python的安装与卸载,精通Office...
"""
# 拼接系统提示到和简历测试数据
input_with_prompt = system_prompt + "\n\n" + resume_text
# 执行提取并打印结果
result = structured_model.invoke(input_with_prompt)
if result.get("parsed"):
parsed_result = result["parsed"] # 原始Pydantic对象
print(f"提取成功:{parsed_result}")
print(f"姓名:{parsed_result.name}")
print(f"电话:{parsed_result.phone}")
print(f"邮箱:{parsed_result.email}")
print(f"技能:{','.join(parsed_result.skills)}")
else:
print("提取失败", {result.get('raw')}, {result.get('parsing_error')})
运行脚本
python structured_output_demo.py
ini
提取成功:name='Steven Wong' phone='17640118430' email='844541199@qq.com' skills=['精通 Java、Python 的安装与卸载', '精通 Office...']
姓名:Steven Wong
电话:17640118430
邮箱:844541199@qq.com
技能:精通 Java、Python 的安装与卸载,精通 Office...
聊天机器人能记住上次聊啥
通过 InMemorySaver 实现带短记忆的聊天机器人,让模型记住当前会话的上下文
例:构建一个带短记忆的简单聊天机器人
pip install langgraph
inmemorysaver_demo.py
import os
from langchain_openai import ChatOpenAI
from langchain.agents import create_agent
from langgraph.checkpoint.memory import InMemorySaver
# 初始化模型
model = ChatOpenAI(
model="qwen3.5-plus",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
# 初始化记忆存储
checkpointer = InMemorySaver()
# 创建带记忆功能的智能体
agent = create_agent(
model=model,
tools=[],
system_prompt="你是一个乐于助人的助手 请始终使用中文回答 如果不知道答案,请直接说"我不知道",不要编造",
checkpointer=checkpointer
)
# 使用同一个 thread_id 保持会话
config = {"configurable": {"thread_id": "user_123"}}
# 第一轮对话
response1 = agent.invoke({"messages": [("user", "我叫蔡徐坤,喜欢唱,跳,rap,篮球")]}, config=config)
print("助手:", response1["messages"][-1].content)
# 第二轮对话
response2 = agent.invoke({"messages": [("user", "我是谁?我喜欢什么?")]}, config=config)
print("助手:", response2["messages"][-1].content)
助手: 你好蔡徐坤,很高兴认识你!唱、跳、rap 和篮球都是很棒的爱好,看来你充满活力。请问有什么我可以帮你的吗?
助手: 根据你刚才的介绍,你是蔡徐坤,你喜欢唱、跳、rap 和篮球。
-
关键点说明
-
thread_id的作用:- 框架根据该 ID 区分不同用户或不同会话
- 相同 ID 共享历史
-
历史消息自动注入:
- 开发者无需手动拼接历史
create_agent内部会从 checkpointer 读取历史并加入提示词
-
清除历史:
- 只需更换新的
thread_id即可开始全新会话
- 只需更换新的
-
AI调用工具并上网搜答案
定义自定义搜索工具,集成 Tavily 联网搜索 API,让 Agent 自主决定何时调用工具获取实时信息
-
准备工作:获取 Tavily API Key
-
访问 tavily.com 注册账号
-
登录后进入后,创建并复制 API Key
-
将 API Key 配置到环境变量
TAVILY_API_KEY -
虚拟环境激活环境变量
ini$env:TAVILY_API_KEY = '你的Tavily API Key'
-
-
安装依赖
pip install tavily-python
例:构建支持联网搜索的 Agent
tool_agent_demo.py
import os
from tavily import TavilyClient
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langchain.agents import create_agent
# 初始化Tavily客户端
tavily_client = TavilyClient(api_key=os.getenv("TAVILY_API_KEY"))
# 定义搜索工具
@tool
def search_web(query: str) -> str:
"""搜索互联网获取实时信息,参数query是搜索关键词。当用户需要最新的天气、新闻、最新事件等时使用此工具。"""
try:
result = tavily_client.search(query, max_results=3)
summaries = [item["content"] for item in result.get("results", [])]
return "\n".join(summaries) if summaries else "未找到相关信息"
except Exception as e:
print(f"搜索失败:{str(e)}")
# 初始化模型
model = ChatOpenAI(
model="qwen3.5-plus",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0.3
)
# 创建智能体
agent = create_agent(
model=model,
tools=[search_web],
system_prompt="你是一个乐于助人的助手,可以搜索互联网获取实时信息。当用户询问天气、新闻、最新事件时,请使用search_web工具。"
)
# 测试
if __name__ == "__main__":
response = agent.invoke({"messages": [("user", "今天沈阳天气怎么样?")]})
print("助手:", response["messages"][-1].content)
运行脚本
python tool_agent_demo.py
markdown
助手: 根据最新天气信息,今天(2026年10月20日,周二)沈阳的天气情况如下:
## 🌤️ 当前天气
- **天气状况**:晴
- **气温**:6℃(体感2℃)
- **风向风力**:北风4级
- **湿度**:98%
- **空气质量**:优(AQI 31)
- **日出/日落**:06:05 / 16:55
## ⚠️ 预警信息
**大风蓝色预警**:预计今天6时到20时,沈阳市和平区、沈河区、铁西区、皇姑区、大东区、于洪区等区域偏北风4到5级,阵风7到8级。请注意出行安全,加固临时搭建物,防范高空坠物风险。
## 📋 生活建议
| 指数 | 等级 | 建议 |
|------|------|------|
| 穿衣 | 较冷 | 建议着厚外套加毛衣,年老体弱者宜穿大衣、呢外套 |
| 感冒 | 极易发 | 温差大、风力强,注意增减衣服 |
| 紫外线 | 中等 | 建议涂擦SPF>15的防晒霜 |
| 洗车 | 较不宜 | 风力较大,洗车后易蒙尘 |
| 运动 | 较适宜 | 推荐室内运动 |
| 过敏 | 极不易发 | 可放心外出 |
**温馨提示**:今天风力较大,外出请注意防风保暖,照顾好老人和小孩!
-
关键点说明
-
工具描述的重要性:
@tool装饰器会自动将函数的 docstring 作为工具描述- 模型根据描述决定是否调用该工具
-
工具参数类型:
-
使用类型注解
- 如
query: str,框架会自动生成参数 schema
- 如
-
-
错误处理:
- 工具内部应捕获异常并返回友好的错误信息
- 否则 Agent 可能崩溃
-
Agent 决策过程:
- 当用户问题与工具描述匹配时,Agent 会先输出工具调用请求
- 框架执行工具后,模型再根据工具结果生成最终答案
-