编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

LLM技术研究:将 LLM 代理部署到生产中的挑战

wxchong 2024-07-23 21:37:58 开源技术 15 ℃ 0 评论

将大型语言模型 (LLM) 代理部署到生产环境中是复杂且多方面的。

1. 可靠性:信任的基础

想象一下,当你踏上旅程时,地图每次查看都会发生变化。这就是不可靠的 LLM 代理给企业带来的感受。确保这些代理的可靠性至关重要,因为企业希望获得一致、高质量的性能。许多企业的目标是“五个九”(99.999%)的正常运行时间,但 LLM 代理往往难以保持一致性,导致输出可能需要频繁的人工监督。

大多数公司都追求高可靠性,通常满足于 99% 的正常运行时间,但 LLM 代理通常可实现约 60-70% 的可靠性。这种不一致性需要不断的人工监督,这违背了自动化的目的。实现更高的可靠性需要强大的测试和验证框架。

理解挑战

绩效变化: LLM 可能无法预测,由于其输出的随机性,通常会产生不一致的结果。这对于需要高精度和一致性的任务来说可能是个问题。例如,代理可能前一刻正确处理客户支持查询,后一刻却提供不相关的响应?。

上下文管理:在长时间交互或多个会话中保持上下文是一项挑战。LLM 可能会失去对对话流程的跟踪,从而导致不相关或不正确的响应。这个问题在客服人员需要记住先前交互的客户服务应用程序中尤为明显。

工具集成:许多 LLM 代理依赖外部工具来执行特定任务,例如数据库查询或 Web 搜索。这些工具之间的有效集成和无缝切换对于可靠的性能至关重要。代理可能需要从 CRM 系统获取数据、处理数据,然后响应查询 — 所有这些都不会丢失上下文。

提高可靠性的策略

稳健测试:实施模拟真实场景的广泛测试制度。这有助于在部署之前识别和解决潜在问题。回归测试等技术可以确保新更新不会引入新错误。

正如本文 ( Analytics Vidhya ) 所解释的,我们可以创建一个幻觉检查器,它将根据检索到的上下文是否用于生成最终响应来给出是或否的答案。

### Hallucination Grader

# Data model
class GradeHallucinations(BaseModel):
    """Binary score for hallucination present in generation answer."""

    binary_score: str = Field(
        description="Answer is grounded in the facts, 'yes' or 'no'"
    )


# Preamble
preamble = """You are a grader assessing whether an LLM generation is grounded in / supported by a set of retrieved facts. \n
Give a binary score 'yes' or 'no'. 'Yes' means that the answer is grounded in / supported by the set of facts."""

# LLM with function call
llm = ChatCohere(model="command-r", temperature=0)
structured_llm_grader = llm.with_structured_output(
    GradeHallucinations, preamble=preamble
)

# Prompt
hallucination_prompt = ChatPromptTemplate.from_messages(
    [
        # ("system", system),
        ("human", "Set of facts: \n\n {documents} \n\n LLM generation: {generation}"),
    ]
)

hallucination_grader = hallucination_prompt | structured_llm_grader
hallucination_grader.invoke({"documents": docs, "generation": generation})

我们还可以通过答案评分器进一步检查,以通过 LLM 模型检查生成的答案是否与问题相关。

# Data model
class GradeAnswer(BaseModel):
    """Binary score to assess answer addresses question."""

    binary_score: str = Field(
        description="Answer addresses the question, 'yes' or 'no'"
    )


# Preamble
preamble = """You are a grader assessing whether an answer addresses / resolves a question \n
Give a binary score 'yes' or 'no'. Yes' means that the answer resolves the question."""

# LLM with function call
llm = ChatCohere(model="command-r", temperature=0)
structured_llm_grader = llm.with_structured_output(GradeAnswer, preamble=preamble)

# Prompt
answer_prompt = ChatPromptTemplate.from_messages(
    [
        ("human", "User question: \n\n {question} \n\n LLM generation: {generation}"),
    ]
)

answer_grader = answer_prompt | structured_llm_grader
answer_grader.invoke({"question": question, "generation": generation})

