PyCharm中AI插件实战,使用例子“RAG检索融合“

1、先试的AI Chat中添加AI Assistant

折腾了好一会儿,发现用不了。

2、搜了资料,可以安装Jetbrains AI Assistant,deepseek插件,但是也是不好用。

后面安装了qoder插件,发现挺好用的。

python代码如下:

复制代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import os
from langchain_chroma import Chroma
from base_llm import llm, embeddings_model
from langchain_core.output_parsers import StrOutputParser
from langchain_classic import hub

# from langsmith import Client
from langchain_core.load import dumps, loads


texts = [
    "人工智能在医疗诊断中的应用。",
    "人工智能如何提升供应链效率。",
    "NBA季后赛最新赛况分析。",
    "传统法式烘焙的五大技巧。",
    "红楼梦人物关系图谱分析。",
    "人工智能在金融风险管理中的应用。",
    "人工智能如何影响未来就业市场。",
    "人工智能在制造业的应用。",
    "今天天气怎么样",
    "人工智能伦理:公平性与透明度。"
]

# 创建向量数据库对象
vectorstore = Chroma.from_texts(
    texts=texts, embedding=embeddings_model
)
retriever = vectorstore.as_retriever()

prompt = hub.pull("langchain-ai/rag-fusion-query-generation", dangerously_pull_public_prompt=True)
# client = Client()
# prompt = client.pull_prompt("langchain-ai/rag-fusion-query-generation", dangerously_pull_public_prompt=True)



print(prompt)

# 创建多重查询chain
generate_queries = (
        prompt | llm | StrOutputParser() | (lambda x: x.split("\n"))
)

original_query = "人工智能的应用"
queries = generate_queries.invoke({"original_query": original_query})


print('--------------问题检索到的内容-------------')
print(queries)
print('--------------循环开始-------------')
# 我们检索到的内容的位置是不一样的, 需要给查询到的数据进行融合重排
for i in queries:
    print(retriever.invoke(i))
print('--------------循环结束-------------')


def reciprocal_rank_fusion(results: list[list], k=60):
    """互逆排序融合算法,用于合并多个排序文档列表
    Args:
        results: 包含多个排序文档列表的二维列表
        k: 融合公式中的平滑参数(默认60),值越小排名影响越大
    Returns:
        按融合分数降序排列的文档列表,每个元素为(文档对象, 分数)元组
    """

    # 初始化融合分数字典(key=序列化文档,value=累计分数)
    fused_scores = {}

    # 遍历每个检索结果列表(每个查询对应的结果)
    for docs in results:
        # 对当前结果列表中的文档进行遍历(rank从0开始计算)
        for rank, doc in enumerate(docs):
            # 序列化文档对象为字符串(用于唯一标识)
            doc_str = dumps(doc)
            # 初始化文档得分(如果是首次出现)
            if doc_str not in fused_scores:
                fused_scores[doc_str] = 0
            # 计算并累加RRF分数:1 / (当前排名 + k)
            # 排名越靠前(rank值小)的文档获得的分数越高
            fused_scores[doc_str] += 1 / (rank + k)

    # 按融合分数降序排序(分数越高排名越前)
    sorted_Data = sorted(fused_scores.items(), key=lambda x: x[1], reverse=True)
    # print(sorted_Data)
    reranked_results = [
        (loads(doc), score)  for doc, score in sorted_Data
    ]

    return reranked_results




print('--------------问题融合后的内容-------------')
original_query = "人工智能的应用"
chain = generate_queries | retriever.map() | reciprocal_rank_fusion


# 输入结果列表
result_list = chain.invoke({"original_query": original_query})
print(result_list)
print('--------------融合后的循环开始-------------')
# 提取文档内容和对应分数
for i in result_list:
    print(i[0].page_content, i[1])

执行报错了,报错内容如下:

复制代码
C:\Users\lenovo\PycharmProjects\PythonProject\.venv\Scripts\python.exe C:\Users\lenovo\PycharmProjects\PythonProject\rag\day08\05-检索融合.py 
C:\Users\lenovo\PycharmProjects\PythonProject\.venv\Lib\site-packages\langchain_core\utils\pydantic.py:41: UserWarning: Core Pydantic V1 functionality isn't compatible with Python 3.14 or greater.
  from pydantic.v1 import BaseModel as BaseModelV1
