目录

Extraction

from enum import Enum
from typing import Optional, Type
from langchain.pydantic_v1 import BaseModel, Field


class ProvinceEnum(str, Enum):
    """省、直辖市、自治区"""
    山东省 = "山东省"

class CityEnum(str, Enum):
    """山东省地级市"""
    济南 = "济南"
    青岛 = "青岛"
    淄博 = "淄博"
    枣庄 = "枣庄"
    东营 = "东营"
    烟台 = "烟台"
    潍坊 = "潍坊"
    济宁 = "济宁"
    泰安 = "泰安"
    威海 = "威海"
    日照 = "日照"
    临沂 = "临沂"
    德州 = "德州"
    聊城 = "聊城"
    滨州 = "滨州"
    菏泽 = "菏泽"
    莱芜 = "莱芜"

class DistrictEnum(str, Enum):
    """济南市区县"""
    历下区 = "历下区"
    市中区 = "市中区"
    槐荫区 = "槐荫区"
    天桥区 = "天桥区"
    历城区 = "历城区"
    长清区 = "长清区"
    平阴县 = "平阴县"
    济阳区 = "济阳区"
    商河县 = "商河县"
    章丘区 = "章丘区"

class PowerSupplyStationEnum(str, Enum):
    """供电所"""
    高新供电中心 = "高新供电中心"
    长清区供电公司 = "长清区供电公司"
    平阴县供电公司 = "平阴县供电公司"
    历城区供电公司 = "历城区供电公司"
    天桥供电中心 = "天桥供电中心"
    市中供电中心 = "市中供电中心"
    客户服务中心 = "客户服务中心"
    章丘区供电公司 = "章丘区供电公司"
    历下供电中心 = "历下供电中心"
    槐荫供电中心 = "槐荫供电中心"
    济阳区供电公司 = "济阳区供电公司"
    商河县供电公司 = "商河县供电公司"
    起步区供电中心 = "起步区供电中心"


class PowerSupplyStationLocation(BaseModel):
    """电网供电所位置"""
    province: ProvinceEnum = Field(description="省、直辖市、自治区")
    city: Optional[CityEnum] = Field(description="地级市")
    district: Optional[DistrictEnum] = Field(description="区县")
    power_supply_station: Optional[PowerSupplyStationEnum] = Field(description="供电所")


from langchain_core.utils.function_calling import convert_to_openai_function

functions = [
    convert_to_openai_function(f) for f in [
        PowerSupplyStationLocation
    ]
]

from langchain_core.utils.function_calling import convert_to_openai_tool

tools = [
    convert_to_openai_tool(f) for f in [
        PowerSupplyStationLocation
    ]
]

prompt = "2024年山东省济南市长清区供电公司的意见合计。"

OpenAI

from langchain_openai import ChatOpenAI

model = ChatOpenAI(temperature=0).bind(
    functions=functions,
    function_call={"name": PowerSupplyStationLocation.__name__}
)

response = model.invoke(prompt)
print(response)

Anthropic

from langchain_anthropic import ChatAnthropic

model = ChatAnthropic(temperature=0, model_name="claude-3-sonnet-20240229").bind_tools(
    [PowerSupplyStationLocation]
)

response = model.invoke(prompt)
print(response)

模型性能:opus > sonnet > haiku

  • claude-3-opus-20240229
    {
      'name': 'PowerSupplyStationLocation', 
      'args': {'province': '山东省', 'city': '济南', 'district': '长清区', 'power_supply_station': '长清区供电公司'}
    }
    
  • claude-3-sonnet-20240229
    {
      'name': 'PowerSupplyStationLocation', 
      'args': {'province': '山东省', 'city': '济南', 'district': '长清区', 'power_supply_station': '长清区供电公司'}
    }
    
  • claude-3-haiku-20240307
    {
      'name': 'PowerSupplyStationLocation', 
      'args': {'province': '山东省', 'city': '济南', 'district': '长清区', 'power_supply_station': '长清区供电公司'}
    }
    

