一、环境1、api去阿里百炼、注册、获取apihttps://bailian.console.aliyun.com/api环境变量我这里依旧使用conda环境conda create -n rag_agent python3.10 -y conda activate rag_agent#设置api环境变量形式设置环境变量 conda env config vars set OPENAI_API_KEYsk-a4372xxafbac6e90681a conda env config vars set DASHSCOPE_API_KEYsk-a4xx8cafbac6e90681a 执行后会提示 To make your changes take effect please reactivate your environment。 重新激活环境使变量生效 conda deactivate conda activate rag_agent 验证变量是否生效 在 PowerShell 中查看 $env:OPENAI_API_KEY $env:DASHSCOPE_API_KEY 在 Python 中验证确保使用该环境的 Python python -c import os; print(os.getenv(OPENAI_API_KEY)); print(os.getenv(DASHSCOPE_API_KEY))文件形式安装 python-dotenv pip install python-dotenv 在项目根目录创建 .env 文件内容 OPENAI_API_KEYsk-a4372xxx8cafbac6e90681a DASHSCOPE_API_KEYsk-a437xxx098cafbac6e90681a 在 Python 代码中加载 from dotenv import load_dotenv import os # 使用绝对路径指定 .env 文件 env_path rF:\26_01\AI大模型RAG与Agent智能体项目实战开发\python\RAG_agent\.env load_dotenv(dotenv_pathenv_path) # overrideTrue 强制覆盖已有变量 print(os.getenv(OPENAI_API_KEY)) print(os.getenv(DASHSCOPE_API_KEY))配置清华镜像源pip config set global.trusted-host pypi.tuna.tsinghua.edu.cn该命令会自动创建或修改 pip 配置文件。二、OpenAI库1、介绍OpenAI库是OpenAI官方推出的Python SDK,核心作用是让开发者能简单、高效地调用 OpenAI 的各类 API(如 GPT 聊天、DALL·E 绘图、语音转文字等),无需手动处理 HTTP 请求、身份验证等底层细节。由于其发布较早且比较易用,现如今许多模型服务商(如阿里云百炼平台)均兼容OpenAI SDK的调用。2、使用、流程主要是用如上2个参数· api_key模型服务商提供的API KEY密钥· base_url模型服务商的API接入地址· 主要基于此参数来切换不同的模型服务商如OpenAI、阿里云、腾讯云等client.chat.completions.create 创建 ChatCompletion 对象主要参数有 2 个● model选择所用模型如代码的 qwen3-max● messages提供给模型的消息messages 详情​类型list可以包含多个字典消息每个字典消息包含 2 个 keyrole角色content内容角色说明​system 角色设定助手的整体行为、角色和规则为对话提供上下文框架如指定助手身份、回答风格、核心要求是全局的背景设定影响后续所有交互。assistant 角色代表 AI 助手的回答可以在代码中预先设定。user 角色代表用户发送问题、指令或需求。可以通过print(response.choices[0].message.content)输出模型给出的回答信息3、简单代码3.1 api使用主要就3个流程· 创建客户端对象OpenAI类对象· 和模型对话client.chat.completions.create可以提供3个角色使用·system设定模型的行为和规则·assistant设定模型的回答由用户设定·user用户的提问· 处理结果response.choices[0].message.contentfrom dotenv import load_dotenv from openai import OpenAI env_path rF:\26_01\AI大模型RAG与Agent智能体项目实战开发\python\RAG_agent\.env load_dotenv(dotenv_pathenv_path) # overrideTrue 强制覆盖已有变量 # 1. 获取client对象OpenAI类对象 client OpenAI( base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1 ) # 2. 调用模型 response client.chat.completions.create( modelqwen3-max, messages[ {role: system, content: 你是一个Python编程专家并且不说废话简单回答}, {role: assistant, content: 好的我是编程专家并且话不多你要问什么}, {role: user, content: 输出1-10的数字使用python代码} ] ) # 3. 处理结果 print(response.choices[0].message.content)3.2 流式输出from openai import OpenAI from dotenv import load_dotenv env_path rF:\26_01\AI大模型RAG与Agent智能体项目实战开发\python\RAG_agent\.env load_dotenv(dotenv_pathenv_path) clinet OpenAI( base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1 ) response clinet.chat.completions.create( modelqwen3-max, messages[ {role: system, content: 你是一个Python编程专家并且是话痨}, {role: assistant, content: 好的我是编程专家并且话不多你要问什么}, {role: user, content: 输出1-10的数字使用python代码} ], stream True #流式输出 ) # print(response.choices[0].message.content) for i in response: if i.choices[0].delta.content: print(i.choices[0].delta.content,flushTrue,end ) #end分割符flush 立刻刷新缓存3.3 历史消息调用模型传入的参数messages,其要求是list对象,即表明其支持非常多的消息在内。我们可以基于此,将历史消息填入,让模型知晓对话的上下文,更好的回答三、Prompt Engineering提示词工程了解什么是提示词工程、 掌握提示工程的设计技巧1、概念就是提问技巧提示工程(Prompt Engineering),也称为 In-Context Prompting,是指在不更新模型权重的情况下如何与大模型交互 以引导其行为以获得所需结果的方法。在人工智能领域,Prompt指的是用户给大型语言模型发出的指令。·例如,“「讲个笑话」、“「用Python编个贪吃蛇游戏」”、”「写封情书」等。虽然看似简单,但实际上,Prompt的设计对于模型的结果影响很大。因此如何设计prompt,进而与模型更好的交互,是研究人员必备的必不可少的技能(提示工程)。2、技巧任何Prompt技巧,都不如清晰的表达你的需求。这就类似人与人沟通,如果话说不明白,不可能让别人理解你的思想。因此, 写出清晰的指令,是核心。技巧1:详细的描述技巧2:让模型充当某个角色技巧3:使用分隔符标明输入的不同部分 中括号、XML标签、三引号等分隔符可以帮助划分要区别对待的文本,也可以帮助模型更好的理解文本内容。常用把内 容框起来技巧4:对任务指定步骤 对于可以拆分的任务可以尽量拆开,最好能为其指定一系列步骤,明确步骤可以让模型更容易实现它们。技巧5:提供例子本质类似于few-shot Leaning。先扔给大模型举例,然后让模型按照例子来输出技巧6:提供参考文本降低幻觉3、案例· 了解案例的背景和整体任务 、掌握Zero-shot、Few-shot的思想3.1 背景当前金融领域信息化发展的时代金融数据大量激增许多投资者和研究者试图通过对这些数据进行深度分析而获得一些有效的决策和帮助尽可能减少决策失误带来的损失。所以针对金融数据的分析方法研究是目前十分有益且热门的话题。当前案例主要有三大业务场景实现基于大模型完成金融文本分类基于大模型完成金融文本信息抽取基于大模型完成金融文本匹配大模型选择Qwen在线大模型阿里云通义千问 qwen3-max采用方法基于Few-Shot Zero-Shot​ 的思想设计 prompt提示词进而应用大模型完成相应的任务3.2Zero-ShotZero-shot学习(Zero-shot Learning)是指在训练阶段不存在与测试阶段完全相同的类别,但是模型可以使用训练过的知识 来推广到测试集中的新类别上。这种能力被称为“零样本”学习,因为模型在训练时从未见过测试集中的新类别,在模型训练和提示词优化中均有体现。应用场景模型训练已知特征马四脚兽、虎有条纹、熊猫黑白色的特征但未训练过斑马的数据。告知模型斑马是四脚兽、有黑白色的条纹。模型能力模型可以在已知数据中进行推理从而识别斑马。提示词优化核心思想基于模型已训练的能力不提供任何示例仅通过语言描述任务的要求、目标和约束让模型直接生成结果。简单概括用语言定义任务解放信任模型的预训练知识。示例请判断“”包围的用户评论中的情感倾向输出正面或负面。“这款代餐鸡胸肉饱腹感很强吃起来也不柴很推荐”3.3Few-Shot定义Few-shot Learning少样本学习当模型在学习了一定类别的大量数据后对于新的类别只需要少量样本就能快速学习。One-shot learning单样本学习​ 是样本少到只有1个的特例。应用场景模型训练相似度判断方法基于少量企鹅样本并结合相似度判断模型可以推论出未知图片中包含“企鹅”。图示说明一个支持集Support Set包含三类动物企鹅/Penguin、鹈鹕/Pelican、海鹦/Puffin的示例图片。通过相似度函数Similarity Function计算查询图片Query Image与支持集中各类别的相似度分数Similarity Scores最终预测其类别Predicted Class为相似度最高如0.71的“企鹅”。提示词优化核心思想基于少量示例让模型参考示例的格式和逻辑进行回答。简单概括用示例定义任务在模型的预训练知识基础上提升模型回答的对齐精度如格式一致性。示例请抽取产品名称和核心卖点2个字段格式为Json我提供2个示例。示例1MacBookPro高效节能性能强大适合牛马工作使用输出{“产品名称”“MacBookPro”“产品卖点”“高效节能性能强大”}示例2联想笔记本拥有RTX4060独立显卡畅玩游戏丝滑流畅输出{“产品名称”“联想笔记本”“产品卖点”“畅玩游戏丝滑流畅”}请处理华为MatepadPro高清大屏长效续航你的好帮手。输出{“产品名称”“华为MatepadPro”“产品卖点”“高清大屏长效续航”}3.4 文本介绍下面几段文本来自某平台发布的金融领域文本1.今日央行发布公告宣布降低利率以刺激经济增长。这一降息举措将影响贷款利率并在未来几个季度内对金融市场产生影响。,2.ABC公司今日发布公告称已成功完成对XYZ公司股权的收购交易。本次交易是ABC公司在扩大业务范围、加强市场竞争力方面的重要举措。据悉此次收购将进一步巩固ABC公司在行业中的地位并为未来业务发展提供更广阔的发展空间。详情请见公司官方网站公告栏,3.公司资产负债表显示公司偿债能力强劲现金流充足为未来投资和扩张提供了坚实的财务基础。,4.最新的分析报告指出可再生能源行业预计将在未来几年经历持续增长投资者应该关注这一领域的投资机会,我们的目的是期望模型能够帮助我们识别出这4段话中每一句话描述的是一个什么类型的报告。即期望的输出结果为[新闻报道, 公司公告, 财务公告分析师报告]3.5 prompt 提示词设计对于大模型来讲prompt的设计非常重要一个明确的prompt能够帮助我们更好从大模型中获得我们想要的结果。在该任务的prompt设计中我们主要考虑2点•需要向模型解释什么叫作「文本分类任务」•需要让模型按照我们指定的格式输出为了让模型知道什么叫做「文本分类」我们借用FewShot的方式给模型展示一些正确的例子User: 今日股市经历了一轮震荡受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的政策调整以适应市场的不确定性。是[新闻报道, 公司公告, 财务公告分析师报告]里的什么类别Bot:新闻报道User: 本公司年度财务报告显示去年公司实现了稳步增长的盈利同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略执行为公司的健康发展奠定了基础。是[新闻报道, 公司公告, 财务公告分析师报告]里的什么类别Bot:财务报告其中User代表我们输入给模型的句子Bot代表模型的回复内容。注意上述例子中Bot的部分也是由人工输入的其目的是希望看到在看到类似User中的句子时模型应当做出类似Bot的回答。from openai import OpenAI from dotenv import load_dotenv load_dotenv(rF:\26_01\AI大模型RAG与Agent智能体项目实战开发\python\RAG_agent\.env) # 1. 获取client对象OpenAI类对象 client OpenAI( base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1 # base_urlhttp://localhost:11434/v1 ) examples_data { # 示例数据 新闻报道: 今日股市经历了一轮震荡受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的政策调整以适应市场的不确定性。, 财务报告: 本公司年度财务报告显示去年公司实现了稳步增长的盈利同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略执行为公司的健康发展奠定了基础。, 公司公告: 本公司高兴地宣布成功完成最新一轮并购交易收购了一家在人工智能领域领先的公司。这一战略举措将有助于扩大我们的业务领域提高市场竞争力, 分析师报告: 最新的行业分析报告指出科技公司的创新将成为未来增长的主要推动力。云计算、人工智能和数字化转型被认为是引领行业发展的关键因素投资者应关注这些趋势 } # 分类列表 # examples_types [新闻报道, 财务报道, 公司公告, 分析师报告] # 提问数据 questions [ 今日央行发布公告宣布降低利率以刺激经济增长。这一降息举措将影响贷款利率并在未来几个季度内对金融市场产生影响。, ABC公司今日发布公告称已成功完成对XYZ公司股权的收购交易。本次交易是ABC公司在扩大业务范围、加强市场竞争力方面的重要举措。据悉此次收购将进一步巩固ABC公司在行业中的地位并为未来业务发展提供更广阔的发展空间。详情请见公司官方网站公告栏, 公司资产负债表显示公司偿债能力强劲现金流充足为未来投资和扩张提供了坚实的财务基础。, 最新的分析报告指出可再生能源行业预计将在未来几年经历持续增长投资者应该关注这一领域的投资机会, 小明喜欢小新哟 ] [ {role: system, content: 你是金融专家将文本分类为[新闻报道, 财务报道, 公司公告, 分析师报告]不清楚的分类为不清楚类别 下面有示例}, {role: user, content: 今日央行发布公告宣布降.............}, {role: assistant, content: 新闻报道}, {role: user, content: ABC公司今日发布公告称已成功完成对XYZ公司股.................}, {role: assistant, content: 财务报告}, {role: user, content: 公司资产负债表显示公司偿债能力强劲现金流充足...................}, {role: assistant, content: 公司公告}, {role: user, content: 最新的分析报告指出可再生能源.............}, {role: assistant, content: 分析师报告}, {role: user, content: 要提问的问题} ] messages [ {role: system, content: 你是金融专家将文本分类为[新闻报道, 财务报道, 公司公告, 分析师报告]不清楚的分类为不清楚类别 下面有示例}, ] for key, value in examples_data.items(): messages.append({role: user, content: value}) messages.append({role: assistant, content: key}) # 向模型提问 for q in questions: response client.chat.completions.create( modelqwen3-max, # modelqwen3:4b, messagesmessages [{role: user, content: f按照示例回答这段文本的分类类别{q}}] ) print(response.choices[0].message.content)4、JSON数据格式JSONJavaScript Object Notation是一种轻量级的数据交换格式易于人阅读和编写同时也易于机器解析和生成。Json是带有格式的字符串主要用于数据交换即程序和程序之间的信息互传使用Json会更加方便如下示例Python中使用Json主要完成•将Python字典、列表转换为Json字符串•读取Json字符串转换为Python字典或列表•主要使用Python内置的json库•json.dumps(字典或列表,ensure_asciiFalse)将字典或列表转换为Json字符串•ensure_ascii参数确保中文能正常显示•返回值Json字符串•json.loads(json字符串)将Json字符串转换为Python字典或列表返回值Python字典 或Python列表5、LLM实现金融文本匹配5.1 彩票样例代码from openai import OpenAI from dotenv import load_dotenv import json load_dotenv(rF:\26_01\AI大模型RAG与Agent智能体项目实战开发\python\RAG_agent\.env) client OpenAI( base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1 ) schema [期数, 中奖号码, 一等奖] examples_data [ { content: 2025100期双色球开奖号码为红球 1, 3, 6, 11, 21, 22蓝球 7一等奖中出 2 注。, answers: { 期数: 2025100, 红球: 1,3,6,11,21,22, 蓝球: 7, 一等奖注数: 2注 } }, { content: 2025101期双色球开奖号码为红球 3, 5, 7, 11, 12, 16蓝球 11一等奖中出 3 注。, answers: { 期数: 2025101, 红球: 3,5,7,11,12,16, 蓝球: 11, 一等奖注数: 3注 } } ] questions [ # 提问问题 2025年第100期开好红球22 21 06 01 03 11 篮球 07一等奖中奖为2注。, 2025101期有3注1等奖10注2等奖开号篮球11中奖红球3、5、7、11、12、16。 ] messages [ {role: system, content: f你帮我完成信息抽取我给你句子你抽取{schema}信息按JSON字符串输出如果某些信息不存在用原文未提及表示请参考如下示例} ] for example in examples_data: messages.append( {role: user, content: example[content]} ) messages.append( {role: assistant, content: json.dumps(example[answers], ensure_asciiFalse)} ) for q in questions: response client.chat.completions.create( modelqwen3-max, messagesmessages [{role: user, content: f按照上述的示例现在抽取这个句子的信息{q}}] ) print(response.choices[0].message.content)5.2 是 or 不是在该任务的prompt设计中我们主要考虑2点•需要向模型解释什么叫作「文本匹配任务」•需要让模型按照我们指定的格式输出为了让模型知道什么叫做「文本匹配任务」我们借用FewShot的方式先给模型展示几个正确的例子User:句子一:公司ABC发布了季度财报显示盈利增长。\n句子二:财报披露公司ABC利润上升Bot:是User:句子一:黄金价格下跌投资者抛售。\n句子二:外汇市场交易额创下新高Bot:不是...其中User代表我们输入给模型的句子Bot代表模型的回复内容。注意上述例子中Bot的部分也是由人工输入的其目的是希望看到在看到类似User中的句子时模型应当做出类似Bot的回答。from openai import OpenAI from dotenv import load_dotenv load_dotenv(rF:\26_01\AI大模型RAG与Agent智能体项目实战开发\python\RAG_agent\.env) client OpenAI( base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1 # base_urlhttp://localhost:11434/v1 ) examples_data { 是: [ (公司ABC发布了季度财报显示盈利增长。, 财报披露公司ABC利润上升。), (公司ITCAST发布了年度财报显示盈利大幅度增长。, 财报披露公司ITCAST更赚钱了。) ], 不是: [ (黄金价格下跌投资者抛售。, 外汇市场交易额创下新高。), (央行降息刺激经济增长。, 新能源技术的创新。) ] } questions [ (利率上升影响房地产市场。, 高利率对房地产有一定的冲击。), (油价大幅度下跌能源公司面临挑战。, 未来智能城市的建设趋势越加明显。), (股票市场今日大涨投资者乐观。, 持续上涨的市场让投资者感到满意。) ] messages [ {role: system, content: f你帮我完成文本匹配我给你2个句子被[]包围你判断它们是否匹配回答是或不是请参考如下示例}, ] for key,value in examples_data.items(): for i in value: messages.append( {role:user,content: f句子1[{i[0]}]句子2[{i[1]}]} ), messages.append( {role:assistant,content: key} ) for q in questions: response client.chat.completions.create( modelqwen3-max, messagesmessages[{role:user,content: f句子1[{q[0]}]句子2[{q[1]}]}] ) print(response.choices[0].message.content)