Loading weights: 100%|██████████| 199/199 [00:00<00:00, 65162.50it/s]
C:\Users\lenovo\PycharmProjects\PythonProject\rag\day08\05-检索融合.py:33: LangChainDeprecationWarning: langchain_classic.hub.pull is deprecated. Use the LangSmith SDK instead.
  prompt = hub.pull("langchain-ai/rag-fusion-query-generation")
Traceback (most recent call last):
  File "C:\Users\lenovo\PycharmProjects\PythonProject\rag\day08\05-检索融合.py", line 33, in <module>
    prompt = hub.pull("langchain-ai/rag-fusion-query-generation")
  File "C:\Users\lenovo\PycharmProjects\PythonProject\.venv\Lib\site-packages\langchain_core\_api\deprecation.py", line 225, in warning_emitting_wrapper
    return wrapped(*args, **kwargs)
  File "C:\Users\lenovo\PycharmProjects\PythonProject\.venv\Lib\site-packages\langchain_classic\hub.py", line 117, in pull
    return client.pull_prompt(owner_repo_commit, include_model=include_model)
           ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\lenovo\PycharmProjects\PythonProject\.venv\Lib\site-packages\langsmith\client.py", line 9445, in pull_prompt
    prompt_object = self.pull_prompt_commit(
        prompt_identifier,
    ...<2 lines>...
        dangerously_pull_public_prompt=dangerously_pull_public_prompt,
    )
  File "C:\Users\lenovo\PycharmProjects\PythonProject\.venv\Lib\site-packages\langsmith\client.py", line 9293, in pull_prompt_commit
    _validate_public_prompt_pull(
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        prompt_identifier,
        ^^^^^^^^^^^^^^^^^^
        dangerously_pull_public_prompt=dangerously_pull_public_prompt,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "C:\Users\lenovo\PycharmProjects\PythonProject\.venv\Lib\site-packages\langsmith\client.py", line 370, in _validate_public_prompt_pull
    raise ValueError(
    ...<4 lines>...
    )
ValueError: Pulling a public prompt by owner/name is disabled by default because prompts may contain untrusted serialized LangChain objects. If you trust this prompt, set `dangerously_pull_public_prompt=True` to acknowledge the risk.

使用qoder插件,把错误内容粘贴到对话框,请求处理

试了2次解决方案,最终搞定了

代码如下:

复制代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import os
from langchain_chroma import Chroma
from base_llm import llm, embeddings_model
from langchain_core.output_parsers import StrOutputParser
# from langchain_classic import hub

from langsmith import Client
from langchain_core.load import dumps, loads


texts = [
    "人工智能在医疗诊断中的应用。",
    "人工智能如何提升供应链效率。",
    "NBA季后赛最新赛况分析。",
    "传统法式烘焙的五大技巧。",
    "红楼梦人物关系图谱分析。",
    "人工智能在金融风险管理中的应用。",
    "人工智能如何影响未来就业市场。",
    "人工智能在制造业的应用。",
    "今天天气怎么样",
    "人工智能伦理:公平性与透明度。"
]

# 创建向量数据库对象
vectorstore = Chroma.from_texts(
    texts=texts, embedding=embeddings_model
)
retriever = vectorstore.as_retriever()

# prompt = hub.pull("langchain-ai/rag-fusion-query-generation")
client = Client()
prompt = client.pull_prompt("langchain-ai/rag-fusion-query-generation", dangerously_pull_public_prompt=True)



print(prompt)

# 创建多重查询chain
generate_queries = (
        prompt | llm | StrOutputParser() | (lambda x: x.split("\n"))
)

original_query = "人工智能的应用"
queries = generate_queries.invoke({"original_query": original_query})


print('--------------问题检索到的内容-------------')
print(queries)
print('--------------循环开始-------------')
# 我们检索到的内容的位置是不一样的, 需要给查询到的数据进行融合重排
for i in queries:
    print(retriever.invoke(i))
print('--------------循环结束-------------')


def reciprocal_rank_fusion(results: list[list], k=60):
    """互逆排序融合算法,用于合并多个排序文档列表
    Args:
        results: 包含多个排序文档列表的二维列表
        k: 融合公式中的平滑参数(默认60),值越小排名影响越大
    Returns:
        按融合分数降序排列的文档列表,每个元素为(文档对象, 分数)元组
    """

    # 初始化融合分数字典(key=序列化文档,value=累计分数)
    fused_scores = {}

    # 遍历每个检索结果列表(每个查询对应的结果)
    for docs in results:
        # 对当前结果列表中的文档进行遍历(rank从0开始计算)
        for rank, doc in enumerate(docs):
            # 序列化文档对象为字符串(用于唯一标识)
            doc_str = dumps(doc)
            # 初始化文档得分(如果是首次出现)
            if doc_str not in fused_scores:
                fused_scores[doc_str] = 0
            # 计算并累加RRF分数:1 / (当前排名 + k)
            # 排名越靠前(rank值小)的文档获得的分数越高
            fused_scores[doc_str] += 1 / (rank + k)

    # 按融合分数降序排序(分数越高排名越前)
    sorted_Data = sorted(fused_scores.items(), key=lambda x: x[1], reverse=True)
    # print(sorted_Data)
    reranked_results = [
        (loads(doc), score)  for doc, score in sorted_Data
    ]

    return reranked_results




print('--------------问题融合后的内容-------------')
original_query = "人工智能的应用"
chain = generate_queries | retriever.map() | reciprocal_rank_fusion


# 输入结果列表
result_list = chain.invoke({"original_query": original_query})
print(result_list)
print('--------------融合后的循环开始-------------')
# 提取文档内容和对应分数
for i in result_list:
    print(i[0].page_content, i[1])

控制台打印如下:

复制代码
C:\Users\lenovo\PycharmProjects\PythonProject\.venv\Scripts\python.exe C:\Users\lenovo\PycharmProjects\PythonProject\rag\day08\05-检索融合.py 
C:\Users\lenovo\PycharmProjects\PythonProject\.venv\Lib\site-packages\langchain_core\utils\pydantic.py:41: UserWarning: Core Pydantic V1 functionality isn't compatible with Python 3.14 or greater.
  from pydantic.v1 import BaseModel as BaseModelV1
Loading weights: 100%|██████████| 199/199 [00:00<00:00, 64318.91it/s]
input_variables=['original_query'] input_types={} partial_variables={} metadata={'lc_hub_owner': 'langchain-ai', 'lc_hub_repo': 'rag-fusion-query-generation', 'lc_hub_commit_hash': '478b448e096b977446865108fad34282e6e1a84ae8b8540572ed0df238229a11'} messages=[SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=[], input_types={}, partial_variables={}, template='You are a helpful assistant that generates multiple search queries based on a single input query.'), additional_kwargs={}), HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['original_query'], input_types={}, partial_variables={}, template='Generate multiple search queries related to: {original_query}'), additional_kwargs={}), HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=[], input_types={}, partial_variables={}, template='OUTPUT (4 queries):'), additional_kwargs={})]
--------------问题检索到的内容-------------
['1. 人工智能在日常生活中的应用场景', '2. 人工智能在医疗和金融领域的应用案例', '3. 生成式人工智能的实际商业应用', '4. 人工智能应用的未来发展趋势与挑战']
--------------循环开始-------------
[Document(id='71aa62c0-c01d-479b-9e53-654d07ee466f', metadata={}, page_content='人工智能在制造业的应用。'), Document(id='627f82c4-1509-4771-85c4-51f0ebe84991', metadata={}, page_content='人工智能在金融风险管理中的应用。'), Document(id='b31bb834-5523-437b-bca6-b85a0dd52714', metadata={}, page_content='人工智能在医疗诊断中的应用。'), Document(id='c42af290-6446-4235-b389-eb4dafe966e2', metadata={}, page_content='人工智能如何影响未来就业市场。')]
[Document(id='627f82c4-1509-4771-85c4-51f0ebe84991', metadata={}, page_content='人工智能在金融风险管理中的应用。'), Document(id='b31bb834-5523-437b-bca6-b85a0dd52714', metadata={}, page_content='人工智能在医疗诊断中的应用。'), Document(id='71aa62c0-c01d-479b-9e53-654d07ee466f', metadata={}, page_content='人工智能在制造业的应用。'), Document(id='c42af290-6446-4235-b389-eb4dafe966e2', metadata={}, page_content='人工智能如何影响未来就业市场。')]
[Document(id='71aa62c0-c01d-479b-9e53-654d07ee466f', metadata={}, page_content='人工智能在制造业的应用。'), Document(id='4f1b555a-711d-46b2-b96e-bda8fb61c463', metadata={}, page_content='人工智能如何提升供应链效率。'), Document(id='627f82c4-1509-4771-85c4-51f0ebe84991', metadata={}, page_content='人工智能在金融风险管理中的应用。'), Document(id='c42af290-6446-4235-b389-eb4dafe966e2', metadata={}, page_content='人工智能如何影响未来就业市场。')]
[Document(id='c42af290-6446-4235-b389-eb4dafe966e2', metadata={}, page_content='人工智能如何影响未来就业市场。'), Document(id='4f1b555a-711d-46b2-b96e-bda8fb61c463', metadata={}, page_content='人工智能如何提升供应链效率。'), Document(id='627f82c4-1509-4771-85c4-51f0ebe84991', metadata={}, page_content='人工智能在金融风险管理中的应用。'), Document(id='71aa62c0-c01d-479b-9e53-654d07ee466f', metadata={}, page_content='人工智能在制造业的应用。')]
--------------循环结束-------------
--------------问题融合后的内容-------------
C:\Users\lenovo\PycharmProjects\PythonProject\rag\day08\05-检索融合.py:88: LangChainBetaWarning: The function `loads` is in beta. It is actively being worked on, so the API may change.
  (loads(doc), score)  for doc, score in sorted_Data
