Annuaire d'articles
Points douloureux
Les personnes qui ne connaissent pas les sociétés Internet l'imaginent souvent comme un processus interne ultra-moderne, où tout est automatisé, atteignant le niveau d'un film de science-fiction ; mais ceux qui sont dans l'industrie depuis plusieurs années apprécieront l'automatisation des processus. En réalité, en raison de facteurs tels que des calendriers de construction serrés, des habitudes historiques et des coûts de mise en œuvre, un grand nombre d'opérations manuelles sont conservées dans le processus.
Prenant l'exemple du processus de service DoD (Dev on duty) de Shopee, le style de conception des microservices système, chaque équipe de développement est responsable de la maintenance d'un des modules, et une page perçue par l'utilisateur peut correspondre à de nombreux modules d'arrière-plan (il existe plusieurs groupe de développement). En tant qu'entreprise multinationale, l'activité de Shopee est dispersée dans de nombreux pays. Les opérateurs de tous les pays ne sont pas très familiers avec cette division du travail, et souvent le premier appel sera erroné. Bien que nous stipulions que le premier groupe d'appel est responsable de la transmission des demandes d'assistance, mais Cela retarde souvent le temps, en particulier en service tard dans la nuit, lorsque les gens doivent être réveillés pour découvrir que la personne n'est pas responsable ; ou en service pendant la période de promotion, un tel transfert prend également du temps, et une minute de retard entraînera une perte de XXXXXX yuans.
Origine du projet
Afin de résoudre ce problème, nous avons compilé manuellement un ppt de 200 pages, qui présentait en détail le processus DoD et la division du travail. Mais le problème est que cet ensemble de ppt est coûteux à expliquer, et l'effet n'est pas bon, surtout lorsque des équipes transfrontalières sont impliquées, ainsi que la traduction, l'organisation de la formation et d'autres choses.
Avec la popularité de chatgpt cette année, nous avons commencé à envisager d'utiliser l'intelligence artificielle pour répondre au premier appel des employés de première ligne qui ont trouvé des problèmes, réduire les coûts de formation ppt, réduire les taux d'erreur et être en mesure de traduire automatiquement les langues. C'est-à-dire que les capacités suivantes finiront par trouver automatiquement l'équipe responsable correspondante :
- compétence interlinguistique
- Capacité à comprendre la sémantique floue
- 推理能力
考虑到企业信息安全,根据Shopee的指引,这套系统必须部署在企业内部。
技术选型
要实现如上系统,考虑有两套技术方案:
fine-tuning
用白话说是在chatgpt等巨人的肩膀上,采用标准模型,加上自己数据,自己炼丹。
大模型训练结束后,参数固定,模型内部蕴含的知识也固定。想要让模型增加知识,可以通过微调改变模型参数实现。
微调是以预训练LLM为基底,预训练模型是在大量通用数据集上训练,微调则是在少量特定领域数据集上训练,通过较低的成本获取特定领域的知识。
具体微调流程为:构建微调数据集 → SFT(supervised fine tuning,有监督微调) → RLHF(reinforcement learning & human feedback)
该方案优点是模型对领域知识理解更正确,效果更好;缺点是需要开源模型,需要收集数据并进行加工,微调大模型也需要较高的显卡成本,总体来说成本较高,且微调后模型推理效果不能保证。
few shot prompt engineering
用白话说就是直接chatgpt等LLM本身,但是其缺乏企业内部知识(比如那个200页的ppt),怎么办呢?就是采用langchain等编程手段,在对话上下文中提供信息。
Dans l'article gpt-2 d'openAI, il est défini que LLM est essentiellement un apprentissage à quelques coups/zéro coup, qui a une forte capacité de généralisation.
Il suffit de clarifier clairement le contexte dans l'invite (invite), même si les connaissances pertinentes ne sont pas contenues dans l'ensemble de formation, le modèle peut correctement comprendre et analyser le contexte.
Le processus spécifique est le suivant : construction d'une base de connaissances externe → appariement des connaissances pertinentes → construction rapide en quelques coups de feu → raisonnement LLM. L'avantage
de cette solution est qu'elle ne nécessite pas de formation et qu'elle a une forte évolutivité. Mauvaise compréhension des connaissances externes, construction d'une base de connaissances nécessite un certain coût, etc.
Les deux solutions ont leurs avantages et leurs inconvénients, mais la première option est plus chère.A cette époque, Shopee, la réduction des coûts était le programme primordial, donc après un examen technique, la deuxième option a été adoptée sans aucun suspense. Donc, si un nouveau venu me demande quelle est la sélection de la technologie, je pense que je devrais lui rappeler de ne pas se laisser berner par le nom.Dans de nombreux cas, des facteurs autres que la technologie déterminent la sélection.
Caractérisation des options sélectionnées
LLM est sans état. Ce fichier de modèle pèse moins de 10 Go et ne peut être lu que dans le conteneur. En théorie, bien que le processeur soit consommé, le conteneur peut être mis à l'échelle pour garantir un temps de réponse pendant les heures de pointe.
Fondamentalement, il s'agit d'une application back-end, construite avec python ou golang, utilisant des fichiers de bibliothèque pour appeler localement le grand modèle de langage LLM et ouvrir l'API de l'interface http pour que l'appelant puisse l'utiliser Créer une nouvelle application, soumettre le code à gitlab et déployez-le avec
CICD
cheval de course modèle
Une fois le plan 2 déterminé, quel LLM utiliser ? C'est là que la vraie technologie joue un rôle décisionnel. Nous avons constitué une équipe et recruté des collègues intéressés par l'IA et le LLM. Chacun apporte son propre LLM optimiste. Allouer ressources informatiques à chaque personne,
et enfin utiliser les données pour voir quel LLM a de meilleures performances et moins de performances réelles de consommation
Nom | Modèle | caractéristiques | matériel |
---|---|---|---|
zézhou | chatgpt2 (découvert plus tard); gpt4all hors ligne | gratuit, exécution locale, aucun GPU requis | https://gpt4all.io/index.html https://github.com/nomic-ai/gpt4all |
jinhao | chatGLM | https://github.com/imClumsyPanda/langchain-ChatGLM/blob/master/docs/INSTALL.md | |
Faire du Zouxuan | FLAN T-5 | https://medium.com/@koki_noda/try-language-models-with-python-google-ais-flan-t5-ba72318d3be6 | |
Yunyuan Yu | Alpaga | https://beebom.com/how-run-chatgpt-like-language-model-pc-offline/ | |
Finalement, après comparaison, il a été décidé d'utiliser gpt4all |
réglage gpt4all
Cette partie comparera certains détails techniques, impliquant des pièges lors du déploiement et du réglage de l'exécution. Si les collègues du produit veulent uniquement regarder l'effet, ils peuvent passer directement à la dernière partie.
Montez sur la fosse lors du déploiement
Lorsque j'ai utilisé chatgpt2 pour la première fois, j'ai constaté qu'il ne pouvait pas être installé, j'ai donc finalement décidé d'utiliser gpt4all. La raison est que python
le problème de version
chatgpt-2 est un projet il y a n ans, donc le tensorflow utilisé est l'ancienne version 1.15, et j'ai 3.11 sur la machine maintenant, je ne peux installer que le dernier tensorflow et le résultat est une erreur, donc l'environnement python est très important,
tout le monde Pendant l'expérience, vous pouvez utiliser pyenv pour installer chaque version de py2 à py3 sur votre machine mac
l'en-tête python3.9 est manquant - installez simplement celui qui manque
La plus critique des informations suivantes est Python.h
Aucun fichier de ce type
Exécution de setup.py install for regex … erreur ERREUR
: Commande erronée avec l'état de sortie 1 :
commande : /data/venv-gpt-2/bin/python3 -u -c 'import sys, setuptools, tokenize ; sys.argv[0] = '"'"'/tmp/pip-install-yz_lezij/regex/setup.py'“'”'; file ='“'”'/tmp/pip-install-yz_lezij/regex/setup.py'“'”';f=getattr(tokenize, '"'“'open'”'“', open)( file ) ;code=f.read().replace('"'"'\r\n'“'”', '"'"'\n'“'”');f.close();exec(compile( code, fichier , '"'"'exec'"'"'))' install --record /tmp/pip-record-inx4miu7/install-record.txt --single-version-externally-managed --compile -- en-têtes d'installation /data/venv-gpt-2/include/site/python3.9/regex
Plus tard, recherchez stackoverflow, vous pouvez également demander à chatgpt, installez simplement la partie manquante
Réglage des paramètres d'exécution
普通4核服务器上运行很慢,只能每次回答单个人问题,还要等个20秒。于是参考gpt4all官方文档,从如下方面入手调整:
- CPU核数加大,实测16核情况下,可以在5秒内出答案,基本符合了应用需求
- 限制回答长度,我们的需求简单,只要回答团队名称就可以,减少长度可以显著提升速度
- 优化程序结构,预加载
- 流式输出(提升了用户体验,但是没有缩短时间)
- prompt工程,因为我们需求单一,就是弄清楚是哪个team来解决DoD问题,所以团队资料部分可以写死代码中加载
代码分析
项目代码
项目最核心的代码脱敏后示例如下(部分变量和文件重命名了):
from langchain.document_loaders import UnstructuredMarkdownLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma
from langchain.llms import GPT4All
from langchain.chains import RetrievalQA
import time
from flask import Flask, request
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
app = Flask(__name__)
markdown_path = "./test.md"
loader = UnstructuredMarkdownLoader(markdown_path)
documents = loader.load()
print("loaded documents")
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1024, chunk_overlap=64)
texts = text_splitter.split_documents(documents)
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
db = Chroma.from_documents(texts, embeddings, persist_directory="db")
print("embeddings")
callbacks = [StreamingStdOutCallbackHandler()]
model_path = "/data/gpt4all/ggml-gpt4all-j-v1.3-groovy.bin"
llm = GPT4All(model=model_path, n_ctx=128, backend="gptj", verbose=False, n_threads=15, callbacks=callbacks, n_predict=48)
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=db.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True,
verbose=False,
)
def print_hi(question):
res = qa(question)
print("answer")
print(time.time())
print(res["result"])
return res["result"]
@app.route('/', methods=['POST'])
def echo():
data = request.get_data(as_text=True)
print(data)
res = print_hi(data)
return res
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
app.run(host='0.0
库代码
代码中使用了langchain和llama,趁项目机会,分析其核心功能代码:
接口名 | 功能 | 开源替代 |
---|---|---|
/v1/embeddings | 提取文本片段的特征 | HuggingfaceEmbedding |
/v1/completions | 补齐文本,回答问题 | chatGLM |
为什么要有embeddings接口?物有异名
,最早marketing的搜索,是精确匹配到关键字,但是自然语言是丰富多样的,比如我要找一下气质"自然淡雅"的衣服,正好衣服广告词中也有这几个字,于是能匹配,但是用户也可能会用"小清新"去搜索,就搜索不到了。所以embeddings接口是通过"名"提取出"物"
具体算法参考:
https://time.geekbang.org/column/article/644795 有了 OpenAI 的 Embedding 接口,我们就可以把一段文本的语义表示成一段向量。而向量之间是可以计算距离的,如果向量距离少于某个阈值,就认为这两个名指的是同一个物
物有异名
应对方案:
- 通过维护一个同义词表,好处是实现简单,坏处是维护麻烦
- 通过调用本地的embedding库 HuggingfaceEmbedding (比起推理,embedding其实要简单点,具备本地运行的可能)
效果展示
例子1
curl -X POST -d "according to the test.md, if I can not arrange shipment, which API may I refer to?" http://localhost:5000
If you are unable to arrange shipment for an order, you can refer to the API `/api/v2/logistic/ship_order` to initiate logistics for the order. This API will allow you to arrange pickup, drop
例子2
if I want to arrange shipment, which API should I call?
To arrange shipment, you should call the api/v2/logisticsship\_order/ship\_order. Use this api to initiate logistics including arrange pickup, dropoff or shipment for non-integrated logistic channels.
Here's an example of how to call the api/v2/logisticsship\_order/ship\_order API to initiate shipment logistics:
POST /api/v2/logisticsship_order/ship_order
{ "address": "123 Main St", "pickup_address": "456 Smith Ave", "dropoff_address": "789 Baker Ave", "pickup_time": "11:00", "dropoff_time": "14:00", "pickup_method": "Livraison standard", "dropoff_method": "Livraison express" }
Note: This is just an example and the actual implementation may vary based on the 3PL service provider and the requirements of your shipment logistics. It is always recommended to consult with your 3PL service provider or contact their support team for specific assistance.
Annexe : Exemples de documents API internes à l'entreprise utilisés :
#api/v2/logistics/get_shipping_parameter
Use this api to get the parameter "info_needed" from the response to check if the order has pickup or dropoff or no integrate options. This api will also return the addresses and pickup time id options for the pickup method. For dropoff, it can return branch id, sender real name etc, depending on the 3PL requirements.
#/api/v2/logistics/ship_order
Use this api to initiate logistics including arrange pickup, dropoff or shipment for non-integrated logistic channels. Should call v2.logistics.get_shipping_parameter to fetch all required param first. It's recommended to initiate logistics one hour after the orders were placed since there is one-hour window buyer can cancel any order without request to seller.
#/api/v2/logistics/create_shipping_document
Use this api to create shipping document task for each order or package and this API is only available after retrieving the tracking number.