写点什么

大模型时代下的企业系统架构变革

作者:蔡超
  • 2023-06-05
    北京
  • 本文字数:4732 字

    阅读完需:约 16 分钟

大模型时代下的企业系统架构变革

1 引言

ChatGPT 这款由 OpenAI 开发的大语言模型(Large Language Model, LLM)GPT 构建的聊天机器人,现在无疑是全球最热门的话题。如今,LLM 及其相关项目已经被大量用于处理人们的日常任务并取得惊人的效果,如:辅助文档编写,问题回答,程序开发等。于此同时,我们也非常期待能用 LLM 的超能力来变革现有企业应用。

近期,我们构建了基于 LLM 的 DevOps Copilot,通过与公司内部的 DevOps 平台整合。借助于 LLM 的推理能力,DevOps Copilot 可以根据故障工单或告警信息,获取相关的 metrics, log 和人工评论等数据来提供有效的建议,甚至解决方案(如脚本和代码),实现与工程师持续协同工作。在 LLM 的智能加持下,日常运维工作正在进一步被简化及自动化,在释放研发团队的生产力的同时也提高了问题处理的效率。

通过这次 LLM 的实践,我们总结发现了一些要在企业应用中有效使用 LLM 必须要应对的挑战:

  1. 获取实时事件/信息:LLM 是基于历史数据进行训练的,这限制了它们处理与最新信息相关的查询的能力。

  2. 与环境交互:例如:使 LLM 能够执行诸如运行 shell 命令或调用 API 等任务,这些任务会影响您的环境。

  3. 整合企业内部数据:LLM 没有使用您组织的内部数据进行训练,这会影响其相关性和准确性。


2 企业应用大模型相关挑战的解决方案

下面我将以 GPT 为例,讲述如何利用几种关键机制或方案来解决上面提到的企业应用大模型的挑战。

2.1 让大模型学会使用工具

对于引言部分中提到的挑战 1,2,作为开发人员最本能的思路就是让 LLM 通过调用 API 来获取实时数据/事件,以及通过 API 来和外部环境交互。这里的问题就是我们要让大模型知道:

  • 有哪些工具可以用,并且这些工具能够用来完成什么样的任务

  • 在推理(Reasoning)过程中正确的使用这些工具,并可以将通过工具获得的信息应用于推理过程。


下面我们借助 LangChain 来实现这些,当然,你也可以自己实现,有关详细的原理可以参考我前面的文章让GPT学会使用工具,拓展技能

下面是一个利用 LangChain 来获取实时信息的例子

(最近 OpenAI 已经让可以 ChatGPT 通过插件接入 Internet,目前只对 ChatGPT Plus 用户开放,以下例子不涉及任何插件的使用。)

def query_google(question):    template = """Between >>> and <<< are the raw search result text from google.    Extract the answer to the question '{query}' or say "not found" if the information is not contained.    Use the format    Extracted:<answer or "not found">    >>> {requests_result} <<<    Extracted:"""    PROMPT = PromptTemplate(        input_variables=["query", "requests_result"],        template=template,    )    inputs = {        "query": question,        "url": "https://www.google.com/search?q=" + question.replace(" ", "+")    }    requests_chain = LLMRequestsChain(llm_chain=LLMChain(llm=llm, prompt=PROMPT), output_key="query_info")    res = requests_chain.run(inputs)    print("res=", res)    return restools = [    Tool(        name="Get current info", func=query_google,        description="""invoke it for when you need to answer questions about current info.         And the input should be a search query.""")]agent = initialize_agent(tools, llm, agent="zero-shot-react-description", max_iterations=3, verbose=True)print(agent.run("What is appropriate to wear in Beijing today?"))
复制代码

