概念解释

Routing By Semantic Similarity(基于语义相似性的路由)是一种利用自然语言处理(NLP)技术来理解用户查询意图并根据语义相似度进行信息分发的机制。这种方法通过计算用户输入与预定义类别或目标之间的语义相关性,自动将请求路由到最合适的处理单元或服务。

技术原理

  1. 语义嵌入:使用预训练的语言模型(如BERT、GPT或Sentence-BERT)将文本转换为高维向量表示
  2. 相似度计算:采用余弦相似度、欧几里得距离等度量方法评估查询与目标之间的语义距离
  3. 路由决策:设置相似度阈值或采用top-k选择策略确定最佳匹配目标

典型应用场景

  • 客服系统:自动将客户问题分类并路由到相应领域的客服专员
  • 搜索引擎:根据查询语义调整搜索策略和结果排序
  • API网关:理解API请求意图并路由到合适的微服务
  • 内容推荐:基于用户输入内容推荐语义相关的产品或信息

实现步骤

  1. 预定义目标类别或服务终端
  2. 为每个目标生成代表性语义嵌入(可通过示例文本聚合)
  3. 实时处理用户查询并生成查询向量
  4. 计算查询与所有目标的相似度分数
  5. 根据相似度分数和业务规则进行路由决策
  6. 可选地记录路由结果用于后续模型优化

优势与挑战

优势

  • 减少对精确关键词匹配的依赖
  • 能够理解同义词和表述变体
  • 适应自然语言表达的多样性

挑战

  • 需要高质量的语义模型和训练数据
  • 相似度阈值设置需要领域知识
  • 可能产生语义模糊情况下的误路由

性能优化方向

  1. 领域适配:在特定领域数据上微调语义模型
  2. 混合策略:结合语义相似度与传统规则引擎
  3. 动态学习:根据用户反馈持续优化路由策略
  4. 缓存机制:对高频查询建立快速匹配通道

实战代码示例

问题背景

平常我们设计程序的时候,会使用if-else进行精确匹配,如type.equals("吃饭")。此时如果type传入的不是预期值,程序就无法处理。借助大模型的推理能力,可以帮助理解用户的问题,并推理出对应的方案。

安装依赖

pip install --upgrade --quiet  langchain-core langchain langchain-openai

代码实现

from langchain.utils.math import cosine_similarity
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnableLambda, RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings


# 定义物理模板
physics_template = """You are a very smart physics professor. \
You are great at answering questions about physics in a concise and easy to understand manner. \
When you don't know the answer to a question you admit that you don't know.

Here is a question:
{query}"""

# 定义数学模板
math_template = """You are a very good mathematician. You are great at answering math questions. \
You are so good because you are able to break down hard problems into their component parts, \
answer the component parts, and then put them together to answer the broader question.

Here is a question:
{query}"""

# 初始化嵌入模型
embeddings = OpenAIEmbeddings()

# 将模板转换为向量
prompt_templates = [physics_template, math_template]
prompt_embeddings = embeddings.embed_documents(prompt_templates)


# 定义路由函数
def prompt_router(input):
    # 对用户查询进行嵌入
    query_embedding = embeddings.embed_query(input["query"])
    # 计算与所有模板的相似度
    similarity = cosine_similarity([query_embedding], prompt_embeddings)[0]
    # 选择最相似的模板
    most_similar = prompt_templates[similarity.argmax()]
    print("Using MATH" if most_similar == math_template else "Using PHYSICS")
    return PromptTemplate.from_template(most_similar)


# 构建链
chain = (
    {"query": RunnablePassthrough()}
    | RunnableLambda(prompt_router)
    | ChatOpenAI()
    | StrOutputParser()
)

# 测试
message1 = chain.invoke("What is the speed of light?")
print(f"message1: {message1}")

message2 = chain.invoke("什么是微积分?")
print(f"message2: {message2}")

运行结果

Using PHYSICS
message1: The speed of light is approximately 299,792,458 meters per second, which is the fastest speed at which any object can travel in the universe. It is a fundamental constant of nature and is denoted by the letter "c" in physics equations.
Using MATH
message2: 微积分是数学中的一个分支,主要涉及研究函数的变化率和积分。它可以用来解决许多实际问题,例如物理学、工程学和经济学等领域的问题。微积分可以帮助我们理解和描述物体的运动、变化和增长等现象。在微积分中,常用的概念包括导数、极限、积分和微分方程等。