增强反馈机制:结合反馈循环,根据实时数据持续监控和调整代理的表现。ReAct 和 Reflexion 等方法通过迭代思考、行动和观察周期帮助 LLM 改进。

性能监控工具:利用监控代理性能的工具,提供需要改进的领域的见解。这可以包括实时仪表板和警报系统,以快速解决出现的任何可靠性问题。例如,使用向量存储来有效地管理数据可以帮助快速准确地检索相关信息,确保代理在不同场景中保持可靠性。

2. 处理过多循环:打破循环

在这个挑战中,您可能会觉得自己被困在迷宫中,无休止地循环而找不到出路。代理可能会陷入类似的循环,反复无法获得令人满意的结果。实施设置最大重试次数和使用超时机制等机制可以防止这些无限循环并节省资源。

由于工具出现故障或 LLM 决定重复执行任务,代理经常会陷入循环。这可能会变得成本高昂且效率低下,尤其是对于昂贵的模型。缓解这种情况的策略包括限制重试次数和实施超时机制。

处理过多循环的方法:

重试限制和超时:防止代理陷入循环的主要方法之一是设置最大重试次数并实施超时机制。这可确保如果代理在规定的尝试次数内未能获得令人满意的结果,它会停止尝试并节省计算资源。

任务执行管理:利用高级任务执行管理策略,例如 CrewAI 提供的策略。可以配置 max_iter(最大迭代次数)和 max_execution_time(最大执行时间)等属性,以限制代理在停止之前执行任务的时间。

高级监控和调试:AgentOps 等工具提供全面的监控和调试功能。AgentOps 可以跟踪会话重播、监控成本和令牌使用情况,并识别导致无限循环的递归思维模式。这使开发人员能够更有效地查明并解决这些循环的根本原因??。

代码示例:实现具有最大重试限制的重试机制

下面是一个示例,说明如何在 Python 中实现重试机制,通过设置最大重试限制和使用超时来处理过多循环:

import time

def call_agent_with_retry(agent, input_data, max_retries=5, timeout=2):
    attempts are 0
    while attempts < max retries:
        try:
            result = agent(input data)
            return result
        except Exception as e:
            attempts += 1
            time.sleep(timeout)
            if attempts >= max retries:
                raise e

# Usage
result = call_agent_with_retry(my agent function, "input data")

CrewAI 中的示例配置

在 CrewAI 中,您可以通过设置特定属性来定制代理以有效地处理循环:


from crewai import Agent
agent = Agent(
 role='Data Analyst',
 goal='Extract actionable insights',
 max_iter=10, # Limits to 10 iterations to prevent infinite loops
 max_execution_time=60, # Limits execution time to 60 seconds
 verbose=True
)

通过结合这些策略并利用 AgentOps 和 CrewAI 的配置选项等高级工具,您可以显著减少代理陷入过度循环的可能性,从而提高 LLM 部署的效率和可靠性。

3. 工具定制:打造完美指南针

通用工具可能无法满足您的应用程序的特定需求。就像探险家根据特定地形定制装备一样,定制这些工具可以显著提高性能。开发专门的数据抓取工具或集成针对特定任务定制的精确 API 可以提高代理的效率。

LangChain 等框架中的工具通常过于通用。自定义工具来处理特定的输入和输出至关重要。例如,自定义工具可以管理数据提取、操作和 LLM 准备。

代码示例:

使用 BeautifulSoup 创建自定义网页抓取工具:

import requests
from bs4 import BeautifulSoup

def custom scraper(url):
    response = requests get(url)
    soup = BeautifulSoup(response text, 'html.parser')
    
    # Custom scraping logic
    data = {
        "title": soup find('title').text,
        "links": [a['href'] for a in soup find all('a', href=True)]
    }
    return data

# Usage
scraped data = custom scraper('https://example.com')

4. 自我检查机制:导航员之眼

实施自检机制可确保生成的输出正确且有用。这对于生成代码或处理需要特定条件的数据的应用程序尤其重要。这就像让导航员仔细检查每一步以确保您保持航向。