C:\Users\lenovo\PycharmProjects\PythonProject\rag\day08\05-检索融合.py:88: LangChainPendingDeprecationWarning: The default value of `allowed_objects` will change in a future version. Pass an explicit list of allowed classes (or 'messages' for untrusted input that contains only chat messages) to suppress this warning.
  (loads(doc), score)  for doc, score in sorted_Data
[(Document(id='71aa62c0-c01d-479b-9e53-654d07ee466f', metadata={}, page_content='人工智能在制造业的应用。'), 0.06612903225806452), (Document(id='627f82c4-1509-4771-85c4-51f0ebe84991', metadata={}, page_content='人工智能在金融风险管理中的应用。'), 0.06453291699193339), (Document(id='c42af290-6446-4235-b389-eb4dafe966e2', metadata={}, page_content='人工智能如何影响未来就业市场。'), 0.048651507139079855), (Document(id='4f1b555a-711d-46b2-b96e-bda8fb61c463', metadata={}, page_content='人工智能如何提升供应链效率。'), 0.04813947436898257), (Document(id='b31bb834-5523-437b-bca6-b85a0dd52714', metadata={}, page_content='人工智能在医疗诊断中的应用。'), 0.03279569892473118)]
--------------融合后的循环开始-------------
人工智能在制造业的应用。 0.06612903225806452
人工智能在金融风险管理中的应用。 0.06453291699193339
人工智能如何影响未来就业市场。 0.048651507139079855
人工智能如何提升供应链效率。 0.04813947436898257
人工智能在医疗诊断中的应用。 0.03279569892473118

