备忘: 使用langchain结合千问大模型,用本地知识库辅助AI生成代码

news2024/12/24 21:14:33

本文主要是寻求解决把预先准备的文字需求转换为代码的方法
主要思路: 把某一类文字需求储存到本地知识库,使得用户输入需求目标,然后程序自动从知识库抽取相关需求,然后转发给在线的大模型形成代码。
工具:
本地在库用的向量持久化工具: ES 7.9
本地库提取所需的预训练模型: 抱脸虫HuggingFaceEmbeddings的paraphrase-multilingual-MiniLM-L12-v2
在线大模型还是选qwen-max

本地知识库的建设,不再赘述,参考之前的文章: 备忘,LangChain建立本地知识库的几个要点
包括参考资料 LangChain结合通义千问的自建知识库

由于需要用到流式输出(streaming=true),需要解决langchain整合qwen大模型关于流式输出的bug,可以参考 通义千问自己的例子
以及相关链接: https://github.com/langchain-ai/langchain/pull/16605

我选的解决方案:
在这里插入图片描述
本地库的设计:
参考akshare库的股票数据文档 AKShare股票数据

选了4个接口: stock_sse_summary,stock_individual_info_em , stock_zh_a_spot_em, stock_zh_a_hist 补充简单逻辑、入参和出参,完成本地知识库的akshareKnowledge.txt文件

获得上海证券交易所股票数据总貌,包括项目、股票、科创版、主板,可以使用akshare库的stock_sse_summary接口,无入参,返回最近交易日的股票数据总貌,包括流通股本、总市值、平均市盈率、上市公司、上市股票、流通市值、报告时间、总股本,返回字段使用中文,最后用print方法打印行情,代码格式为python...(行分隔符)
获得股票个股信息,包括总市值、流通市值、行业、上市时间、股票代码、股票简称、总股本、流通股,可以使用akshare库的stock_individual_info_em接口按股票代码查询,获得相关股票个股信息,返回字段使用中文,最后用print方法打印行情,代码格式为python...(行分隔符)
获取股票最新价格、最新成交量、最新涨跌幅、最新换手率,可以使用akshare库的stock_zh_a_spot_em接口获取全市场行情,无入参,再按股票名称或者股票代码过滤获得信息,返回字段使用中文,最后用print方法打印行情,代码格式为python...(行分隔符)
获得股票历史行情,包括指定交易日的最高价、最低价、开盘价、收盘价、成交量、涨跌幅、换手率,可以使用akshare库,按stock_zh_a_hist接口按股票代码,获取指定日线数据,startdate和enddate,以及指定前复权,获得日线数据,返回字段使用中文,最后用print方法打印行情,代码格式为python...
(行分隔符)

代码分为两部分
1 建本地库

import ...

from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import ElasticVectorSearch


# 自定义切分
class Document:
    def __init__(self, text):
        self.page_content = text
        self.metadata = {'source': 'Own'}


time_list = []
t = time.time()

base_file = '/home/cfets/AI/textwarefare/akshareKnowledge.txt'
# base_file = '/home/cfets/AI/textwarefare/cff.txt'
my_index = "es_akshare-api-new"

with open(base_file, 'r', encoding='utf-8') as file:
    lines = file.readlines()
split_docs = [Document(line.strip()) for line in lines]

model_name = r"/home/cfets/AI/model/paraphrase-multilingual-MiniLM-L12-v2"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': False}

embeddings = HuggingFaceEmbeddings(
    model_name=model_name,
    model_kwargs=model_kwargs,
    encode_kwargs=encode_kwargs)

# 使用ES
db = ElasticVectorSearch.from_documents(
    split_docs,
    embeddings,
    elasticsearch_url="http://localhost:9200",
    index_name=my_index
)
print(db.client.info())

注意这里是按行切分

ES本地库的索引如下在这里插入图片描述
应用本地库的部分