代理需要验证其输出。对于代码生成,这可能涉及运行单元测试。对于其他输出,它可能涉及检查数据的有效性或正确性。

代码示例:

使用 exec 生成代码的自检查机制:

def self check code(code):
    try:
        exec(code, {})
        return True
    except Exception as e:
        return False

# Usage
generated code = """
def example function():
    return "Hello, World!"
"""

if self check code(generated code):
    print("Code is valid")
else:
    print("Code is invalid")

5. 可解释性:指南日志

可解释性对于用户信任至关重要。用户需要了解代理做出特定决定或产生特定输出的原因。为数据和代理行为背后的原因提供清晰的解释或引证可增强对系统的信心。

可解释性涉及记录代理的决策过程。这有助于用户理解做出某些决定的原因,从而增加对系统的信任。

代码示例

记录 LLM 所做决定的解释:

import logging

logging basicConfig(level=logging.INFO)

def explainable agent(input data):
    explanation = f"Received input: {input data}"
    logging info(explanation)
    
    # Generate output
    output = "Generated output"
    
    explanation += f" | Generated output: {output}"
    logging info(explanation)
    
    return output, explanation

# Usage
output, explanation = explainable agent("Sample input")
print("Output:", output)
print("Explanation:", explanation)

6. 安全与合规:守护之盾

部署 LLM 带来了独特的安全挑战。强大的访问控制、定期的安全审计和持续监控对于保护敏感数据和保持法规合规性至关重要。

7. 延迟和性能优化:快速路径

延迟可能是一个重大障碍,尤其是在实时应用中。数据、张量、管道和混合并行等技术可以帮助优化性能。此外,量化等模型压缩技术可以减少内存需求并提高效率。

解决方案:语义缓存

语义缓存可通过存储和重复使用类似查询的响应来显著减少延迟并提高性能。这种方法可以减少冗余 API 调用的数量并降低计算开销。

代码示例

使用 GPTCache 进行语义缓存:

from gptcache import Cache, Config
from gptcache embedding import Onnx
from gptcache manager import manager factory
from gptcache similarity evaluation import Onnx Model Evaluation
from gptcache processor pre import last content

# Initialize cache
openai cache = Cache()
encoder = Onnx()
sqlite faiss data manager = manager factory(
    "sqlite, faiss",
    data dir="openai cache",
    scalar params={"sql url": "sqlite:///./openai cache.db", "table name": "openai chat"},
    vector params={"dimension": encoder dimension, "index file path": "./openai chat faiss.index"},
)
onnx evaluation = Onnx Model Evaluation()
cache config = Config(similarity threshold=0.75)

openai cache init(
    pre func=last content,
    embedding=encoder,
    data manager=sqlite faiss data manager,
    evaluation=onnx evaluation,
    config=cache config
)

# Function to use cached response
def get response with cache(question):
    response = openai Chat Completion create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": question}],
        cache obj=openai cache,
    )
    return response["choices"][0]["message"]["content"]

# Example usage
question = "What is GitHub?"
response = get response with cache(question)
print(response)

8. 成本管理:财富守护者

部署 LLM 需要大量资源且成本高昂。优化硬件使用、巧妙利用云计算资源以及高效调度和批处理模型请求有助于管理成本。

解决方案:语义缓存以降低成本

语义缓存还可以通过最大限度地减少 API 调用次数来帮助降低成本,从而节省计算和带宽费用。

结论

将 LLM 代理部署到生产中是一项多方面的挑战,需要解决可靠性问题、处理过多的循环、自定义工具以及实施强大的监控和反馈机制。通过了解这些常见问题并采用有效的策略,您可以提高 LLM 部署的性能和可靠性,确保它们满足生产环境中预期的高标准。随着人工智能和 CrewAI 和 AgentOps 等工具的不断进步,管理这些挑战变得越来越可行,为更高效、更可靠的人工智能解决方案铺平了道路。

参考

[1]https://levelup.gitconnected.com/challenges-of-deploying-llm-agents-into-production-a-comprehensive-guide-f750c1a2d810

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表