Tongyi

from langchain_community.chat_models.tongyi import ChatTongyi

model = ChatTongyi(model="qwen1.5-72b-chat", top_p=0.01)

prompt = "2024年山东省济南市长清区供电公司的意见合计。"
response = model.invoke(prompt, tools=tools)
print(response)
{
    'name': 'PowerSupplyStationLocation', 
    'args': {
        'properties': {
            'city': '济南', 
            'district': '长清区', 
            'province': '山东省', 
            'power_supply_station': '长清区供电公司'
        }
    }
}

自定义提示词

下面是 PowerSupplyStationLocation 的 JSON schema:

[
    {
        'type': 'function',
        'function': {
            'description': '电网供电所位置',
            'name': 'PowerSupplyStationLocation',
            'parameters': {
                'properties': {
                    'city': {
                        'allOf': [
                            {
                                'description': '山东省地级市',
                                'enum': [
                                    '济南',
                                    '青岛',
                                    '淄博',
                                    '枣庄',
                                    '东营',
                                    '烟台',
                                    '潍坊',
                                    '济宁',
                                    '泰安',
                                    '威海',
                                    '日照',
                                    '临沂',
                                    '德州',
                                    '聊城',
                                    '滨州',
                                    '菏泽',
                                    '莱芜'
                                ],
                                'title': 'CityEnum',
                                'type': 'string'
                            }
                        ],
                        'description': '地级市'
                    },
                    'district': {
                        'allOf': [
                            {
                                'description': '济南市区县',
                                'enum': [
                                    '历下区',
                                    '市中区',
                                    '槐荫区',
                                    '天桥区',
                                    '历城区',
                                    '长清区',
                                    '平阴县',
                                    '济阳区',
                                    '商河县',
                                    '章丘区'
                                ],
                                'title': 'DistrictEnum',
                                'type': 'string'
                            }
                        ],
                        'description': '区县'
                    },
                    'power_supply_station': {
                        'allOf': [
                            {
                                'description': '供电所',
                                'enum': [
                                    '高新供电中心',
                                    '长清区供电公司',
                                    '平阴县供电公司',
                                    '历城区供电公司',
                                    '天桥供电中心',
                                    '市中供电中心',
                                    '客户服务中心',
                                    '章丘区供电公司',
                                    '历下供电中心',
                                    '槐荫供电中心',
                                    '济阳区供电公司',
                                    '商河县供电公司',
                                    '起步区供电中心'
                                ],
                                'title': 'PowerSupplyStationEnum',
                                'type': 'string'
                            }
                        ],
                        'description': '供电所'
                    },
                    'province': {
                        'allOf': [
                            {
                                'description': '省、直辖市、自治区',
                                'enum': [
                                    '山东省'
                                ],
                                'title': 'ProvinceEnum',
                                'type': 'string'
                            }
                        ],
                        'description': '省、直辖市、自治区'
                    }
                },
                'required': [
                    'province'
                ],
                'type': 'object'
            }
        }
    }
]


根据上面定义的 JSON schema,对下面的文本抽取信息,抽取的信息使用 JSON 格式描述。
2024年山东省济南市长清区供电公司的意见合计。
  • Ollama llama3-8b

Based on the provided JSON schema, I will extract the information from the given text and represent it in JSON format.

Here is the extracted information:

{
    "province": "山东省",
    "city": "济南市",
    "district": "长清区",
    "power_supply_station": "长清区供电公司"
}

Please note that I used the required parameter in the JSON schema to determine the minimum required fields, and since only these four fields are present in the text, I extracted them accordingly.

  • Ollama llama3-70b

Based on the provided JSON schema, I extracted the following information from the given text:

{
  "province": "山东省",
  "city": "济南",
  "district": "长清区",
  "power_supply_station": "长清区供电公司"
}

Let me know if you need any further assistance! 😊

参考资料