目录

第一章 客户经理小李的 “查档难题”

第二章 小周的 “代码诊断”:找到系统的 “一根筋” 毛病

第三章 给系统加 “追问魔法”:小周的代码改造记

第一步:给系统找 “翻译官”—— 初始化大模型

第二步:给追问 “记台账”—— 配置回调管理器

第三步:让系统学会 “多角度问”—— 创建多查询检索器

第四章 魔法生效:小李的 “检索惊喜”

第五章 背后的 “技术小秘密”:简单改造的大作用

第六章 尾声:越来越 “懂” 用户的系统

第七章 示例代码


第一章 客户经理小李的 “查档难题”

        浦发银行西安分行的客户经理小李,最近总被一个问题困扰 —— 查《客户经理考核办法》时,系统像个 “认死理” 的老会计,只认用户输入的字面意思,稍微换个说法就找不到东西。

        上周三,小李想确认 “业绩怎么折算成考核分”,他在系统搜索框里敲下 “客户经理的考核标准是什么?”,等了几秒,系统只返回了 2 个文档:一个讲 “客户经理收入由基本收入、业绩奖励、绩效收入组成”,另一个提 “考核分影响评优”,可他最需要的 “50 万储蓄等于多少考核分”,连影子都没有。

        “总不能每次都抱着几百页的手册翻吧?” 小李揉着酸胀的眼睛,拨通了 IT 部小周的电话,“小周,你能不能看看系统?我查‘考核标准’,怎么连业绩折算的规则都搜不出来啊?”

第二章 小周的 “代码诊断”:找到系统的 “一根筋” 毛病

        小周挂了电话,立刻登录系统后台查日志。他发现,当前的检索逻辑特别简单 —— 就像给系统一个 “关键词清单”,只有文档里包含完全匹配的关键词,才会被找出来。

        他打开系统的核心检索代码一看,果然如此:原来的代码里,用户输入 “客户经理的考核标准是什么?” 后,系统只会用这一句话生成向量,去 FAISS 向量数据库里匹配文档。那些写着 “绩效评估标准”“业绩指标折算” 的文档,因为关键词不一样,全被过滤掉了。

        “问题就出在‘查询太单一’!” 小周在笔记本上画了个图:用户的查询是 “苹果”,系统就只找标着 “苹果” 的货架,却忽略了 “红富士”“嘎啦果” 其实也是苹果。要解决这个问题,得让系统学会 “多角度追问”—— 同一个需求,用几个相近的说法去检索。

第三章 给系统加 “追问魔法”:小周的代码改造记

        小周想起之前学过的 LangChain “MultiQueryRetriever” 工具,就像给系统配了个 “智能翻译官”,能把一个查询变成多个意思相近的 “追问”。他决定按这个思路改造代码,分三步动手:

第一步:给系统找 “翻译官”—— 初始化大模型

        小周先给系统装上了 “通义千问”(qwen-max)大模型,让它负责把单一查询变成多个追问。代码里这部分很关键:

# 初始化大语言模型(相当于“翻译官”)
llm = Tongyi(
    model_name="qwen-max",
    dashscope_api_key='*********'
)

        “这个‘翻译官’得懂银行术语,通义千问能准确把‘考核标准’翻译成‘绩效评估’‘业绩指标’这些相近说法。” 小周边写代码边嘀咕。

第二步:给追问 “记台账”—— 配置回调管理器

        光有追问还不够,小周担心万一某个追问出问题,没法追溯原因。他给系统加了个 “查询台账本”(CallbackManagerForRetrieverRun),每个追问都生成唯一的 “身份证”(run_id),还让 “日志小助手”(StdOutCallbackHandler)记录每一步操作:

# 生成追问的“身份证”和“台账本”
run_id = uuid.uuid4()  # 每个查询的唯一标识,像身份证
handlers = [StdOutCallbackHandler()]  # 日志小助手,记录追问过程
inheritable_handlers = []  # 可继承的配置,暂时留空

run_manager = CallbackManagerForRetrieverRun(
    run_id=run_id,
    handlers=handlers,
    inheritable_handlers=inheritable_handlers
)

“这样不管哪个追问出问题,查台账就知道是哪一步漏了。” 小周满意地点点头。

第三步:让系统学会 “多角度问”—— 创建多查询检索器

        最后,小周把 “翻译官” 和 “台账本” 装进了 “多查询检索器”(MultiQueryRetriever),让系统能自动生成追问、多维度检索:

# 创建“多查询检索器”,相当于给系统加“追问魔法”
retriever = MultiQueryRetriever.from_llm(
    retriever=vectorstore.as_retriever(),  # 向量数据库的检索入口
    llm=llm  # 刚才配置的“翻译官”大模型
)

# 生成追问清单
generated_queries = retriever.generate_queries(query, run_manager)

写完这行代码,小周试运行了一下 —— 当输入 “客户经理的考核标准是什么?” 时,系统果然生成了 3 个追问:

  1. 客户经理的绩效评估标准有哪些?
  2. 客户经理的工作表现如何进行衡量?
  3. 考核客户经理业绩的主要指标是什么?

“完美!这样系统就能从‘考核标准’‘绩效评估’‘业绩指标’三个角度找文档了。” 小周兴奋地敲了下回车。

第四章 魔法生效:小李的 “检索惊喜”

        第二天一早,小周把优化后的系统交给小李测试。小李半信半疑地打开搜索框,还是输入那句 “客户经理的考核标准是什么?”。

几秒钟后,屏幕上先弹出了 “追问清单”:

原始查询: 客户经理的考核标准是什么?
生成的查询变体:
1. 客户经理的绩效评估标准有哪些?  
2. 客户经理的工作表现如何进行衡量?  
3. 考核客户经理业绩的主要指标是什么?

        紧接着,系统返回了 5 个文档。小李一眼就看到了之前找不到的内容 —— 文档 2 里写着 “超出最低考核标准可相互折算,折算标准:50 万储蓄 = 50 万个贷 = 50 张有效卡 = 5 分(折算以 5 分为单位)”。

        “找到了!终于找到了!” 小李激动地给小周发消息,“原来系统会自己多问几个角度,连业绩折算的细节都搜出来了,再也不用翻手册了!”

        他接着看其他文档,连 “中级客户经理需要完成季新增发放个贷”“客户经理等级分助理、普通、高级、资深四级” 这些之前没注意到的规则,也都清清楚楚列在结果里。

第五章 背后的 “技术小秘密”:简单改造的大作用

小李后来专门找小周吃饭,问他:“你这改的啥魔法啊?怎么突然能搜全了?”

小周笑着解释:“其实没那么复杂,核心就三件事:第一,让系统学会‘换说法’,用大模型生成相近的追问;第二,给每个追问‘记台账’,方便查问题;第三,多维度检索后合并结果,不漏掉任何相关内容。”

他指着代码里的关键部分说:“你看,生成追问靠的是 MultiQueryRetriever 和 llm 配合,记录过程靠的是 run_manager,最后用 retriever.invoke (query) 把所有结果汇总,再去重 —— 就像你找东西时,既问‘我的钥匙在哪’,又问‘我的银色钥匙在哪’,还问‘我昨天放桌上的钥匙在哪’,这样自然能找得更全。”

小李听完恍然大悟:“原来技术优化不是越复杂越好,能解决实际问题的,才是好办法!”

第六章 尾声:越来越 “懂” 用户的系统

现在,浦发银行的客户经理们查考核规则时,再也不用因为 “关键词不对” 发愁了。系统会自动生成 3-4 个追问,把所有相关的文档都找出来,甚至还会按相关性排序,最关键的内容排在最前面。

小周也在系统里加了个 “反馈按钮”—— 如果客户经理觉得某个追问没用,或者漏了某个角度,就能提建议。他说:“技术优化不是一劳永逸的,得跟着用户的需求慢慢调,让系统越来越‘懂’大家的想法。”

而小李呢,现在不仅自己爱用新系统,还经常跟新来的客户经理说:“查规则的时候不用纠结怎么措辞,系统会帮你多问几个角度,比老员工还靠谱!”

第七章 示例代码

import os
import uuid  # 新增:用于生成run_id
from langchain.retrievers import MultiQueryRetriever
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.llms import Tongyi
from langchain.callbacks import StdOutCallbackHandler  # 补充导入
from langchain_core.callbacks import (
    AsyncCallbackManagerForRetrieverRun,
    CallbackManagerForRetrieverRun,
)
# 初始化大语言模型
DASHSCOPE_API_KEY = os.getenv("DASHSCOPE_API_KEY")
llm = Tongyi(
    model_name="qwen-max",
    dashscope_api_key='sk-***'
)

# 创建嵌入模型
embeddings = DashScopeEmbeddings(
    model="text-embedding-v3",
    dashscope_api_key='sk-***'
)

# 加载向量数据库,添加allow_dangerous_deserialization=True参数以允许反序列化
vectorstore = FAISS.load_local("./vector_db", embeddings, allow_dangerous_deserialization=True)

# 创建MultiQueryRetriever
retriever = MultiQueryRetriever.from_llm(
    retriever=vectorstore.as_retriever(),
    llm=llm
)

# 示例查询
query = "客户经理的考核标准是什么?"
# 关键修正:正确初始化run_manager
run_id = uuid.uuid4()  # 生成唯一运行ID
handlers = [StdOutCallbackHandler()]  # 回调处理器(打印日志到控制台)
inheritable_handlers = []  # 可继承的处理器(默认空)

run_manager = CallbackManagerForRetrieverRun(
    run_id=run_id,
    handlers=handlers,
    inheritable_handlers=inheritable_handlers
)
generated_queries = retriever.generate_queries(query,run_manager)
print("原始查询:", query)
print("生成的查询变体:")
for i, q in enumerate(generated_queries):
    print(f"{i+1}. {q}")

# 执行查询
results = retriever.invoke(query)

# 打印结果
print(f"查询: {query}")
print(f"找到 {len(results)} 个相关文档:")
for i, doc in enumerate(results):
    print(f"\n文档 {i+1}:")
    print(doc.page_content[:200] + "..." if len(doc.page_content) > 200 else doc.page_content)

原始查询: 客户经理的考核标准是什么?

生成的查询变体:

         1. 客户经理的绩效评估标准有哪些?

         2. 客户经理的工作表现如何进行衡量?

        3. 考核客户经理业绩的主要指标是什么?

查询: 客户经理的考核标准是什么?

找到 5 个相关文档:

        文档 1: 百度文库 - 好好学习,天天向上 -7 入围,并由所在行制定临时奖励办法。 第七章 考核待遇 第十五条 个人金融业务客户经理的收入基本由三部分组成: 客 户经理等级基本收入、业绩奖励收入和日常工作绩效收入。 客户经理等级基本收入是指客户经理的每月基本收入, 基本分为 助理客户经理、客户经理、高级客户经理和资深客户经理四大层面, 在每一层面分为若干等级。 客户经理的...

        文档 2: 4.个贷业务(季新增发放个贷)为中级以上客户经理考核进入的最低标准。 5.超出最低考核标准可相互折算,折算标准: 50万储蓄 =50万个贷 =50张有效卡 =5分(折算以 5分为单位)

...

第六条 个金客户经理的基本职责: (一) 客户开发。研究客户信息、联系与选择客户、与客户建 立相互依存、相互支持的业务往来关系,扩大业务资源,创造良好业 绩...

Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