Process finished with exit code 0

但是要先登录,

登录成功截图:

相关推荐
砚底藏山河2 小时前
【量化纯GET实战 #04】批量快照:一次 HTTP GET 取多只股票
java·python·金融·eclipse
烂蜻蜓2 小时前
Flask入门教程(九):模板渲染——用Jinja2构建动态页面
后端·python·flask
乱世刀疤2 小时前
Claude Code系统级命令全解析
人工智能·claude code
Funny_AI_LAB2 小时前
Sparrow-2:超越轮流发言,迈向全场景对话理解
人工智能·语言模型·语音识别·实时音视频
2601_966871402 小时前
AE影视后期特效-遮罩/调色/抠像/MG动画/3D/Vlog制作(完结)jzit
python
科技看点3 小时前
电脑重复操作一键自动化怎么办?天禧AI4.2从操作入口做“减法”
人工智能·电脑
我是大AI3 小时前
从RAG架构到GEO:品牌AI可见性监测的技术实践与行业解决方案
人工智能·架构
hiahiahia1233 小时前
从浏览器点击“发送”,请求是怎么到服务器的?
人工智能
AI科技先锋报3 小时前
如何为陪伴机器人搭建自然的对话式 AI?技术链路与声网方案怎么选?
人工智能·机器人·语音识别
circuitsosk3 小时前
大模型本体安全防护实践:提示词注入防御、输出合规过滤与敏感信息脱敏
python·安全·数据脱敏·纵深防御·提示词注入·llmsecurity