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

但是要先登录,

登录成功截图:

相关推荐
苏灿烤鱼1 小时前
AI 论文档案库|大模型与 Agent 周报
人工智能·agent
workflower1 小时前
全球云计算产业发展态势-市场:云计算规模保持稳步增长,产业格局日趋明晰
人工智能·深度学习·机器学习·设计模式·机器人·云计算
北方的银狐-Zero1 小时前
国内大厂都在吹的“本体产品“,到底假在哪儿?
人工智能·ai编程·本体论
小猴子爱上树1 小时前
跨马翻译:批量图片翻译与视频字幕工具,跨境电商高效助手
python·音视频
2501_909509101 小时前
DAY 42
python
lincats1 小时前
智能体工程 vs 软件工程:计算机系那套课程,还能适应 AI 时代吗?
人工智能·软件工程·原型模式·vibecoding·claudecode·grillme
数字化转型分享点滴1 小时前
聚焦机加工MES系统:四化信息科技以服务数字化转型
大数据·人工智能·python·科技
123_不打狼1 小时前
ANI与AGI
人工智能·agi·ani
独隅1 小时前
MCP 协议开发实战:从零搭建无状态 AI Agent 服务器
运维·服务器·人工智能