引言
在大语言模型(LLM)逐渐成为技术焦点的今天,如何有效地从文本中抽取结构化信息成了热门话题。许多开发者认为,使用工具调用(tool calling)是生成结构化输出的必要手段。然而,凭借设计良好的提示(prompt),LLM可以在无工具调用的情况下生成符合预期格式的输出。本文将带领您探索如何利用提示进行数据抽取,并解析LLM的输出以创建结构化的Python对象。
主要内容
1. 选择合适的大模型
选择合适的模型是成功实施数据抽取的第一步。以下是一些流行的LLM供应商:
- OpenAI
- Anthropic
- Azure
- 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在无工具调用的情况下进行有效的数据抽取。为了进一步学习,您可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---