# 引言
在进行查询分析时,常常需要对分类列进行过滤。然而,当这些分类属性的值有很高基数时,确切地生成这些值变得异常困难。本文将探讨如何在这种情况下有效地进行查询分析,并提供一个示例代码来演示不同的解决策略。
# 主要内容
## 高基数分类的问题
当涉及到高基数分类时,挑战在于需要准确地指定具体的分类值。然而,生成这些值在上下文限制下变得困难,有时甚至不可能,因为模型可能无法关注到所有的值。
## 基线查询分析设置
我们将使用LangChain库设置一个基础的查询分析系统,使用OpenAI的API来生成相关的搜索查询。
```python
from langchain_core.pydantic_v1 import BaseModel
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
class Search(BaseModel):
query: str
author: str
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
添加所有可能的值
一种直接的方法是将所有可能的值添加到提示中,以指导模型生成准确的查询。然而,当值过多时,可能会超过上下文限制。
try:
res = query_analyzer_all.invoke("what are books about aliens by jess knight")
except Exception as e:
print(e) # 通常的错误是上下文长度超出限制
通过索引选择相关值
我们可以创建一个索引来对相关值进行排序,并查询最相关的值。这是通过创建向量存储来实现的。
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)
选择后替换
另一种方法是先让模型生成某个值,再通过相似性搜索将其转换为有效值。
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
代码示例
上述内容展示了如何设置和处理高基数分类属性。完整代码示例如下:
corrective_structure_llm = llm.with_structured_output(Search)
corrective_query_analyzer = (
{"question": RunnablePassthrough()} | prompt | corrective_structure_llm
)
corrective_query_analyzer.invoke("what are books about aliens by jes knight")
# Result: Search(query='books about aliens', author='Jesse Knight')
常见问题和解决方案
- 上下文长度限制: 当列举值过多时,可能会超过模型的上下文长度。在这种情况下,使用向量索引等方法进行筛选是一个有效解决方案。
- 错误生成的值: 可以通过后处理步骤,利用相似性搜索来校正生成的值。
总结和进一步学习资源
通过理解和应用不同的方法,我们可以有效地处理高基数分类问题。推荐进一步学习LangChain的文档以深入了解其功能和使用。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---