使用大模型进行数据抽取:如何通过提示实现无需工具调用的结构化输出

227 阅读3分钟

引言

在大语言模型(LLM)逐渐成为技术焦点的今天,如何有效地从文本中抽取结构化信息成了热门话题。许多开发者认为,使用工具调用(tool calling)是生成结构化输出的必要手段。然而,凭借设计良好的提示(prompt),LLM可以在无工具调用的情况下生成符合预期格式的输出。本文将带领您探索如何利用提示进行数据抽取,并解析LLM的输出以创建结构化的Python对象。

主要内容

1. 选择合适的大模型

选择合适的模型是成功实施数据抽取的第一步。以下是一些流行的LLM供应商:

  • OpenAI
  • Anthropic
  • Azure
  • Google
  • Cohere
  • NVIDIA
  • FireworksAI
  • Groq
  • MistralAI
  • TogetherAI

在使用这些服务时,由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。例如:

# 使用API代理服务提高访问稳定性
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass()
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o-mini")

2. 设计良好的提示

良好的提示设计是进行有效信息抽取的关键。我们需要让模型输出的信息遵循特定的格式,例如JSON。

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import PydanticOutputParser

prompt = ChatPromptTemplate.from_messages([
    ("system", "Answer the user query. Wrap the output in `json` tags\n{format_instructions}"),
    ("human", "{query}"),
]).partial(format_instructions=parser.get_format_instructions())

3. 使用输出解析器解析模型响应

通过设计自定义解析器,我们可以将模型的自然语言输出解析成我们需要的Python对象。例如,使用PydanticOutputParser可以帮助我们解析并创建结构化的Pydantic对象。

from typing import List
from langchain_core.pydantic_v1 import BaseModel, Field

class Person(BaseModel):
    name: str = Field(..., description="The name of the person")
    height_in_meters: float = Field(..., description="The height of the person in meters")

class People(BaseModel):
    people: List[Person]

parser = PydanticOutputParser(pydantic_object=People)

代码示例

这是一个完整的例子,展示如何编排提示、模型和输出解析器:

query = "Anna is 23 years old and she is 6 feet tall"

chain = prompt | model | parser
result = chain.invoke({"query": query})

print(result)  # 输出: People(people=[Person(name='Anna', height_in_meters=1.83)])

常见问题和解决方案

问题1: 输出格式不符合预期

解决方案: 检查提示中是否正确设置了格式说明,并确保模型理解了输出要求。

问题2: 网络不稳定导致的API调用失败

解决方案: 使用API代理服务来提高网络访问的稳定性。

总结和进一步学习资源

通过精心设计提示和解析器,我们可以利用LLM在无工具调用的情况下进行有效的数据抽取。为了进一步学习,您可以参考以下资源:

参考资料

  1. LangChain官方文档
  2. Pydantic文档
  3. JSON规范

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---