LLM应用实战: 给个公司简称,输出公司全称

1.背景

本qiang~本周在处理手头项目工作的时候,遇到了一个问题,就是友方提供了一个公司名称列表(量不小~,因此无法人工处理),且该公司名称列表均为简称,需要与库中的全称做一个映射匹配。

看似简单的一个需求,但传统的技术手段貌似都无法派上用场,比如语义相似度,文本编辑距离等等。

因此本qiang花费了半天的时间思考并解决了该任务,遂将工作记录如下,且本着开放共享,将核心源码进行公开,欢迎讨论~

2.整体框架


其实,原理也非常简单,由于本地数据库缺乏公司的完整信息,但可以借助互联网资源来搜索公司的相关信息,比如官网介绍、天眼查等来源,然后将检索后的结果通过大模型自带的推理能力输出最终结果。

本文中使用的搜索引擎是duckduckgo_search(需要kexue上网),大模型调用使用的duckduckgo_search内部集成的gpt-4o-mini(理论上只要能kexue上网,即可免费使用gpt-4o-mini)

3. 效果展示


4. 全部源码

由于调用检索相对耗时,因此分为公司简称检索和公司全称提取两个模块

4.1公司简称检索

from duckduckgo_search import DDGS

import json

import time


def save_datas(file_path, datas, json_flag=True, all_flag=False, with_indent=False, mode='w'):

    """保存文本文件"""

    with open(file_path, mode, encoding='utf-8') as f:

        if all_flag:

            if json_flag:

                f.write(json.dumps(datas, ensure_ascii=False, indent= 4 if with_indent else None))

            else:

                f.write(''.join(datas))

        else:

            for data in datas:

                if json_flag:

                    f.write(json.dumps(data, ensure_ascii=False) + '\n')

                else:

                    f.write(data + '\n')



def search_companies(companies):

    results = []

    for company in companies:

        if '公司' in company:

            results.append({

                'company': company,

                'search_results': 'company'

            })

            continue

        text = f'{company} 公司名全称'


        search_results = None

        while search_results is None:

            try:

                search_results = DDGS().text(text, max_results=10)

                if search_results: break

            except Exception as e:

                print('sleep 2s')

                time.sleep(2)

                continue

        results.append({

            'company': company,

            'search_results': search_results

        })

        time.sleep(2)

    save_datas('data/公司简称检索结果.json', results)



def get_datas(file_path, json_flag=True, all_flag=False, mode='r'):

    """读取文本文件"""

    results = []


    with open(file_path, mode, encoding='utf-8') as f:

        for line in f.readlines():

            if json_flag:

                results.append(json.loads(line))

            else:

                results.append(line.strip())

        if all_flag:

            if json_flag:

                return json.loads(''.join(results))

            else:

                return '\n'.join(results)

        return results



if __name__ == '__main__':

    search_companies(get_datas('data/公司简称列表.txt', json_flag=False))

4.2公司全名提取


from duckduckgo_search import DDGS

import json

import time



PROMPT = """你是一个助手,你的任务是基于输入的公司名简称以及搜索结果,分析并提取出公司名简称对应的公司名全称。要求如下:

1. "简称"是公司名简称,"搜索结果"是基于互联网的搜索后的资源,需要根据"简称"和"搜索结果"进行分析,并输出公司全称,如果无法确认,请返回"无";

2.如果检索结果不包含公司全称,请基于你所学习的知识可以进一步判断;

3.输出结果只包含公司名的全称信息,且只能包含一个,不需要输出解释信息;

4.输入的公司名简称均是科技领域的知名公司,这点请注意;


示例:

简称:京东

搜索结果:

1.京东(中国1998年创立的自营式电商企业)_百度百科\n京东(股票代码:jd),中国自营式电商企业,创始人刘强东初期担任京东集团董事局主席兼首席执行官,2021年9月,徐雷获任集团总裁。京东旗下设有京东商城、京东金融、拍拍网、京东智能、o2o及海外事业部等。1998年6月18日,刘强东在 中关村成立京东公司。

2.京东集团 - 维基百科,自由的百科全书\n东集团. 京东集团 (NASDAQ: JD 、 港交所: 9618 、 港交所: 89618 (人民幣結算)),前稱 360buy 和 京東商城,由刘强东于1998年6月18日创立,是一家总部位于 北京 的 中国 电子商务公司,主要為 B2C 模式的購物網站 。. 2014年,京东集团在 美国 纳斯达克证券交易 ...

3.京东集团股份有限公司 - 爱企查\n简介: 京东集团股份有限公司(JD.com, Inc.)于2006年11月6日在在英属维尔京群岛注册成立的公司,通过中国境内的子公司和VIE开展经营活动,公司总部位于北京。. 京东是专业的综合性网上购物商城,是中国B2C市场最大的3C网购专业平台,是中国电子商务领域最受 ...

输出:京东集团股份有限公司


现在,请按照要求完成:

简称: {company_name}

搜索结果: {search_results}

输出:

"""


def save_datas(file_path, datas, json_flag=True, all_flag=False, with_indent=False, mode='w'):

    """保存文本文件"""

    with open(file_path, mode, encoding='utf-8') as f:

        if all_flag:

            if json_flag:

                f.write(json.dumps(datas, ensure_ascii=False, indent= 4 if with_indent else None))

            else:

                f.write(''.join(datas))

        else:

            for data in datas:

                if json_flag:

                    f.write(json.dumps(data, ensure_ascii=False) + '\n')

                else:

                    f.write(data + '\n')


def get_datas(file_path, json_flag=True, all_flag=False, mode='r'):

    """读取文本文件"""

    results = []


    with open(file_path, mode, encoding='utf-8') as f:

        for line in f.readlines():

            if json_flag:

                results.append(json.loads(line))

            else:

                results.append(line.strip())

        if all_flag:

            if json_flag:

                return json.loads(''.join(results))

            else:

                return '\n'.join(results)

        return results




def get_company_full_names():

    results = []

    for ele in get_datas('data/公司简称检索结果.json'):

        company_name = ele['company']

        search_results = ele['search_results']

        if isinstance(search_results, str):

            results.append(f'{company_name}\t{company_name}')

            continue


        prompt = PROMPT.format(company_name=company_name, search_results=search_results)

        result = ''

        while result == '':

            try:

                result = DDGS().chat(prompt, model='gpt-4o-mini')

                if result.strip(): break

            except Exception as e:

                time.sleep(2)

                continue

        results.append(f'{company_name}\t{result}')

    save_datas('data/公司全称提取结果.txt', results, json_flag=False)


if __name__ == '__main__':

    get_company_full_names()


5.总结

一句话足矣~

开发了一款基于公司简称补全公司全称的工具,包括具体的框架、实现原理以及完整源码,满满诚意,提供给各位看官。欢迎转发、订阅~有问题可以私信或留言沟通!

虽然需求比较简单,且实现过程也比较简单,但通过搜索引擎搜素以及大模型的各种奇技淫巧,相信可以完成更加复杂且效果惊艳的项目。

有兴趣的客官可以进行沟通合作,感谢~

6.参考

1) https://github.com/deedy5/duckduckgo_search.git

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容