LLM应用实战: 给个公司简称,输出公司全称
1.背景
本qiang~本周在处理手头项目工作的时候,遇到了一个问题,就是友方提供了一个公司名称列表(量不小~,因此无法人工处理),且该公司名称列表均为简称,需要与库中的全称做一个映射匹配。
看似简单的一个需求,但传统的技术手段貌似都无法派上用场,比如语义相似度,文本编辑距离等等。
因此本qiang花费了半天的时间思考并解决了该任务,遂将工作记录如下,且本着开放共享,将核心源码进行公开,欢迎讨论~
2.整体框架
其实,原理也非常简单,由于本地数据库缺乏公司的完整信息,但可以借助互联网资源来搜索公司的相关信息,比如官网介绍、天眼查等来源,然后将检索后的结果通过大模型自带的推理能力输出最终结果。
本文中使用的搜索引擎是duckduckgo_search(需要kexue上网),大模型调用使用的duckduckgo_search内部集成的gpt-4o-mini(理论上只要能kexue上网,即可免费使用gpt-4o-mini)。
3. 效果展示
AutoX |
深圳安途智行科技有限公司 |
Cosmose |
翱觅苷(上海)信息科技有限公司 |
Magic Data |
北京晴数智慧科技有限公司 |
Minimax |
名之梦(上海)科技有限公司 |
Momenta |
北京初速度科技有限公司 |
Testin云测 |
北京云测信息技术有限公司 |
一流科技 |
一流科技有限公司 |
三六零 |
三六零安全科技股份有限公司 |
东杰智能 |
东杰智能科技集团股份有限公司 |
东软 |
东软集团股份有限公司 |
中心通讯 |
中兴通讯股份有限公司 |
中科创达 |
中科创达软件股份有限公司 |
中科曙光 |
曙光信息产业股份有限公司 |
中科视拓 |
中科视拓(北京)科技有限公司 |
中译语通 |
中译语通科技股份有限公司 |
九四智能 |
广州九四智能科技有限公司 |
九章云极 |
北京九章云极科技有限公司 |
云天励飞 |
深圳云天励飞技术股份有限公司 |
云徙科技 |
广州云徙科技有限公司 |
亚信科技 |
亚信科技控股有限公司 |
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) Duckduckgo_search: https://github.com/deedy5/duckduckgo_search.git