from langchain_community.llms import Tongyi
import os
import dashscope
from langchain.prompts import PromptTemplate
from langchain_community.vectorstores import ElasticVectorSearch
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings

dashscope.api_key = xxx...

CONTEXT_QA_TMPL = """
下面的信息({summary_prompt})是否有这个问题({message})有关,
如果你觉得无关请告诉我无法根据提供的上下文回答'{message}'这个问题,简要回答即可,
否则请根据{summary_prompt}对{message}的问题进行回答
"""

CONTEXT_QA_PROMPT = PromptTemplate(
    input_variables=["summary_prompt", "message"],
    template=CONTEXT_QA_TMPL,
)

if __name__ == '__main__':
    os.environ["DASHSCOPE_API_KEY"] = dashscope.api_key
    llm = Tongyi(model_name="qwen-max", streaming=True, temperature=0)

    # 引入模型
    model_name = r"/home/cfets/AI/model/paraphrase-multilingual-MiniLM-L12-v2"
    model_kwargs = {'device': 'cpu'}
    encode_kwargs = {'normalize_embeddings': False}

    embeddings = HuggingFaceEmbeddings(
        model_name=model_name,
        model_kwargs=model_kwargs,
        encode_kwargs=encode_kwargs
    )

    # 使用elastic search
    my_index = "es_akshare-api-new"

    # 本地库
    db = ElasticVectorSearch(
        embedding=embeddings,
        elasticsearch_url="http://localhost:9200",
        index_name=my_index,
    )

    while True:
        try:
            user_input = input("请输入您的问题:")
            similarDocs = db.similarity_search(user_input, k=2)
            summary_prompt = "".join([doc.page_content for doc in similarDocs])  # 找到最接近的描述doc
            # print('summary_prompt:: %s' % summary_prompt)

            prompt = CONTEXT_QA_PROMPT.format(summary_prompt=summary_prompt, message=user_input)
            print('prompt::', prompt)
            print('\n')

            print('answer::', llm(prompt))
            print('\n')

        except KeyboardInterrupt:
            break

需要说明的是,之前的文章中利用了向量相似度的做法判断本地知识库是否准确,但是相似度的值很难把握,这里换了个做法,利用大模型本身的比较成熟判断,直接询问大模型,已经找到的本地知识(本文因为知识库较小,要求最相似的2条知识即可)和需要解决的问题是否相关,如果相关,则按本地知识库给出解释,如果不相关则由大模型给出回答,相关问题模板,参考CONTEXT_QA_TMPL和CONTEXT_QA_PROMPT

我们看运行结果:
问题1: 给出获取A股股票最新市场价的代码

请输入您的问题:给出获取A股股票最新市场价的代码
prompt:: 
下面的信息(获取股票最新价格、最新成交量、最新涨跌幅、最新换手率,可以使用akshare库的stock_zh_a_spot_em接口获取全市场行情,无入参,再按股票名称或者股票代码过滤获得信息,返回字段使用中文,最后用print方法打印行情,代码格式为```python...```获得股票历史行情,包括指定交易日的最高价、最低价、开盘价、收盘价、成交量、涨跌幅、换手率,可以使用akshare库,按stock_zh_a_hist接口按股票代码,获取指定日线数据,startdate和enddate,以及指定前复权,获得日线数据,返回字段使用中文,最后用print方法打印行情,代码格式为```python...```)是否有这个问题(给出获取A股股票最新市场价的代码)有关,
如果你觉得无关请告诉我无法根据提供的上下文回答'给出获取A股股票最新市场价的代码'这个问题,简要回答即可,
否则请根据获取股票最新价格、最新成交量、最新涨跌幅、最新换手率,可以使用akshare库的stock_zh_a_spot_em接口获取全市场行情,无入参,再按股票名称或者股票代码过滤获得信息,返回字段使用中文,最后用print方法打印行情,代码格式为```python...```获得股票历史行情,包括指定交易日的最高价、最低价、开盘价、收盘价、成交量、涨跌幅、换手率,可以使用akshare库,按stock_zh_a_hist接口按股票代码,获取指定日线数据,startdate和enddate,以及指定前复权,获得日线数据,返回字段使用中文,最后用print方法打印行情,代码格式为```python...```对给出获取A股股票最新市场价的代码的问题进行回答



