**处理高基数类别的查询分析:方法与挑战**

77 阅读2分钟
## 引言

在执行查询分析时,特别是针对类别列创建过滤器时,高基数的类别可能会带来挑战。通常需要指定确切的类别值,但当有效值数量较大时,确保语言模型(LLM)精确生成这些值变得困难。本篇文章将探讨处理高基数类别查询分析的有效方法。

## 主要内容

### 安装依赖

要开始,我们需要安装必要的Python包:

```bash
# %pip install -qU langchain langchain-community langchain-openai faker langchain-chroma

环境变量设置

我们将使用OpenAI API:

import getpass
import os

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

数据准备

生成一些假名以进行示例:

from faker import Faker

fake = Faker()
names = [fake.name() for _ in range(10000)]

print(names[0])
# 输出示例:'Hayley Gonzalez'

查询分析设置

我们设置一个基础查询分析:

from langchain_core.pydantic_v1 import BaseModel

class Search(BaseModel):
    query: str
    author: str

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

system = """Generate a relevant search query for a library system"""
prompt = ChatPromptTemplate.from_messages(
    [("system", system), ("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

处理高基数问题

方法一:添加所有可能值

在提示中添加所有有效值:

system = """Generate a relevant search query for a library system.

`author` attribute MUST be one of:

{authors}

Do NOT hallucinate author name!"""
base_prompt = ChatPromptTemplate.from_messages(
    [("system", system), ("human", "{question}")]
)
prompt = base_prompt.partial(authors=", ".join(names))

当类别列表过长时,可能会导致上下文长度超出限制。

方法二:使用索引查找相关值

通过创建索引找到最相关的值:

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_texts(names, embeddings, collection_name="author_names")

def select_names(question):
    _docs = vectorstore.similarity_search(question, k=10)
    _names = [d.page_content for d in _docs]
    return ", ".join(_names)

根据查询找到最相关的作者。

方法三:选择后替换

让LLM选择一个值,然后用有效值替换:

from langchain_core.pydantic_v1 import validator

class Search(BaseModel):
    query: str
    author: str

    @validator("author")
    def double(cls, v: str) -> str:
        return vectorstore.similarity_search(v, k=1)[0].page_content

这种方法能有效纠正拼写错误。

常见问题和解决方案

  1. 上下文长度限制:通过使用更大的模型或缩短输入文本来解决。
  2. 拼写错误处理:使用搜索索引来找到最接近的匹配值。

总结和进一步学习资源

在处理高基数类别时,我们需要综合使用索引、过滤和替换策略以提高准确性。推荐阅读LangChain文档和Chroma库以获取更多信息。

参考资料

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

---END---