当前位置: 首页 > backend >正文

Langchain提取结构化数据

构建一个chain,从非结构化文本中,提取结构化信息。如表格抽取(文本分析成表格)。

初始化

import os
from typing import Optional, Listfrom langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
from pydantic.v1 import BaseModel, Fieldos.environ['http_proxy'] = '127.0.0.1:7890'
os.environ['https_proxy'] = '127.0.0.1:7890'os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_PROJECT"] = "LangchainDemo"
os.environ["LANGCHAIN_API_KEY"] = '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'
# os.environ["TAVILY_API_KEY"] = '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'# 聊天机器人案例
# 创建模型
model = ChatOpenAI(model='gpt-4-turbo')

pydantic

# pydantic: 处理数据,验证数据, 定义数据的格式, 虚拟化反虚拟化类型转换等等。

#若无ManyPerson——导致,用户提及多个人,LLM只能关注到一个人。

# 定义一个数据,
class Person(BaseModel):"""关于一个人的数据模型"""name: Optional[str] = Field(default=None, description='表示人的名字')hair_color: Optional[str] = Field(default=None, description="如果知道的话,这个人的头发颜色")height_in_meters: Optional[str] = Field(default=None, description="以米为单位测量的高度")class ManyPerson(BaseModel):"""数据模型类: 代表多个人"""people: List[Person]

PromptTemplate

# 定义自定义提示以提供指令和任何其他上下文。
# 1) 你可以在提示模板中添加示例以提高提取质量
# 2) 引入额外的参数以考虑上下文(例如,包括有关提取文本的文档的元数据。MessagesPlaceholder)

prompt = ChatPromptTemplate.from_messages([("system","你是一个专业的提取算法。""只从未结构化文本中提取相关信息。""如果你不知道要提取的属性的值,返回该属性的值为null。",),# 请参阅有关如何使用参考记录消息历史的案例# MessagesPlaceholder('examples'),("human", "{text}"),]
)

chain

# with_structured_output 模型的输出是一个结构化的数据
chain = {'text': RunnablePassthrough()}| prompt | model.with_structured_output(schema=ManyPerson)#结构化输出# text = '马路上走来一个女生,长长的黑头发披在肩上,大概1米7左右,'# text = "马路上走来一个女生,长长的黑头发披在肩上
#,大概1米7左右。走在她旁边的是她的男朋友,叫:刘海;比她高10厘米。"
text = "My name is Jeff, my hair is black and i am 6 feet tall. Anna has the same color hair as me."
resp = chain.invoke(text)
print(resp)

#text1

# text = "马路上走来一个女生,长长的黑头发披在肩上,大概1米7左右。走在她旁边的是她的男朋#友,叫:刘海;比她高10厘米。"

若无 ManyPerson,则输出还是上图;

http://www.xdnf.cn/news/1785.html

相关文章:

  • 第九节:性能优化高频题-首屏加载优化策略
  • JS Array 方法 | 区分 slice 和 splice
  • `rfind()` 从字符串的右侧开始查找指定子字符串首次出现的位置
  • SiamFC算法深度解析
  • 深入浅出:Pinctrl与GPIO子系统详解
  • SpringCloud微服务架构设计与实践 - 面试实战
  • C语言别踩白块附源码
  • Trae+DeepSeek学习Python开发MVC框架程序笔记(四):使用sqlite存储查询并验证用户名和密码
  • 现代化个人博客系统 ModStartBlog v10.3.0 博客批量操作,博客评论智能审核,安全升级
  • 某大型电解铝厂电解系统谐波治理装置改造沃伦森电气
  • Linux之七大难命令(The Seven Difficult Commands of Linux)
  • U盘能识别但无法写入数据的原因
  • CSS学习笔记8——表格
  • STM32F103C8T6 GPIO 通讯原理与物理层解析
  • Git 详细使用说明文档(适合小白)
  • 数据结构-冒泡排序(Python)
  • 【硬核干货】JetBrains AI Assistant 干货笔记
  • 数据分析工具 - AxureMost
  • php 框架Workerman定时任务详解《一》
  • MCP开发实战(一)基于MCP协议的大模型网关——多个大模型API统一封装为标准化工具
  • Axure大屏可视化模板:多领域数据决策的新引擎
  • TXPOLARITY/RXPOLARITY设置
  • java延迟map, 自定义延迟map, 过期清理map,map能力扩展。如何设置map数据过期,改造map适配数据过期
  • day6-小白学习JAVA---方法_面向对象
  • 了解低功耗蓝牙中的安全密钥
  • 缓存穿透、雪崩、击穿深度解析与解决方案
  • 多线程中的ABA问题详解
  • Java并发编程|CompletableFuture原理与实战:从链式操作到异步编排
  • BGE(BAAI General Embedding)模型详解
  • Nginx 安装与配置全流程指南(2025 最新版)