/home/cfets/.local/lib/python3.10/site-packages/langchain_core/_api/deprecation.py:117: LangChainDeprecationWarning: The function `__call__` was deprecated in LangChain 0.1.7 and will be removed in 0.2.0. Use invoke instead.
  warn_deprecated(
answer:: 有关。根据提供的上下文,我可以给出获取A股股票最新市场价的代码示例:

```python
import akshare as ak

# 获取全市场A股实时行情
stock_spot_df = ak.stock_zh_a_spot_em()

# 假设我们要查询股票代码为"600519"(贵州茅台)的最新市场价
stock_code = "600519"
stock_info = stock_spot_df[stock_spot_df["股票代码"] == stock_code]

# 打印股票名称和最新市场价
if not stock_info.empty:
    print(f"{stock_info['股票名称'].values[0]}的最新市场价为:{stock_info['最新价'].values[0]}元")
else:
    print("未找到该股票信息")

这段代码首先使用akshare库的stock_zh_a_spot_em接口获取了全市场的A股实时行情,然后通过股票代码筛选出特定股票的信息,并打印出该股票的最新市场价。

解释一下过程,我在代码中把提示模板prompt打印出来,可以看到代码获取了本地库的两个最接近的接口 stock_zh_a_spot_em 和 stock_zh_a_hist 以及相关逻辑,然后判断stock_zh_a_spot_em相关的逻辑与问题有关 再用stock_zh_a_spot_em相关逻辑 生成代码,这个代码还是相对靠谱

问题2 获得上海证交所最新股票数据的代码

请输入您的问题:获得上海证交所最新股票数据的代码
prompt:: 
下面的信息(获得上海证券交易所股票数据总貌,包括项目、股票、科创版、主板,可以使用akshare库的stock_sse_summary接口,无入参,返回最近交易日的股票数据总貌,包括流通股本、总市值、平均市盈率、上市公司、上市股票、流通市值、报告时间、总股本,返回字段使用中文,最后用print方法打印行情,代码格式为```python...```获得股票个股信息,包括总市值、流通市值、行业、上市时间、股票代码、股票简称、总股本、流通股,可以使用akshare库的stock_individual_info_em接口按股票代码查询,获得相关股票个股信息,返回字段使用中文,最后用print方法打印行情,代码格式为```python...```)是否有这个问题(获得上海证交所最新股票数据的代码)有关,
如果你觉得无关请告诉我无法根据提供的上下文回答'获得上海证交所最新股票数据的代码'这个问题,简要回答即可,
否则请根据获得上海证券交易所股票数据总貌,包括项目、股票、科创版、主板,可以使用akshare库的stock_sse_summary接口,无入参,返回最近交易日的股票数据总貌,包括流通股本、总市值、平均市盈率、上市公司、上市股票、流通市值、报告时间、总股本,返回字段使用中文,最后用print方法打印行情,代码格式为```python...```获得股票个股信息,包括总市值、流通市值、行业、上市时间、股票代码、股票简称、总股本、流通股,可以使用akshare库的stock_individual_info_em接口按股票代码查询,获得相关股票个股信息,返回字段使用中文,最后用print方法打印行情,代码格式为```python...```对获得上海证交所最新股票数据的代码的问题进行回答



answer:: 有关。根据提供的上下文,可以构建获取上海证券交易所最新股票数据的代码示例。这里分为两部分:第一部分是获取股票数据总貌,第二部分是获取股票个股信息。以下是相应的Python代码示例:

### 获取上海证券交易所股票数据总貌

```python
import akshare as ak

# 使用stock_sse_summary接口获取上交所股票数据总貌
stock_summary_df = ak.stock_sse_summary()
print("上海证券交易所股票数据总貌:")
print(stock_summary_df)

获取股票个股信息

# 假设我们查询股票代码为"600000"的股票信息
stock_code = "600000"

# 使用stock_individual_info_em接口按股票代码查询
individual_stock_info_df = ak.stock_individual_info_em(stock_code)
print(f"{stock_code} 的股票个股信息:")
print(individual_stock_info_df)

这段代码首先导入了akshare库,并使用了stock_sse_summary接口来获取上海证券交易所的股票数据总貌,然后展示了包含流通股本、总市值等信息的数据框。接着,通过指定一个股票代码(例如"600000"),利用stock_individual_info_em接口获取该股票的详细信息,包括总市值、流通市值等行业相关数据,并打印出来。这正好满足了提出的需求。



生成的代码第一段ak.stock_sse_summary() 比较靠谱,后一段稍微超出了预期,可以修正参数后使用,也可以选择不使用


基本达到了依赖本地库辅助AI生成代码的目标

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1643652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【UnityRPG游戏制作】Unity_RPG项目_玩法相关

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:就业…

jvm 马士兵 01 JVM简介,class文件结构

01.JVM是什么 JVM是一个跨平台的标准 JVM只识别class文件,符合JVM规范的class文件都可以被识别 u1 是一个字节 u2是两个字节

正则表达式_字符匹配/可选字符集

正则表达式(Regular Expression)也叫匹配模式(Pattern),用来检验字符串是否满足特 定规则,或从字符串中捕获满足特定规则的子串。 字符匹配 最简单的正则表达式由“普通字符”和“通配符”组成。比如“Room\d\d\d”就这样 的正则…

1.pytorch加载收数据(B站小土堆)

数据的加载主要有两个函数: 1.dataset整体收集数据:提供一种方法去获取数据及其label,告诉我们一共有多少数据(就是自开始把要的数据和标签都收进来) 2.dataloader,后面传入模型时候,每次录入数…

C++类定义时成员变量初始化

在C11中允许在类定义时对成员变量初始化。 class A { public:A() { }void show(){cout << "m_a " << m_a << endl;cout << "m_b " << m_b << endl;} private:int m_a 10;//类定义时初始化int m_b; //没有初始化…

2024阿里云ctf-web-chain17学习

agent jdk17依赖有h2思路清晰打jdbc attack <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.aliba…

踏春正当时!VELO Prevail Ride带你探索多元骑行潮流体验~

嘿&#xff0c;朋友&#xff01;踏春正当时嘞&#xff01;在这个追求个性化与多元化的新时代&#xff0c;骑行爱好者们也开始寻找能适应各种骑行场景的理想坐垫。从悠闲自在的日常通勤&#xff0c;到热血沸腾的公路竞速&#xff0c;再到勇攀高峰的山地探险&#xff0c;维乐VELO…

更深层次理解传输层两协议【UDP | TCP】【UDP 缓冲区 | TCP 8种策略 | 三次握手四次挥手】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 再谈端口号 端口号的返回…

C语言-整体内容简单的认识

目录 一、数据类型的介绍二、数据的变量和常量三、变量的作用域和生命周期四、字符串五、转义字符六、操作符六、常见的关键字6.1 关键字static 七、内存分配八、结构体九、指针 一、数据类型的介绍 sizeof是一个操作符&#xff0c;是计算机类型/变量所占内存空间的大小   sc…

AEC Capital Limited:开启可持续金融新纪元

在当今社会&#xff0c;环保和可持续发展已成为全球关注的焦点。在这个背景下&#xff0c;AEC Capital Limited作为香港的一家金融服务公司&#xff0c;以其专业、高端的服务和创新的理念&#xff0c;成为可持续金融领域的引领者。我们致力于将环境保护与金融服务相结合&#x…

设计模式之拦截过滤器模式

想象一下&#xff0c;在你的Java应用里&#xff0c;每个请求就像一场冒险旅程&#xff0c;途中需要经过层层安检和特殊处理。这时候&#xff0c;拦截过滤器模式就化身为你最可靠的特工团队&#xff0c;悄无声息地为每一个请求保驾护航&#xff0c;确保它们安全、高效地到达目的…

触动精灵纯本地离线文字识别插件

目的 触动精灵是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务&#xff0c;节省大量人工操作的时间。但触动精灵的图色功能比较单一&#xff0c;无法识别屏幕上的图像&#xff0c;根据图像的变化自动执行相应的操作。本篇文章主要讲解…

C语言二分查找的区间问题

概念 什么是二分查找呢&#xff1f; 二分查找&#xff1a;在有序数组中查找某一特定元素的搜索算法。 二分查找又称折半查找&#xff0c;通过将数组折半&#xff0c;用中间值和查找值作比较&#xff0c;多次使用&#xff0c;直到找到要查找的值。 注意:二分查找的前提是&#…

内核workqueue框架

workqueue驱动的底半部实现方式之一就是工作队列&#xff0c;作为内核的标准模块&#xff0c;它的使用接口也非常简单&#xff0c;schedule_work或者指定派生到哪个cpu的schedule_work_on。 还有部分场景会使用自定义的workqueue&#xff0c;这种情况会直接调用queue_work和qu…

JavaScript的操作符运算符

前言&#xff1a; JavaScript的运算符与C/C一致 算数运算符&#xff1a; 算数运算符说明加-减*乘%除/取余 递增递减运算符&#xff1a; 运算符说明递增1-- 递减1 补充&#xff1a; 令a1&#xff0c;b1 运算a b ab12ab22ab--10a--b00 比较(关系)运算符&#xff1a; 运算…

服务器端集群优化-集群还是主从

7、服务器端集群优化-集群还是主从 集群虽然具备高可用特性&#xff0c;能实现自动故障恢复&#xff0c;但是如果使用不当&#xff0c;也会存在一些问题&#xff1a; 集群完整性问题集群带宽问题数据倾斜问题客户端性能问题命令的集群兼容性问题lua和事务问题 问题1、在Redi…

[Spring Cloud] (6)gateway整体加解密

文章目录 简述整体效果后端增加配置nacos增加配置GlobalConfig 添加请求整体解密拦截器DecryptionFilter添加响应整体解密拦截器EncryptionFilter 前端请求拦截器添加整体加密逻辑请求头中添加sessionId 响应拦截器添加整体解密逻辑 简述 本文网关gateway&#xff0c;微服务&a…

VsCode插件 -- Power Mode

一、安装插件 1. 首先在扩展市场里搜索 Power Mode 插件&#xff0c;如下图 二、配置插件 设置 点击小齿轮 打上勾 就可以了 第二种设置方法 1. 安装完成之后&#xff0c;使用快捷键 Ctrl Shift P 打开命令面板&#xff0c;在命令行中输入 settings.json &#xff0c; 选择首…

扩展学习|结合故事的力量和数字的力量:混合方法研究和混合研究综述

文献来源&#xff1a;Pluye, Pierre, and Quan Nha Hong. "Combining the power of stories and the power of numbers: mixed methods research and mixed studies reviews." Annual review of public health 35 (2014): 29-45. 文献获取&#xff1a;链接&#xff1…

【机器视觉】yolo-world-opencvsharp-.net4.8 C# 窗体应用程序

这段代码是基于 OpenCvSharp, OpenVinoSharp 和 .NET Framework 4.8 的 Windows Forms 应用程序。其主要目的是加载和编译机器学习模型&#xff0c;对输入数据进行推理&#xff0c;并显示结果。 下面是该程序的主要功能和方法的详细总结&#xff1a; 初始化 OpenVINO 运行时核心…