需求痛点
私有知识很多,如何让大模型只选择跟问题有关的知识进行参考呢?
需求分析
是否可以使用关键词匹配呢?以前的搜索主要使用关键词匹配,这个要求太高了,需要提前抽取准备好关键词,有点像以前SEO的工作。现在是国际化社会,大模型对语言应是无感知理解的,也就是说用户使用英文或中文提问时,它的语义理解应是一样的,要脱离语言本身,看内涵,跨语言、跨表达的习惯,直击这句话的本质,所以我们使用语义化匹配。
实现思路
将私有资料,按逻辑、互相独立的单元来分段;
使用模型将每段知识的核心信息抽取出来,变成向量;
将这些知识片段及其向量存到向量数据库,如chromadb向量数据库;
将用户提的问题转化为向量,去向量数据库中进行相似度匹配,寻找答案。
设置Prompt提示词,让结果更符合预期。
工作流程:
用户提一个问题,把问题通过向量化模型变成一个向量,再使用这个向量到向量库中,查找最相似的上下文,接着把问题和检索到的上下文一起交给模型,让模型回答问题。
这里可能会有一个问题,比如你已经在库里检索到答案了,为何还要让大模型生成答案呢?因为检索出来的结果,有些高度相关,有些低相关,而且比较长,不一定符合预期的格式,需要自己加工。大模型帮我们快速筛选和判断,然后通过prompt设置的格式来综合整理,生成最终的结果。
项目数据
数据集:招股说明书,80个PDF文件
数据集下载地址:https://www.modelscope.cn/datasets/BJQW14B/bs_challenge_financial_14b_dataset/summary
实现效果示例:
用户提问:景顺长城中短债债券C基金在20210331的季报里,前三大持仓占比的债券名称是什么?
回答:景顺长城中短债债券C在20210331的季报中,前三大持仓占比的债券名称分别是21国开01、20农发清发01、20国信03。
提问:上海华铭智能终端设备股份有限公司的首发战略配售结果如何?
回答:上海华铭智能终端设备股份有限公司的首发战略配售具体情况并未在招股意向书中详细说明。
项目实现
1. 规划工程文件
金融问答系统项目涉及前端、后端、数据集和模型等,本文只探讨RAG部分,暂不做前端UI交互。
项目目录规划:
SmartFinance \
|- app \ # 该目录用于服务端代码
|- conf \
|- .qwen # 配置API KEY
|- dataset \ # 该目录存放数据集
|-pdf \ # 该目录存放PDF文件
|- rag \ # 该目录用于保存 rag 相关代码
|- chroma_conn.py # 管理ChromaDB数据库,如添加文档和查询等操作
|- pdf_processor.py # 实现PDF文件加载、文本切分和向量存储等操作
|- rag.py # 实现检索功能
|- test_framework.py # 测试功能
|- utils \ # 该目录用于存放工具配置类文件
|- util.py # 加载连接大模型
2. 实现基本连接大模型的 util 库
代码文件及目录:app/utils/util.py
# 导入必要的库
from dotenv import load_dotenv # 用于加载环境变量
import os # 用于操作文件路径
# 获取当前文件所在的目录
current_dir = os.path.dirname(__file__)
# 构建到 conf/.qwen 的相对路径
# 这里通过 os.path.join 拼接路径,确保跨平台兼容性
conf_file_path_qwen = os.path.join(current_dir, '..', 'conf', '.qwen')
# 加载 .qwen 文件中的环境变量
# dotenv_path 参数指定了环境变量文件的路径
load_dotenv(dotenv_path=conf_file_path_qwen)
def get_qwen_models():
"""
加载通义千问系列的大模型,包括 LLM、Chat 和 Embedding 模型。
"""
# 加载 LLM 大模型(语言生成模型)
# 使用 Tongyi 类来实例化一个通义千问模型
from langchain_community.llms.tongyi import Tongyi
llm = Tongyi(
model="qwen-max", # 指定模型类型为 qwen-max,适合复杂任务
temperature=0.1, # 控制输出的随机性,值越低越保守
top_p=0.7, # 核采样参数,控制生成文本的多样性
max_tokens=1024 # 最大生成的 token 数量
)
# 加载 Chat 大模型(对话模型)
# 使用 ChatTongyi 类来实例化一个通义千问对话模型
from langchain_community.chat_models import ChatTongyi
chat = ChatTongyi(
model="qwen-max", # 指定模型类型为 qwen-max,适合高质量对话
temperature=0.01, # 温度更低以获得更确定的回复
top_p=0.2, # 控制对话生成的多样性
max_tokens=1024 # 最大生成的 token 数量
)
# 加载 Embedding 大模型(嵌入模型)
# 使用 DashScopeEmbeddings 类来实例化一个通义千问嵌入模型
from langchain_community.embeddings import DashScopeEmbeddings
embed = DashScopeEmbeddings(
model="text-embedding-v3" # 指定嵌入模型版本
)
# 返回加载的三个模型
return llm, chat, embed