(完整的例子:https://github.com/chaocai2001/llm_in_enterpise/blob/main/examples.ipynb )

通过使用方法(工具)“query_google”,GPT 可以获取当前天气信息并提供服装推荐。为 GPT 集成各种工具,就可以增强和拓宽它的能力。LangChain 本身也已经提供了很多有价值的工具,可以参考 LangChain 的文档。

同样,可以用以上方法获取您的环境中的实时事件。例如,利用此机制允许 GPT 访问系统事件和 Metrics。以下是一个例子;为了简洁起见,我省略了从环境中检索事件和 Metrics 的代码。


def get_recent_pod_errors(service_name):    # get the related pod errors with service name    return """Failed to pull image "mobvista/docker/dsp:latest"""tools = [    Tool(        name="Get pod error", func=get_recent_pod_errors,        description="""invoke it for when you need to check the problem of the service.         And the input should be service name.""")]agent = initialize_agent(tools, llm, agent="zero-shot-react-description", max_iterations=3, verbose=True)print(agent.run("What is your suggestions for fixing the DSP service problem?”))
复制代码

下面是执行以上代码后的输出。

Entering new AgentExecutor chain...I need to know the problem with the DSP service first.Action: Get pod errorAction Input: DSP serviceObservation: Failed to pull image "mobvista/docker/dsp:latestThought:The issue seems to be related to pulling the image for the DSP service. I need to suggest a solution to fix this problem.Thought: I now know the final answerFinal Answer: To fix the DSP service problem, try the following steps: 1) Check the Docker registry credentials and ensure you have access to "mobvista/docker/dsp:latest" image. 2) Verify that the image name and tag are correct. 3) Ensure your Docker daemon has access to the internet to pull the image. 4) If the problem persists, you may need to contact the image maintainers for assistance.> Finished chain.To fix the DSP service problem, try the following steps: 1) Check the Docker registry credentials and ensure you have access to "mobvista/docker/dsp:latest" image. 2) Verify that the image name and tag are correct. 3) Ensure your Docker daemon has access to the internet to pull the image. 4) If the problem persists, you may need to contact the image maintainers for assistance.
复制代码

从此输出中,您应该已经发现了 GPT 的推理(Reasoning)和操作(Acting)的过程及步骤。这里你一定很好奇这个过程,我们将在下一节中来讨论这个问题。

小结:

我们可以为 GPT 提供一个工具列表。对于每个工具,我们应该提供:

  • 工具实现

  • 概述该工具的功能以及何时使用它

  • 调用工具所需的输入

2.2 引导 GPT 进行逻辑推理

LLM 在语言理解和内容创建任务方面展示了令人印象深刻的能力;另一方面,经过仔细观察和深入思考,你会发现他拥有同样惊人的推理能力。

要理解 LLM 的推理能力,我们先看下面的例子。


从上面和 ChatGPT 的对话中我们可以发现,虽然 GPT 无法获取当前天气,进而无法回答这个问题,但仍然可以看出一个推理过程。我们甚至可以通过诸如“让我们一步步思考”之类的提示使这个过程更加显现。



现在,我们可以清楚地看到推理过程和涉及的步骤。

有时候,我们希望 GPT 能够按照我们的引导进行思考,比如解决上一节遗留的问题,让 GPT 在推理过程中正确使用工具,获取信息,解决用户问题。得益于 LLM 的语言理解能力和学习能力,我们可以通过为 LLM 提供一些例子来实现这一点,而无需复杂的训练过程,这被称为 few-shot learning。详细内容可以参考我的另一篇文章 构建基于大模型的自治智能应用--ReAct 模式

通过上面示例可以看到在 LangChain Agent 中 GPT 被引导遵循 ReAct(Reasoning + Acting)模式来逐步解决用户问题。LangChain 的 ReAct 模式涉及迭代思考,每次迭代包括三个步骤:Thought-Action-Observe。

- Thought:描述你对用户问题的想法

- Action:运行其中一种工具

- Observe:运行工具的结果

Observe 又用于下一个“Thought”步骤,“Thought”将检查用户的问题是否已解决;如果没有,迭代将继续。

在这里 ( https://github.com/hwchase17/langchain/tree/master/langchain/agents/react ) 可以找到 LangChain 中的通过 few-shot learning 引导 GPT ReAct 过程的提示词。

为了应对不同的情况,ReAct 迭代的步骤可能会有所不同,例如,AutoGPT 使用更复杂的 ReAct 迭代构建,如“Thoughts-Reasoning-Plan-Criticism”。我们同样可以通过给定一些示例,用 few-shot learning 来引导 GPT 按这个复杂的过程思考

2.3 利用内部数据

为了使 GPT 能够有效地应用于企业特定场景,整合内部数据和信息就是必须的。以下是实现这一目标的三种可能的解决方案:

  • 在 Prompt 中包含内部数据并与用户请求一起发送:由于 API 输入令牌限制和传入数据成本的考虑,此方法仅适用于小型数据集。

  • 使用内部数据微调(fine tuning)模型:此方案成本最高:

    涉及有效构建数据集等准备工作。

    微调成本(涉及了微调费用及微调模型的使用费用,参考 OpenAI 服务相关的成本)通常更高。

    由于缺乏透明度,衡量和改进微调结果具有更高的挑战性。

  • 为 GPT 提供一个工具,该工具可以访问内部数据并使用 GPT 创建的查询获取相关部分,结合前面提到的 ReAct 模式。这种方式一般来说性价比更高,适用于大部分场景。

考虑到这些因素,大多数场景推荐使用方案 3,即允许 GPT 与本地数据查询一起工作。

对于文本数据查询,可以采用 Elasticsearch 等传统 indexing 方法。然而,这些方法只支持精确的词搜索而不是语义搜索。为了提高语义搜索的性能,embedding 可以用作 indexing 的替代方法。OpenAI 为此提供了一个 embedding API。

API 由于收到 token 数的限制,如果要 embedding 大型数据集,首先应将数据分成较小的部分并分别 embedding。然后可以将生成的 vector 存储在矢量数据库中,例如 Chroma、Pinecone 或 FAISS。这些数据库提供了更好的性能,并为企业特定的应用程序提供了语义检索功能。



图 1:LLM 利用 VectorDB 访问内部数据

以下示例演示了使用 LangChain 的实现。LangChain 为各种矢量数据库提供了一个抽象层,可以很容易地在它们之间无缝切换。

# Embedded the content and store them into VectorDBloader = UnstructuredMarkdownLoader("maxlang.md")documents = loader.load()text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)split_docs = text_splitter.split_documents(documents)embeddings = OpenAIEmbeddings(deployment="embedding",chunk_size=1)docsearch = Chroma.from_documents(split_docs, embeddings)# Query the vectors qa = RetrievalQA.from_chain_type(llm=llm, chain_type="map_reduce", retriever=docsearch.as_retriever(),return_source_documents=True)result = qa({"query": "how to extract the attribute value from json string"})print(result[“result”])
复制代码

(完整的例子参见:https://github.com/chaocai2001/llm_in_enterpise/blob/main/examples.ipynb

为了进一步简化不同数据源的向量化任务,值得尝试一下开源项目 LlamaIndex,它封装了 LLM 访问外部数据源的整个过程。LlamaIndex(以前称为 GPT Index)是一个开源项目,它在 LLM 和外部数据源(如 API、PDF、SQL 等)之间提供一个简单的接口。

3 最后

综合前面关于在 LLM 在企业应用的挑战和解决方案,这里我提出一个基于大模型构建企业应用的参考架构(Adaptive LLM Enterprise Architecture (ALEA))。ALEA 着眼解决企业应用在 LLM 中共同挑战,有着很强的扩展性和适应性。



图 2:Adaptive LLM Enterprise Architecture (ALEA)

通过该架构使企业系统充分利用大模型的优势来提升企业应用系统的智能化及自动化程度,从而简化流程并提高整体生产力,并增强用户体验。


欢迎大家通过我的微信公众号(“蔡超谈软件”)来交流和探讨。


发布于: 2023-06-05阅读数: 37
用户头像

蔡超

关注

程序员是我的终身职业 2017-10-19 加入

蔡超,SpotMax创始人,Mobvista 集团副总裁/首席架构师,前亚马逊(中国)首席架构师,前HP(中国)软件架构师

评论

发布
暂无评论
大模型时代下的企业系统架构变革_AI_蔡超_InfoQ写作社区